diff --git a/.air.toml b/.air.toml index af182697fb..65872e7382 100644 --- a/.air.toml +++ b/.air.toml @@ -11,7 +11,7 @@ include_file = ["main.go"] include_dir = ["cmd", "models", "modules", "options", "routers", "services"] exclude_dir = [ "models/fixtures", - "models/migrations/fixtures", + "models/gitea_migrations/fixtures", "modules/avatar/identicon/testdata", "modules/avatar/testdata", "modules/git/tests", diff --git a/.deadcode-out b/.deadcode-out index 1454f2a6c5..9c7176e7b1 100644 --- a/.deadcode-out +++ b/.deadcode-out @@ -18,9 +18,11 @@ forgejo.org/models/auth forgejo.org/models/db TruncateBeans + TruncateBeansCascade InTransaction DumpTables GetTableNames + extendBeansForCascade forgejo.org/models/dbfs file.renameTo @@ -32,6 +34,9 @@ forgejo.org/models/forgejo/semver SetVersionString SetVersion +forgejo.org/models/forgejo_migrations + resetMigrations + forgejo.org/models/git RemoveDeletedBranchByID diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 3f250e5682..72fb06c69a 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,6 @@ { "name": "Gitea DevContainer", - "image": "mcr.microsoft.com/devcontainers/go:1.24-bullseye", + "image": "mcr.microsoft.com/devcontainers/go:2.0-bullseye", "features": { // installs nodejs into container "ghcr.io/devcontainers/features/node:1": { diff --git a/.forgejo/workflows-composite/setup-cache-go/action.yaml b/.forgejo/workflows-composite/setup-cache-go/action.yaml index f2818a7635..fec166fc35 100644 --- a/.forgejo/workflows-composite/setup-cache-go/action.yaml +++ b/.forgejo/workflows-composite/setup-cache-go/action.yaml @@ -17,7 +17,7 @@ runs: apt-get -q install -qq -y zstd - name: "Set up Go using setup-go" - uses: https://data.forgejo.org/actions/setup-go@v5 + uses: https://data.forgejo.org/actions/setup-go@v6 id: go-version with: go-version-file: "go.mod" diff --git a/.forgejo/workflows/build-release-integration.yml b/.forgejo/workflows/build-release-integration.yml index f5aa059fcf..bb11f083ba 100644 --- a/.forgejo/workflows/build-release-integration.yml +++ b/.forgejo/workflows/build-release-integration.yml @@ -25,7 +25,7 @@ jobs: if: vars.ROLE == 'forgejo-coding' runs-on: lxc-bookworm steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - id: forgejo uses: https://data.forgejo.org/actions/setup-forgejo@v3.0.4 diff --git a/.forgejo/workflows/build-release.yml b/.forgejo/workflows/build-release.yml index b70439f12f..042a981881 100644 --- a/.forgejo/workflows/build-release.yml +++ b/.forgejo/workflows/build-release.yml @@ -33,7 +33,7 @@ jobs: # 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: https://data.forgejo.org/actions/checkout@v5 with: fetch-depth: 0 @@ -43,11 +43,11 @@ jobs: repository="${{ github.repository }}" echo "value=${repository##*/}" >> "$GITHUB_OUTPUT" - - uses: https://data.forgejo.org/actions/setup-node@v4 + - uses: https://data.forgejo.org/actions/setup-node@v6 with: node-version: 22 - - uses: https://data.forgejo.org/actions/setup-go@v5 + - uses: https://data.forgejo.org/actions/setup-go@v6 with: go-version-file: "go.mod" diff --git a/.forgejo/workflows/cascade-setup-end-to-end.yml b/.forgejo/workflows/cascade-setup-end-to-end.yml index e62dbd9e7d..c481c80497 100644 --- a/.forgejo/workflows/cascade-setup-end-to-end.yml +++ b/.forgejo/workflows/cascade-setup-end-to-end.yml @@ -37,7 +37,7 @@ jobs: container: image: data.forgejo.org/oci/node:22-bookworm steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 with: fetch-depth: '0' show-progress: 'false' diff --git a/.forgejo/workflows/coverage.yml b/.forgejo/workflows/coverage.yml index 194b116251..a835efd9a5 100644 --- a/.forgejo/workflows/coverage.yml +++ b/.forgejo/workflows/coverage.yml @@ -58,10 +58,10 @@ jobs: POSTGRESQL_EXTRA_FLAGS: -c full_page_writes=off options: --tmpfs /bitnami/postgresql cacher: - image: registry.redict.io/redict:7.3.5-scratch + image: registry.redict.io/redict:7.3.6-scratch options: --tmpfs /data:noatime steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 with: repository: ${{ inputs.repository }} ref: ${{ inputs.ref }} diff --git a/.forgejo/workflows/publish-release.yml b/.forgejo/workflows/publish-release.yml index 5303f902e3..a583756656 100644 --- a/.forgejo/workflows/publish-release.yml +++ b/.forgejo/workflows/publish-release.yml @@ -41,7 +41,7 @@ jobs: runs-on: lxc-bookworm if: vars.DOER != '' && vars.FORGEJO != '' && vars.TO_OWNER != '' && vars.FROM_OWNER != '' && secrets.TOKEN != '' steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - name: copy & sign uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.4.1 diff --git a/.forgejo/workflows/release-notes-assistant-milestones.yml b/.forgejo/workflows/release-notes-assistant-milestones.yml index 57c9a23f02..76799b06dc 100644 --- a/.forgejo/workflows/release-notes-assistant-milestones.yml +++ b/.forgejo/workflows/release-notes-assistant-milestones.yml @@ -15,7 +15,7 @@ jobs: container: image: 'data.forgejo.org/oci/ci:1' steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - uses: https://data.forgejo.org/actions/cache@v4 with: diff --git a/.forgejo/workflows/release-notes-assistant.yml b/.forgejo/workflows/release-notes-assistant.yml index a727e57afb..6fde710d84 100644 --- a/.forgejo/workflows/release-notes-assistant.yml +++ b/.forgejo/workflows/release-notes-assistant.yml @@ -17,7 +17,7 @@ jobs: container: image: 'data.forgejo.org/oci/node:22-bookworm' steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - name: event run: | @@ -28,7 +28,7 @@ jobs: ${{ toJSON(github.event) }} EOF - - uses: https://data.forgejo.org/actions/setup-go@v5 + - uses: https://data.forgejo.org/actions/setup-go@v6 with: go-version-file: "go.mod" cache: false diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml index 94db936c12..7a06a3177a 100644 --- a/.forgejo/workflows/renovate.yml +++ b/.forgejo/workflows/renovate.yml @@ -28,7 +28,7 @@ jobs: runs-on: docker container: - image: data.forgejo.org/renovate/renovate:41.131.9 + image: data.forgejo.org/renovate/renovate:41.146.0 steps: - name: Load renovate repo cache diff --git a/.forgejo/workflows/testing-integration.yml b/.forgejo/workflows/testing-integration.yml index 6822c45f39..f98f92e317 100644 --- a/.forgejo/workflows/testing-integration.yml +++ b/.forgejo/workflows/testing-integration.yml @@ -34,7 +34,7 @@ jobs: image: 'data.forgejo.org/oci/node:22-bookworm' options: --tmpfs /tmp:exec,noatime steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - uses: ./.forgejo/workflows-composite/setup-env - name: install git 2.34.1 and git-lfs 3.0.2 uses: ./.forgejo/workflows-composite/install-minimum-git-version @@ -53,7 +53,7 @@ jobs: image: 'data.forgejo.org/oci/node:22-bookworm' options: --tmpfs /tmp:exec,noatime steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - uses: ./.forgejo/workflows-composite/setup-env - name: install git 2.34.1 and git-lfs 3.0.2 uses: ./.forgejo/workflows-composite/install-minimum-git-version @@ -85,7 +85,7 @@ jobs: MARIADB_DATABASE: testgitea options: --tmpfs /var/lib/mysql:noatime steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - uses: ./.forgejo/workflows-composite/setup-env - name: install dependencies & git >= 2.42 uses: ./.forgejo/workflows-composite/apt-install-from diff --git a/.forgejo/workflows/testing.yml b/.forgejo/workflows/testing.yml index 715ce3cb28..49213b064f 100644 --- a/.forgejo/workflows/testing.yml +++ b/.forgejo/workflows/testing.yml @@ -21,7 +21,7 @@ jobs: cat <<'EOF' ${{ toJSON(github) }} EOF - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - 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 @@ -33,7 +33,7 @@ jobs: image: 'data.forgejo.org/oci/node:22-bookworm' options: --tmpfs /tmp:exec,noatime steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - run: make deps-frontend - run: make lint-frontend - run: make checks-frontend @@ -77,7 +77,7 @@ jobs: MINIO_ROOT_USER: 123456 MINIO_ROOT_PASSWORD: 12345678 steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - uses: ./.forgejo/workflows-composite/setup-env - name: install git >= 2.42 uses: ./.forgejo/workflows-composite/apt-install-from @@ -104,7 +104,7 @@ jobs: image: 'data.forgejo.org/oci/playwright:latest' options: --tmpfs /tmp:exec,noatime steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 with: fetch-depth: 20 - uses: ./.forgejo/workflows-composite/setup-env @@ -126,7 +126,7 @@ jobs: echo "all=1" >> "$GITHUB_OUTPUT" - name: Get changed files id: changed-files - uses: https://data.forgejo.org/tj-actions/changed-files@v46 + uses: https://data.forgejo.org/tj-actions/changed-files@v47 with: separator: '\n' - run: | @@ -172,7 +172,7 @@ jobs: image: ${{ matrix.cacher.image }} options: ${{ matrix.cacher.options }} steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - uses: ./.forgejo/workflows-composite/setup-env - name: install git >= 2.42 uses: ./.forgejo/workflows-composite/apt-install-from @@ -205,7 +205,7 @@ jobs: MYSQL_EXTRA_FLAGS: --innodb-adaptive-flushing=OFF --innodb-buffer-pool-size=4G --innodb-log-buffer-size=128M --innodb-flush-log-at-trx-commit=0 --innodb-flush-log-at-timeout=30 --innodb-flush-method=nosync --innodb-fsync-threshold=1000000000 --disable-log-bin options: --tmpfs /bitnami/mysql/data:noatime steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - uses: ./.forgejo/workflows-composite/setup-env - name: install dependencies & git >= 2.42 uses: ./.forgejo/workflows-composite/apt-install-from @@ -233,6 +233,7 @@ jobs: options: --tmpfs /bitnami/minio/data ldap: image: data.forgejo.org/oci/forgejo-test-openldap:1 + options: --memory 500M pgsql: image: data.forgejo.org/oci/bitnami/postgresql:16 env: @@ -242,7 +243,7 @@ jobs: POSTGRESQL_EXTRA_FLAGS: -c full_page_writes=off options: --tmpfs /bitnami/postgresql steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - uses: ./.forgejo/workflows-composite/setup-env - name: install dependencies & git >= 2.42 uses: ./.forgejo/workflows-composite/apt-install-from @@ -264,7 +265,7 @@ jobs: image: 'data.forgejo.org/oci/node:22-bookworm' options: --tmpfs /tmp:exec,noatime steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - uses: ./.forgejo/workflows-composite/setup-env - name: install dependencies & git >= 2.42 uses: ./.forgejo/workflows-composite/apt-install-from @@ -292,7 +293,7 @@ jobs: image: 'data.forgejo.org/oci/node:22-bookworm' options: --tmpfs /tmp:exec,noatime steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v5 - uses: ./.forgejo/workflows-composite/setup-env - run: su forgejo -c 'make deps-backend deps-tools' - run: su forgejo -c 'make security-check' diff --git a/.golangci.yml b/.golangci.yml index b8884dd080..e41a40fe5a 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -94,6 +94,7 @@ linters: - all testifylint: disable: + - error-is-as - go-require exclusions: generated: lax @@ -119,7 +120,7 @@ linters: - errcheck - gocyclo - gosec - path: models/migrations/v + path: models/gitea_migrations/v - linters: - forbidigo path: cmd diff --git a/Makefile b/Makefile index 5779e11509..76e58c784f 100644 --- a/Makefile +++ b/Makefile @@ -37,17 +37,17 @@ 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.3.0 # renovate: datasource=go -GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.8.0 # renovate: datasource=go -GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.3.1 # renovate: datasource=go +EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker@v3.4.1 # renovate: datasource=go +GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.9.1 # renovate: datasource=go +GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.5.0 # renovate: datasource=go GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.15 # renovate: datasource=go -SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 # renovate: datasource=go +SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.33.1 # 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.36.0 # renovate: datasource=go +DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.38.0 # renovate: datasource=go GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.6.0 # renovate: datasource=go -RENOVATE_NPM_PACKAGE ?= renovate@41.131.9 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate +RENOVATE_NPM_PACKAGE ?= renovate@41.146.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: ... @@ -287,14 +287,14 @@ show-version-api: verify-version .PHONY: compute-go-test-packages compute-go-test-packages: ifeq ($(HAS_GO), yes) - $(eval 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 ./...))) + $(eval GO_TEST_PACKAGES ?= $(filter-out $(shell $(GO) list forgejo.org/models/gitea_migrations/...) $(shell $(GO) list forgejo.org/models/forgejo_migrations_legacy/...) $(shell $(GO) list forgejo.org/models/forgejo_migrations/...) forgejo.org/tests/integration/migration-test forgejo.org/tests forgejo.org/tests/integration forgejo.org/tests/e2e,$(shell $(GO) list ./...))) endif # Target to compute MIGRATION_PACKAGES - only runs when needed .PHONY: compute-migration-packages compute-migration-packages: ifeq ($(HAS_GO), yes) - $(eval MIGRATION_PACKAGES := $(shell $(GO) list forgejo.org/models/migrations/... forgejo.org/models/forgejo_migrations/...)) + $(eval MIGRATION_PACKAGES := $(shell $(GO) list forgejo.org/models/gitea_migrations/... forgejo.org/models/forgejo_migrations_legacy/... forgejo.org/models/forgejo_migrations/...)) endif ### @@ -432,7 +432,7 @@ lint: lint-frontend lint-backend lint-fix: lint-frontend-fix lint-backend-fix .PHONY: lint-frontend -lint-frontend: lint-js lint-css +lint-frontend: lint-js tsc lint-css .PHONY: lint-frontend-fix lint-frontend-fix: lint-js-fix lint-css-fix @@ -514,7 +514,11 @@ lint-disposable-emails-fix: .PHONY: security-check security-check: - go run $(GOVULNCHECK_PACKAGE) -show color ./... + $(GO) run $(GOVULNCHECK_PACKAGE) -show color ./... + +.PHONY: tsc +tsc: node_modules + npx tsc --noEmit ### # Development and testing targets @@ -774,7 +778,7 @@ migrations.individual.mysql.test: $(GO_SOURCES) | compute-migration-packages .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 $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' forgejo.org/models/gitea_migrations/$* .PHONY: migrations.individual.pgsql.test migrations.individual.pgsql.test: $(GO_SOURCES) | compute-migration-packages @@ -784,7 +788,7 @@ migrations.individual.pgsql.test: $(GO_SOURCES) | compute-migration-packages .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 $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' forgejo.org/models/gitea_migrations/$* .PHONY: migrations.individual.sqlite.test migrations.individual.sqlite.test: $(GO_SOURCES) generate-ini-sqlite | compute-migration-packages @@ -794,7 +798,7 @@ migrations.individual.sqlite.test: $(GO_SOURCES) generate-ini-sqlite | compute-m .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 $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' forgejo.org/models/gitea_migrations/$* e2e.mysql.test: $(GO_SOURCES) $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/e2e -o e2e.mysql.test diff --git a/assets/go-licenses.json b/assets/go-licenses.json index 608db76eb3..aa1a65db12 100644 --- a/assets/go-licenses.json +++ b/assets/go-licenses.json @@ -199,6 +199,16 @@ "path": "code.gitea.io/sdk/gitea/LICENSE", "licenseText": "Copyright (c) 2016 The Gitea Authors\nCopyright (c) 2014 The Gogs Authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n" }, + { + "name": "code.superseriousbusiness.org/go-jpeg-image-structure/v2", + "path": "code.superseriousbusiness.org/go-jpeg-image-structure/v2/LICENSE", + "licenseText": "MIT LICENSE\n\nCopyright 2020 Dustin Oprea\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" + }, + { + "name": "code.superseriousbusiness.org/go-png-image-structure/v2", + "path": "code.superseriousbusiness.org/go-png-image-structure/v2/LICENSE", + "licenseText": "MIT LICENSE\n\nCopyright 2020 Dustin Oprea\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" + }, { "name": "codeberg.org/gusted/mcaptcha", "path": "codeberg.org/gusted/mcaptcha/LICENSE", @@ -207,7 +217,7 @@ { "name": "connectrpc.com/connect", "path": "connectrpc.com/connect/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 2021-2024 The Connect 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" + "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 2021-2025 The Connect 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" }, { "name": "dario.cat/mergo", @@ -484,6 +494,31 @@ "path": "github.com/dsnet/compress/LICENSE.md", "licenseText": "Copyright © 2015, Joe Tsai and 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 met:\n\n* Redistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice,\nthis list of conditions and the following disclaimer in the documentation and/or\nother materials provided with the distribution.\n* Neither the copyright holder nor the names of its contributors may be used to\nendorse or promote products derived from this software without specific prior\nwritten permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, + { + "name": "github.com/dsoprea/go-exif/v3", + "path": "github.com/dsoprea/go-exif/v3/LICENSE", + "licenseText": "MIT LICENSE\n\nCopyright 2019 Dustin Oprea\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" + }, + { + "name": "github.com/dsoprea/go-iptc", + "path": "github.com/dsoprea/go-iptc/LICENSE", + "licenseText": "MIT License\n\nCopyright (c) 2020 Dustin Oprea\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/dsoprea/go-logging", + "path": "github.com/dsoprea/go-logging/LICENSE", + "licenseText": "MIT LICENSE\n\nCopyright 2020 Dustin Oprea\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" + }, + { + "name": "github.com/dsoprea/go-photoshop-info-format", + "path": "github.com/dsoprea/go-photoshop-info-format/LICENSE", + "licenseText": "MIT License\n\nCopyright (c) 2020 Dustin Oprea\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/dsoprea/go-utility/v2", + "path": "github.com/dsoprea/go-utility/v2/LICENSE", + "licenseText": "Copyright 2019 Random Ingenuity InformationWorks\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" + }, { "name": "github.com/dustin/go-humanize", "path": "github.com/dustin/go-humanize/LICENSE", @@ -574,6 +609,11 @@ "path": "github.com/go-enry/go-enry/v2/LICENSE", "licenseText": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License." }, + { + "name": "github.com/go-errors/errors", + "path": "github.com/go-errors/errors/LICENSE.MIT", + "licenseText": "Copyright (c) 2015 Conrad Irwin \u003cconrad@bugsnag.com\u003e\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" + }, { "name": "github.com/go-fed/httpsig", "path": "github.com/go-fed/httpsig/LICENSE", @@ -619,6 +659,11 @@ "path": "github.com/go-webauthn/x/revoke/LICENSE", "licenseText": "Copyright (c) 2014 CloudFlare Inc.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\nRedistributions of source code must retain the above copyright notice,\nthis list of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice,\nthis list of conditions and the following disclaimer in the documentation\nand/or other materials provided with the distribution.\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 LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, + { + "name": "github.com/go-xmlfmt/xmlfmt", + "path": "github.com/go-xmlfmt/xmlfmt/LICENSE", + "licenseText": "MIT License\n\nCopyright (c) 2016 go-xmlfmt\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/gobwas/glob", "path": "github.com/gobwas/glob/LICENSE", @@ -649,6 +694,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", @@ -1194,6 +1244,11 @@ "path": "go.yaml.in/yaml/v3/LICENSE", "licenseText": "\nThis project is covered by two different licenses: MIT and Apache.\n\n#### MIT License ####\n\nThe following files were ported to Go from C files of libyaml, and thus\nare still covered by their original MIT license, with the additional\ncopyright staring in 2011 when the project was ported over:\n\n apic.go emitterc.go parserc.go readerc.go scannerc.go\n writerc.go yamlh.go yamlprivateh.go\n\nCopyright (c) 2006-2010 Kirill Simonov\nCopyright (c) 2006-2011 Kirill Simonov\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\nof the Software, and to permit persons to whom the Software is furnished to do\nso, 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### Apache License ###\n\nAll the remaining project files are covered by the Apache license:\n\nCopyright (c) 2011-2019 Canonical Ltd\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n" }, + { + "name": "go.yaml.in/yaml/v4", + "path": "go.yaml.in/yaml/v4/LICENSE", + "licenseText": "\nThis project is covered by two different licenses: MIT and Apache.\n\n#### MIT License ####\n\nThe following files were ported to Go from C files of libyaml, and thus\nare still covered by their original MIT license, with the additional\ncopyright staring in 2011 when the project was ported over:\n\n apic.go emitterc.go parserc.go readerc.go scannerc.go\n writerc.go yamlh.go yamlprivateh.go\n\nCopyright (c) 2006-2010 Kirill Simonov\nCopyright (c) 2006-2011 Kirill Simonov\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\nof the Software, and to permit persons to whom the Software is furnished to do\nso, 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### Apache License ###\n\nAll the remaining project files are covered by the Apache license:\n\nCopyright (c) 2011-2019 Canonical Ltd\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n" + }, { "name": "go4.org/readerutil", "path": "go4.org/readerutil/LICENSE", @@ -1264,6 +1319,11 @@ "path": "gopkg.in/warnings.v0/LICENSE", "licenseText": "Copyright (c) 2016 Péter Surányi.\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\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": "gopkg.in/yaml.v2", + "path": "gopkg.in/yaml.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" + }, { "name": "gopkg.in/yaml.v3", "path": "gopkg.in/yaml.v3/LICENSE", diff --git a/build/code-batch-process.go b/build/code-batch-process.go index 516736b65c..ede43c6c46 100644 --- a/build/code-batch-process.go +++ b/build/code-batch-process.go @@ -74,7 +74,7 @@ func newFileCollector(fileFilter string, batchSize int) (*fileCollector, error) co.excludePatterns = append(co.excludePatterns, regexp.MustCompile(`tests/integration/migration-test`)) co.excludePatterns = append(co.excludePatterns, regexp.MustCompile(`modules/git/tests`)) co.excludePatterns = append(co.excludePatterns, regexp.MustCompile(`models/fixtures`)) - co.excludePatterns = append(co.excludePatterns, regexp.MustCompile(`models/migrations/fixtures`)) + co.excludePatterns = append(co.excludePatterns, regexp.MustCompile(`models/gitea_migrations/fixtures`)) co.excludePatterns = append(co.excludePatterns, regexp.MustCompile(`services/gitdiff/testdata`)) } @@ -181,7 +181,7 @@ func parseArgs() (mainOptions map[string]string, subCmd string, subArgs []string break } } - return + return mainOptions, subCmd, subArgs } func showUsage() { diff --git a/cmd/actions.go b/cmd/actions.go index 12af2c8e86..7a440d0290 100644 --- a/cmd/actions.go +++ b/cmd/actions.go @@ -28,6 +28,7 @@ func subcmdActionsGenRunnerToken() *cli.Command { return &cli.Command{ Name: "generate-runner-token", Usage: "Generate a new token for a runner to use to register with the server", + Before: noDanglingArgs, Action: runGenerateActionsRunnerToken, Aliases: []string{"grt"}, Flags: []cli.Flag{ diff --git a/cmd/admin.go b/cmd/admin.go index 7e06a99cda..90157e2d5a 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -37,6 +37,7 @@ func subcmdRepoSyncReleases() *cli.Command { return &cli.Command{ Name: "repo-sync-releases", Usage: "Synchronize repository releases with tags", + Before: noDanglingArgs, Action: runRepoSyncReleases, } } @@ -75,6 +76,7 @@ func subcmdSendMail() *cli.Command { return &cli.Command{ Name: "sendmail", Usage: "Send a message to all users", + Before: noDanglingArgs, Action: runSendMail, Flags: []cli.Flag{ &cli.StringFlag{ @@ -103,7 +105,7 @@ func idFlag() *cli.Int64Flag { } } -func runRepoSyncReleases(ctx context.Context, _ *cli.Command) error { +func runRepoSyncReleases(ctx context.Context, c *cli.Command) error { ctx, cancel := installSignals(ctx) defer cancel() diff --git a/cmd/admin_auth.go b/cmd/admin_auth.go index 91b344b1e9..0cfe7da12e 100644 --- a/cmd/admin_auth.go +++ b/cmd/admin_auth.go @@ -31,6 +31,7 @@ func microcmdAuthDelete() *cli.Command { Name: "delete", Usage: "Delete specific auth source", Flags: []cli.Flag{idFlag()}, + Before: noDanglingArgs, Action: runDeleteAuth, } } @@ -39,6 +40,7 @@ func microcmdAuthList() *cli.Command { return &cli.Command{ Name: "list", Usage: "List auth sources", + Before: noDanglingArgs, Action: runListAuth, Flags: []cli.Flag{ &cli.IntFlag{ diff --git a/cmd/admin_auth_ldap.go b/cmd/admin_auth_ldap.go index 9af6c331d3..0ed7613a7e 100644 --- a/cmd/admin_auth_ldap.go +++ b/cmd/admin_auth_ldap.go @@ -133,8 +133,9 @@ func ldapSimpleAuthCLIFlags() []cli.Flag { func microcmdAuthAddLdapBindDn() *cli.Command { return &cli.Command{ - Name: "add-ldap", - Usage: "Add new LDAP (via Bind DN) authentication source", + Name: "add-ldap", + Usage: "Add new LDAP (via Bind DN) authentication source", + Before: noDanglingArgs, Action: func(ctx context.Context, cli *cli.Command) error { return newAuthService().addLdapBindDn(ctx, cli) }, @@ -144,8 +145,9 @@ func microcmdAuthAddLdapBindDn() *cli.Command { func microcmdAuthUpdateLdapBindDn() *cli.Command { return &cli.Command{ - Name: "update-ldap", - Usage: "Update existing LDAP (via Bind DN) authentication source", + Name: "update-ldap", + Usage: "Update existing LDAP (via Bind DN) authentication source", + Before: noDanglingArgs, Action: func(ctx context.Context, cli *cli.Command) error { return newAuthService().updateLdapBindDn(ctx, cli) }, @@ -155,8 +157,9 @@ func microcmdAuthUpdateLdapBindDn() *cli.Command { func microcmdAuthAddLdapSimpleAuth() *cli.Command { return &cli.Command{ - Name: "add-ldap-simple", - Usage: "Add new LDAP (simple auth) authentication source", + Name: "add-ldap-simple", + Usage: "Add new LDAP (simple auth) authentication source", + Before: noDanglingArgs, Action: func(ctx context.Context, cli *cli.Command) error { return newAuthService().addLdapSimpleAuth(ctx, cli) }, @@ -166,8 +169,9 @@ func microcmdAuthAddLdapSimpleAuth() *cli.Command { func microcmdAuthUpdateLdapSimpleAuth() *cli.Command { return &cli.Command{ - Name: "update-ldap-simple", - Usage: "Update existing LDAP (simple auth) authentication source", + Name: "update-ldap-simple", + Usage: "Update existing LDAP (simple auth) authentication source", + Before: noDanglingArgs, Action: func(ctx context.Context, cli *cli.Command) error { return newAuthService().updateLdapSimpleAuth(ctx, cli) }, diff --git a/cmd/admin_auth_oauth.go b/cmd/admin_auth_oauth.go index ef5d9116e3..0fd8650f37 100644 --- a/cmd/admin_auth_oauth.go +++ b/cmd/admin_auth_oauth.go @@ -136,6 +136,7 @@ func microcmdAuthAddOauth() *cli.Command { return &cli.Command{ Name: "add-oauth", Usage: "Add new Oauth authentication source", + Before: noDanglingArgs, Action: newAuthService().addOauth, Flags: oauthCLIFlags(), } @@ -145,6 +146,7 @@ func microcmdAuthUpdateOauth() *cli.Command { return &cli.Command{ Name: "update-oauth", Usage: "Update existing Oauth authentication source", + Before: noDanglingArgs, Action: newAuthService().updateOauth, Flags: append(oauthCLIFlags()[:1], append([]cli.Flag{idFlag()}, oauthCLIFlags()[1:]...)...), } diff --git a/cmd/admin_auth_stmp.go b/cmd/admin_auth_stmp.go index 48b3adaac3..970b613638 100644 --- a/cmd/admin_auth_stmp.go +++ b/cmd/admin_auth_stmp.go @@ -78,6 +78,7 @@ func microcmdAuthAddSMTP() *cli.Command { return &cli.Command{ Name: "add-smtp", Usage: "Add new SMTP authentication source", + Before: noDanglingArgs, Action: runAddSMTP, Flags: smtpCLIFlags(), } @@ -87,6 +88,7 @@ func microcmdAuthUpdateSMTP() *cli.Command { return &cli.Command{ Name: "update-smtp", Usage: "Update existing SMTP authentication source", + Before: noDanglingArgs, Action: runUpdateSMTP, Flags: append(smtpCLIFlags()[:1], append([]cli.Flag{idFlag()}, smtpCLIFlags()[1:]...)...), } diff --git a/cmd/admin_regenerate.go b/cmd/admin_regenerate.go index 7bfd12f8f4..4d14df317d 100644 --- a/cmd/admin_regenerate.go +++ b/cmd/admin_regenerate.go @@ -17,17 +17,19 @@ var ( microcmdRegenHooks = &cli.Command{ Name: "hooks", Usage: "Regenerate git-hooks", + Before: noDanglingArgs, Action: runRegenerateHooks, } microcmdRegenKeys = &cli.Command{ Name: "keys", Usage: "Regenerate authorized_keys file", + Before: noDanglingArgs, Action: runRegenerateKeys, } ) -func runRegenerateHooks(ctx context.Context, _ *cli.Command) error { +func runRegenerateHooks(ctx context.Context, c *cli.Command) error { ctx, cancel := installSignals(ctx) defer cancel() @@ -37,7 +39,7 @@ func runRegenerateHooks(ctx context.Context, _ *cli.Command) error { return repo_service.SyncRepositoryHooks(graceful.GetManager().ShutdownContext()) } -func runRegenerateKeys(ctx context.Context, _ *cli.Command) error { +func runRegenerateKeys(ctx context.Context, c *cli.Command) error { ctx, cancel := installSignals(ctx) defer cancel() diff --git a/cmd/admin_user_change_password.go b/cmd/admin_user_change_password.go index dd8c9d378a..cd52a8378c 100644 --- a/cmd/admin_user_change_password.go +++ b/cmd/admin_user_change_password.go @@ -21,6 +21,7 @@ func microcmdUserChangePassword() *cli.Command { return &cli.Command{ Name: "change-password", Usage: "Change a user's password", + Before: noDanglingArgs, Action: runChangePassword, Flags: []cli.Flag{ &cli.StringFlag{ diff --git a/cmd/admin_user_create.go b/cmd/admin_user_create.go index 96431412f6..e3800bdb59 100644 --- a/cmd/admin_user_create.go +++ b/cmd/admin_user_create.go @@ -23,6 +23,7 @@ func microcmdUserCreate() *cli.Command { return &cli.Command{ Name: "create", Usage: "Create a new user in database", + Before: noDanglingArgs, Action: runCreateUser, Flags: []cli.Flag{ &cli.StringFlag{ diff --git a/cmd/admin_user_delete.go b/cmd/admin_user_delete.go index 3382c53e5f..affd76247f 100644 --- a/cmd/admin_user_delete.go +++ b/cmd/admin_user_delete.go @@ -40,6 +40,7 @@ func microcmdUserDelete() *cli.Command { Usage: "Purge user, all their repositories, organizations and comments", }, }, + Before: noDanglingArgs, Action: runDeleteUser, } } diff --git a/cmd/admin_user_generate_access_token.go b/cmd/admin_user_generate_access_token.go index d0f2878297..0a3a7fa89d 100644 --- a/cmd/admin_user_generate_access_token.go +++ b/cmd/admin_user_generate_access_token.go @@ -40,6 +40,7 @@ func microcmdUserGenerateAccessToken() *cli.Command { Usage: `Comma separated list of scopes to apply to access token, examples: "all", "public-only,read:issue", "write:repository,write:user"`, }, }, + Before: noDanglingArgs, Action: runGenerateAccessToken, } } diff --git a/cmd/admin_user_list.go b/cmd/admin_user_list.go index ccc4b8c917..8e1323bcf8 100644 --- a/cmd/admin_user_list.go +++ b/cmd/admin_user_list.go @@ -18,6 +18,7 @@ func microcmdUserList() *cli.Command { return &cli.Command{ Name: "list", Usage: "List users", + Before: noDanglingArgs, Action: runListUsers, Flags: []cli.Flag{ &cli.BoolFlag{ diff --git a/cmd/admin_user_reset_mfa.go b/cmd/admin_user_reset_mfa.go index 8107fd97bf..504331100c 100644 --- a/cmd/admin_user_reset_mfa.go +++ b/cmd/admin_user_reset_mfa.go @@ -17,6 +17,7 @@ func microcmdUserResetMFA() *cli.Command { return &cli.Command{ Name: "reset-mfa", Usage: "Remove all two-factor authentication configurations for a user", + Before: noDanglingArgs, Action: runResetMFA, Flags: []cli.Flag{ &cli.StringFlag{ diff --git a/cmd/cert.go b/cmd/cert.go index f9e3a16f3e..baadcbda85 100644 --- a/cmd/cert.go +++ b/cmd/cert.go @@ -31,6 +31,7 @@ func cmdCert() *cli.Command { Usage: "Generate self-signed certificate", Description: `Generate a self-signed X.509 certificate for a TLS server. Outputs to 'cert.pem' and 'key.pem' and will overwrite existing files.`, + Before: noDanglingArgs, Action: runCert, Flags: []cli.Flag{ &cli.StringFlag{ diff --git a/cmd/cmd.go b/cmd/cmd.go index 85a482b78c..379609d294 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -12,6 +12,7 @@ import ( "io" "os" "os/signal" + "slices" "strings" "syscall" @@ -40,6 +41,19 @@ func argsSet(c *cli.Command, args ...string) error { return nil } +// When a CLI command is intended to be used only with flags and no other arbitrary args, noDanglingArgs will validate +// the end-user's usage. +func noDanglingArgs(ctx context.Context, c *cli.Command) (context.Context, error) { + if c.Args().Len() != 0 { + args := c.Args().Slice() + if slices.Contains(args, "false") { + println("Hint: boolean false must be specified as a single arg, eg. '--restricted=false', not '--restricted false'") + } + return nil, fmt.Errorf("unexpected arguments: %s", strings.Join(c.Args().Slice(), ", ")) + } + return nil, nil +} + // confirm waits for user input which confirms an action func confirm() (bool, error) { var response string @@ -135,3 +149,18 @@ func PrepareConsoleLoggerLevel(defaultLevel log.Level) func(ctx context.Context, return ctx, nil } } + +func multipleBefore(beforeFuncs ...cli.BeforeFunc) cli.BeforeFunc { + return func(ctx context.Context, cli *cli.Command) (context.Context, error) { + for _, beforeFunc := range beforeFuncs { + bctx, err := beforeFunc(ctx, cli) + if err != nil { + return bctx, err + } + if bctx != nil { + ctx = bctx + } + } + return ctx, nil + } +} diff --git a/cmd/doctor.go b/cmd/doctor.go index 681794f094..f557481110 100644 --- a/cmd/doctor.go +++ b/cmd/doctor.go @@ -6,6 +6,8 @@ package cmd import ( "context" "fmt" + "image" + "io" golog "log" "os" "path/filepath" @@ -13,13 +15,17 @@ import ( "text/tabwriter" "forgejo.org/models/db" - "forgejo.org/models/migrations" - migrate_base "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations" + migrate_base "forgejo.org/models/gitea_migrations/base" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" "forgejo.org/modules/container" "forgejo.org/modules/log" "forgejo.org/modules/setting" + "forgejo.org/modules/storage" "forgejo.org/services/doctor" + exif_terminator "code.superseriousbusiness.org/exif-terminator" "github.com/urfave/cli/v3" ) @@ -34,6 +40,7 @@ func cmdDoctor() *cli.Command { cmdDoctorCheck(), cmdRecreateTable(), cmdDoctorConvert(), + cmdAvatarStripExif(), }, } } @@ -43,6 +50,7 @@ func cmdDoctorCheck() *cli.Command { Name: "check", Usage: "Diagnose and optionally fix problems", Description: "A command to diagnose problems with the current Forgejo instance according to the given configuration. Some problems can optionally be fixed by modifying the database or data storage.", + Before: noDanglingArgs, Action: runDoctorCheck, Flags: []cli.Flag{ &cli.BoolFlag{ @@ -98,6 +106,15 @@ You should back-up your database before doing this and ensure that your database } } +func cmdAvatarStripExif() *cli.Command { + return &cli.Command{ + Name: "avatar-strip-exif", + Usage: "Strip EXIF metadata from all images in the avatar storage", + Before: noDanglingArgs, + Action: runAvatarStripExif, + } +} + func runRecreateTable(stdCtx context.Context, ctx *cli.Command) error { stdCtx, cancel := installSignals(stdCtx) defer cancel() @@ -142,7 +159,7 @@ func runRecreateTable(stdCtx context.Context, ctx *cli.Command) error { return err } - if err := migrations.EnsureUpToDate(engine); err != nil { + if err := gitea_migrations.EnsureUpToDate(engine); err != nil { return err } @@ -230,3 +247,78 @@ func runDoctorCheck(stdCtx context.Context, ctx *cli.Command) error { } return doctor.RunChecks(stdCtx, colorize, ctx.Bool("fix"), checks) } + +func runAvatarStripExif(ctx context.Context, c *cli.Command) error { + ctx, cancel := installSignals(ctx) + defer cancel() + + if err := initDB(ctx); err != nil { + return err + } + if err := storage.Init(); err != nil { + return err + } + + type HasCustomAvatarRelativePath interface { + CustomAvatarRelativePath() string + } + + doExifStrip := func(obj HasCustomAvatarRelativePath, name string, target_storage storage.ObjectStorage) error { + if obj.CustomAvatarRelativePath() == "" { + return nil + } + + log.Info("Stripping avatar for %s...", name) + + avatarFile, err := target_storage.Open(obj.CustomAvatarRelativePath()) + if err != nil { + return fmt.Errorf("storage.Avatars.Open: %w", err) + } + _, imgType, err := image.DecodeConfig(avatarFile) + if err != nil { + return fmt.Errorf("image.DecodeConfig: %w", err) + } + + // reset io.Reader for exif termination scan + _, err = avatarFile.Seek(0, io.SeekStart) + if err != nil { + return fmt.Errorf("avatarFile.Seek: %w", err) + } + + cleanedData, err := exif_terminator.Terminate(avatarFile, imgType) + if err != nil && strings.Contains(err.Error(), "cannot be processed") { + // expected error for an image type that isn't supported by exif_terminator + log.Info("... image type %s is not supported by exif_terminator, skipping.", imgType) + return nil + } else if err != nil { + return fmt.Errorf("error cleaning exif data: %w", err) + } + + if err := storage.SaveFrom(target_storage, obj.CustomAvatarRelativePath(), func(w io.Writer) error { + _, err := io.Copy(w, cleanedData) + return err + }); err != nil { + return fmt.Errorf("Failed to create dir %s: %w", obj.CustomAvatarRelativePath(), err) + } + + log.Info("... completed %s.", name) + + return nil + } + + err := db.Iterate(ctx, nil, func(ctx context.Context, user *user_model.User) error { + return doExifStrip(user, fmt.Sprintf("user %s", user.Name), storage.Avatars) + }) + if err != nil { + return err + } + + err = db.Iterate(ctx, nil, func(ctx context.Context, repo *repo_model.Repository) error { + return doExifStrip(repo, fmt.Sprintf("repo %s", repo.Name), storage.RepoAvatars) + }) + if err != nil { + return err + } + + return nil +} diff --git a/cmd/doctor_convert.go b/cmd/doctor_convert.go index 44bebae154..7bc70163dd 100644 --- a/cmd/doctor_convert.go +++ b/cmd/doctor_convert.go @@ -20,6 +20,7 @@ func cmdDoctorConvert() *cli.Command { Name: "convert", Usage: "Convert the database", Description: "A command to convert an existing MySQL database from utf8 to utf8mb4", + Before: noDanglingArgs, Action: runDoctorConvert, } } diff --git a/cmd/dump.go b/cmd/dump.go index ea141291f5..b94277e529 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -164,6 +164,7 @@ func cmdDump() *cli.Command { Usage: "Dump Forgejo files and database", Description: `Dump compresses all related files and database into zip file. It can be used for backup and capture Forgejo server image to send to maintainer`, + Before: noDanglingArgs, Action: runDump, Flags: []cli.Flag{ &cli.StringFlag{ diff --git a/cmd/dump_repo.go b/cmd/dump_repo.go index 7159d55e99..8e0ef0311f 100644 --- a/cmd/dump_repo.go +++ b/cmd/dump_repo.go @@ -28,6 +28,7 @@ func cmdDumpRepository() *cli.Command { Name: "dump-repo", Usage: "Dump the repository from git/github/gitea/gitlab", Description: "This is a command for dumping the repository data.", + Before: noDanglingArgs, Action: runDumpRepository, Flags: []cli.Flag{ &cli.StringFlag{ diff --git a/cmd/generate.go b/cmd/generate.go index 7076ae541f..a37d689dc2 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -42,6 +42,7 @@ func microcmdGenerateInternalToken() *cli.Command { return &cli.Command{ Name: "INTERNAL_TOKEN", Usage: "Generate a new INTERNAL_TOKEN", + Before: noDanglingArgs, Action: runGenerateInternalToken, } } @@ -51,6 +52,7 @@ func microcmdGenerateLfsJwtSecret() *cli.Command { Name: "JWT_SECRET", Aliases: []string{"LFS_JWT_SECRET"}, Usage: "Generate a new JWT_SECRET", + Before: noDanglingArgs, Action: runGenerateLfsJwtSecret, } } @@ -59,6 +61,7 @@ func microcmdGenerateSecretKey() *cli.Command { return &cli.Command{ Name: "SECRET_KEY", Usage: "Generate a new SECRET_KEY", + Before: noDanglingArgs, Action: runGenerateSecretKey, } } diff --git a/cmd/keys.go b/cmd/keys.go index 00901903f4..31be86d99b 100644 --- a/cmd/keys.go +++ b/cmd/keys.go @@ -21,7 +21,7 @@ func cmdKeys() *cli.Command { Name: "keys", Usage: "(internal) Should only be called by SSH server", Description: "Queries the Forgejo database to get the authorized command for a given ssh key fingerprint", - Before: PrepareConsoleLoggerLevel(log.FATAL), + Before: multipleBefore(noDanglingArgs, PrepareConsoleLoggerLevel(log.FATAL)), Action: runKeys, Flags: []cli.Flag{ &cli.StringFlag{ diff --git a/cmd/manager.go b/cmd/manager.go index 029329b44e..87634705ee 100644 --- a/cmd/manager.go +++ b/cmd/manager.go @@ -39,6 +39,7 @@ func subcmdShutdown() *cli.Command { Name: "debug", }, }, + Before: noDanglingArgs, Action: runShutdown, } } @@ -52,6 +53,7 @@ func subcmdRestart() *cli.Command { Name: "debug", }, }, + Before: noDanglingArgs, Action: runRestart, } } @@ -65,6 +67,7 @@ func subcmdReloadTemplates() *cli.Command { Name: "debug", }, }, + Before: noDanglingArgs, Action: runReloadTemplates, } } @@ -73,6 +76,7 @@ func subcmdFlushQueues() *cli.Command { return &cli.Command{ Name: "flush-queues", Usage: "Flush queues in the running process", + Before: noDanglingArgs, Action: runFlushQueues, Flags: []cli.Flag{ &cli.DurationFlag{ @@ -95,6 +99,7 @@ func subCmdProcesses() *cli.Command { return &cli.Command{ Name: "processes", Usage: "Display running processes within the current process", + Before: noDanglingArgs, Action: runProcesses, Flags: []cli.Flag{ &cli.BoolFlag{ diff --git a/cmd/manager_logging.go b/cmd/manager_logging.go index c18bfa919b..02c924f4c5 100644 --- a/cmd/manager_logging.go +++ b/cmd/manager_logging.go @@ -77,6 +77,7 @@ func subcmdLogging() *cli.Command { Name: "debug", }, }, + Before: noDanglingArgs, Action: runPauseLogging, }, { Name: "resume", @@ -86,6 +87,7 @@ func subcmdLogging() *cli.Command { Name: "debug", }, }, + Before: noDanglingArgs, Action: runResumeLogging, }, { Name: "release-and-reopen", @@ -95,6 +97,7 @@ func subcmdLogging() *cli.Command { Name: "debug", }, }, + Before: noDanglingArgs, Action: runReleaseReopenLogging, }, { Name: "remove", @@ -156,6 +159,7 @@ func subcmdLogging() *cli.Command { Usage: "Compression level to use", }, }...), + Before: noDanglingArgs, Action: runAddFileLogger, }, { Name: "conn", @@ -182,6 +186,7 @@ func subcmdLogging() *cli.Command { Usage: "Host address and port to connect to (defaults to :7020)", }, }...), + Before: noDanglingArgs, Action: runAddConnLogger, }, }, @@ -197,6 +202,7 @@ func subcmdLogging() *cli.Command { Usage: "Switch off SQL logging", }, }, + Before: noDanglingArgs, Action: runSetLogSQL, }, }, diff --git a/cmd/migrate.go b/cmd/migrate.go index 5a485d17f9..af450d6139 100644 --- a/cmd/migrate.go +++ b/cmd/migrate.go @@ -7,7 +7,7 @@ import ( "context" "forgejo.org/models/db" - "forgejo.org/models/migrations" + "forgejo.org/models/gitea_migrations" "forgejo.org/modules/log" "forgejo.org/modules/setting" @@ -20,6 +20,7 @@ func cmdMigrate() *cli.Command { Name: "migrate", Usage: "Migrate the database", Description: "This is a command for migrating the database, so that you can run 'forgejo admin user create' before starting the server.", + Before: noDanglingArgs, Action: runMigrate, } } @@ -43,7 +44,7 @@ func runMigrate(stdCtx context.Context, ctx *cli.Command) error { if err != nil { return err } - return migrations.Migrate(masterEngine) + return gitea_migrations.Migrate(masterEngine) }); err != nil { log.Fatal("Failed to initialize ORM engine: %v", err) return err diff --git a/cmd/migrate_storage.go b/cmd/migrate_storage.go index d741a883e3..14ce222c9b 100644 --- a/cmd/migrate_storage.go +++ b/cmd/migrate_storage.go @@ -13,7 +13,7 @@ import ( actions_model "forgejo.org/models/actions" "forgejo.org/models/db" git_model "forgejo.org/models/git" - "forgejo.org/models/migrations" + "forgejo.org/models/gitea_migrations" packages_model "forgejo.org/models/packages" repo_model "forgejo.org/models/repo" user_model "forgejo.org/models/user" @@ -32,6 +32,7 @@ func cmdMigrateStorage() *cli.Command { Name: "migrate-storage", Usage: "Migrate the storage", Description: "Copies stored files from storage configured in app.ini to parameter-configured storage", + Before: noDanglingArgs, Action: runMigrateStorage, Flags: []cli.Flag{ &cli.StringFlag{ @@ -199,7 +200,7 @@ func runMigrateStorage(stdCtx context.Context, ctx *cli.Command) error { log.Info("Configuration file: %s", setting.CustomConf) if err := db.InitEngineWithMigration(context.Background(), func(e db.Engine) error { - return migrations.Migrate(e.(*xorm.Engine)) + return gitea_migrations.Migrate(e.(*xorm.Engine)) }); err != nil { log.Fatal("Failed to initialize ORM engine: %v", err) return err diff --git a/cmd/restore_repo.go b/cmd/restore_repo.go index 0e9f0bb50a..6c9bb218d4 100644 --- a/cmd/restore_repo.go +++ b/cmd/restore_repo.go @@ -19,6 +19,7 @@ func cmdRestoreRepository() *cli.Command { Name: "restore-repo", Usage: "Restore the repository from disk", Description: "This is a command for restoring the repository data.", + Before: noDanglingArgs, Action: runRestoreRepository, Flags: []cli.Flag{ &cli.StringFlag{ diff --git a/cmd/web.go b/cmd/web.go index f455b97180..770a0b505c 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -40,7 +40,7 @@ func cmdWeb() *cli.Command { Usage: "Start the Forgejo web server", Description: `The Forgejo web server is the only thing you need to run, and it takes care of all the other things for you`, - Before: PrepareConsoleLoggerLevel(log.INFO), + Before: multipleBefore(noDanglingArgs, PrepareConsoleLoggerLevel(log.INFO)), Action: runWeb, Flags: []cli.Flag{ &cli.StringFlag{ diff --git a/contrib/coverage-helper.sh b/contrib/coverage-helper.sh index ec9f5469ea..3c37e03e05 100755 --- a/contrib/coverage-helper.sh +++ b/contrib/coverage-helper.sh @@ -8,8 +8,8 @@ PS4='${BASH_SOURCE[0]}:$LINENO: ${FUNCNAME[0]}: ' # Those must be explicitly required and are excluded from the full list of packages because they # would interfere with the testing fixtures. # -excluded+='forgejo.org/models/migrations|' # must be run before database specific tests -excluded+='forgejo.org/models/forgejo_migrations|' # must be run before database specific tests +excluded+='forgejo.org/models/gitea_migrations|' # must be run before database specific tests +excluded+='forgejo.org/models/forgejo_migrations_legacy|' # must be run before database specific tests excluded+='forgejo.org/tests/integration/migration-test|' # must be run before database specific tests excluded+='forgejo.org/tests|' # only tests, no coverage to get there excluded+='forgejo.org/tests/e2e|' # JavaScript is not in scope here and if it adds coverage it should not be counted diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 77617b9b77..d4bb82904c 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -12,10 +12,10 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; These values are environment-dependent but form the basis of a lot of values. They will be -;; reported as part of the default configuration when running `gitea help` or on start-up. The order they are emitted there is slightly different but we will list them here in the order they are set-up. +;; reported as part of the default configuration when running `forgejo help` or on start-up. The order they are emitted there is slightly different but we will list them here in the order they are set-up. ;; -;; - _`AppPath`_: This is the absolute path of the running gitea binary. -;; - _`AppWorkPath`_: This refers to "working path" of the `gitea` binary. It is determined by using the first set thing in the following hierarchy: +;; - _`AppPath`_: This is the absolute path of the running Forgejo binary. +;; - _`AppWorkPath`_: This refers to "working path" of the `forgejo` binary. It is determined by using the first set thing in the following hierarchy: ;; - The "WORK_PATH" option in "app.ini" file ;; - The `--work-path` flag passed to the binary ;; - The environment variable `$GITEA_WORK_DIR` @@ -54,7 +54,7 @@ APP_NAME = ; Forgejo: Beyond coding. We Forge. RUN_USER = ; git ;; ;; Application run mode, affects performance and debugging: "dev" or "prod", default is "prod" -;; Mode "dev" makes Gitea easier to develop and debug, values other than "dev" are treated as "prod" which is for production use. +;; Mode "dev" makes Forgejo easier to develop and debug, values other than "dev" are treated as "prod" which is for production use. ;RUN_MODE = prod ;; ;; The working directory, see the comment of AppWorkPath above @@ -127,7 +127,7 @@ RUN_USER = ; git ;; Permission for unix socket ;UNIX_SOCKET_PERMISSION = 666 ;; -;; Local (DMZ) URL for Gitea workers (such as SSH update) accessing web service. In +;; Local (DMZ) URL for Forgejo workers (such as SSH update) accessing web service. In ;; most cases you do not need to change the default value. Alter it only if ;; your SSH server node is not the same as HTTP node. For different protocol, the default ;; values are different. If `PROTOCOL` is `http+unix`, the default value is `http://unix/`. @@ -169,11 +169,11 @@ RUN_USER = ; git ;; Root path of SSH directory, default is '~/.ssh', but you have to use '/home/git/.ssh'. ;SSH_ROOT_PATH = ;; -;; Gitea will create a authorized_keys file by default when it is not using the internal ssh server +;; Forgejo will create a authorized_keys file by default when it is not using the internal ssh server ;; If you intend to use the AuthorizedKeysCommand functionality then you should turn this off. ;SSH_CREATE_AUTHORIZED_KEYS_FILE = true ;; -;; Gitea will create a authorized_principals file by default when it is not using the internal ssh server +;; Forgejo will create a authorized_principals file by default when it is not using the internal ssh server ;; If you intend to use the AuthorizedPrincipalsCommand functionality then you should turn this off. ;SSH_CREATE_AUTHORIZED_PRINCIPALS_FILE = true ;; @@ -198,7 +198,7 @@ RUN_USER = ; git ;; default is the system temporary directory. ;SSH_KEY_TEST_PATH = ;; -;; Use `ssh-keygen` to parse public SSH keys. The value is passed to the shell. By default, Gitea does the parsing itself. +;; Use `ssh-keygen` to parse public SSH keys. The value is passed to the shell. By default, Forgejo does the parsing itself. ;SSH_KEYGEN_PATH = ;; ;; Enable SSH Authorized Key Backup when rewriting all keys, default is false @@ -220,9 +220,9 @@ RUN_USER = ; git ;; E.g."ssh- ". or "ssh- , ssh- ". ;; For more information see "TrustedUserCAKeys" in the sshd config manpages. ;SSH_TRUSTED_USER_CA_KEYS = -;; Absolute path of the `TrustedUserCaKeys` file gitea will manage. +;; Absolute path of the `TrustedUserCaKeys` file Forgejo will manage. ;; Default this `RUN_USER`/.ssh/gitea-trusted-user-ca-keys.pem -;; If you're running your own ssh server and you want to use the gitea managed file you'll also need to modify your +;; If you're running your own ssh server and you want to use the Forgejo managed file you'll also need to modify your ;; sshd_config to point to this file. The official docker image will automatically work without further configuration. ;SSH_TRUSTED_USER_CA_KEYS_FILENAME = ;; @@ -277,7 +277,7 @@ RUN_USER = ; git ;; Manual TLS settings: (Only applicable if ENABLE_ACME=false) ;; ;; Generate steps: -;; $ ./gitea cert -ca=true -duration=8760h0m0s -host=myhost.example.com +;; $ ./forgejo cert -ca=true -duration=8760h0m0s -host=myhost.example.com ;; ;; Or from a .pfx file exported from the Windows certificate store (do ;; not forget to export the private key): @@ -288,7 +288,7 @@ RUN_USER = ; git ;KEY_FILE = https/key.pem ;; ;; Root directory containing templates and static files. -;; default is the path where Gitea is executed +;; default is the path where Forgejo is executed ;STATIC_ROOT_PATH = ; Will default to the built-in value _`StaticRootPath`_ ;; ;; Default path for App data @@ -302,7 +302,7 @@ RUN_USER = ; git ;; For "serve" command it dumps to disk at PPROF_DATA_PATH as (cpuprofile|memprofile)__ ;ENABLE_PPROF = false ;; -;; PPROF_DATA_PATH, use an absolute path when you start gitea as service +;; PPROF_DATA_PATH, use an absolute path when you start Forgejo as service ;PPROF_DATA_PATH = data/tmp/pprof ; Path is relative to _`AppWorkPath`_ ;; ;; Landing page, can be "home", "explore", "organizations", "login", or any URL such as "/org/repo" or even "https://anotherwebsite.com" @@ -374,7 +374,7 @@ DB_TYPE = sqlite3 ;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. +;CHARSET_COLLATION = ; Empty as default, Forgejo will try to find a case-sensitive collation. Don't change it unless you clearly know what you need. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; @@ -440,7 +440,7 @@ SECRET_KEY = ;; This key is VERY IMPORTANT. If you lose it, the data encrypted by it (like 2FA secret) can't be decrypted anymore. ;SECRET_KEY_URI = file:/etc/gitea/secret_key ;; -;; Secret used to validate communication within Gitea binary. +;; Secret used to validate communication within Forgejo binary. INTERNAL_TOKEN = ;; ;; Alternative location to specify internal token, instead of this file; you cannot specify both this and INTERNAL_TOKEN, and must pick one @@ -474,9 +474,9 @@ INTERNAL_TOKEN = ;; ;; Set to false to allow users with git hook privileges to create custom git hooks. ;; Custom git hooks can be used to perform arbitrary code execution on the host operating system. -;; This enables the users to access and modify this config file and the Gitea database and interrupt the Gitea service. -;; By modifying the Gitea database, users can gain Gitea administrator privileges. -;; It also enables them to access other resources available to the user on the operating system that is running the Gitea instance and perform arbitrary actions in the name of the Gitea OS user. +;; This enables the users to access and modify this config file and the Forgejo database and interrupt the Forgejo service. +;; By modifying the Forgejo database, users can gain Forgejo administrator privileges. +;; It also enables them to access other resources available to the user on the operating system that is running the Forgejo instance and perform arbitrary actions in the name of the Forgejo OS user. ;; WARNING: This maybe harmful to you website or your operating system. ;; WARNING: Setting this to true does not change existing hooks in git repos; adjust it before if necessary. ;DISABLE_GIT_HOOKS = true @@ -484,7 +484,7 @@ INTERNAL_TOKEN = ;; Set to true to disable webhooks feature. ;DISABLE_WEBHOOKS = false ;; -;; Set to false to allow pushes to gitea repositories despite having an incomplete environment - NOT RECOMMENDED +;; Set to false to allow pushes to Forgejo repositories despite having an incomplete environment - NOT RECOMMENDED ;ONLY_ALLOW_PUSH_IF_GITEA_ENVIRONMENT_SET = true ;; ;;Comma separated list of character classes required to pass minimum complexity. @@ -545,7 +545,7 @@ ENABLED = true ;; The file must contain a RSA or ECDSA private key in the PKCS8 format. If no key exists a 4096 bit key will be created for you. ;JWT_SIGNING_PRIVATE_KEY_FILE = jwt/private.pem ;; -;; OAuth2 authentication secret for access and refresh tokens, change this yourself to a unique string. CLI generate option is helpful in this case. https://docs.gitea.io/en-us/command-line/#generate +;; OAuth2 authentication secret for access and refresh tokens, change this yourself to a unique string. CLI generate option is helpful in this case. https://forgejo.org/docs/latest/admin/command-line/#generate-secret ;; This setting is only needed if JWT_SIGNING_ALGORITHM is set to HS256, HS384 or HS512. ;JWT_SECRET = ;; @@ -670,7 +670,7 @@ LEVEL = Info ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -;; The path of git executable. If empty, Gitea searches through the PATH environment. +;; The path of git executable. If empty, Forgejo searches through the PATH environment. ;PATH = ;; ;; The HOME directory for Git @@ -755,17 +755,17 @@ LEVEL = Info ;; Whether a new user needs to be confirmed manually after registration. (Requires `REGISTER_EMAIL_CONFIRM` to be disabled.) ;REGISTER_MANUAL_CONFIRM = false ;; -;; List of domain names that are allowed to be used to register on a Gitea instance, wildcard is supported -;; eg: gitea.io,example.com,*.mydomain.com +;; List of domain names that are allowed to be used to register on a Forgejo instance, wildcard is supported +;; eg: forgejo.org,example.com,*.mydomain.com ;EMAIL_DOMAIN_ALLOWLIST = ;; -;; Comma-separated list of domain names that are not allowed to be used to register on a Gitea instance, wildcard is supported +;; Comma-separated list of domain names that are not allowed to be used to register on a Forgejo instance, wildcard is supported ;EMAIL_DOMAIN_BLOCKLIST = ;; ;; Disallow registration, only allow admins to create accounts. ;DISABLE_REGISTRATION = false ;; -;; Allow registration only using gitea itself, it works only when DISABLE_REGISTRATION is false +;; Allow registration only using Forgejo itself, it works only when DISABLE_REGISTRATION is false ;ALLOW_ONLY_INTERNAL_REGISTRATION = false ;; ;; Allow registration only using third-party services, it works only when DISABLE_REGISTRATION is false @@ -777,7 +777,7 @@ LEVEL = Info ;; Mail notification ;ENABLE_NOTIFY_MAIL = false ;; -;; This setting enables gitea to be signed in with HTTP BASIC Authentication using the user's password +;; This setting enables Forgejo to be signed in with HTTP BASIC Authentication using the user's password ;; If you set this to false you will not be able to access the tokens endpoints on the API with your password ;; Please note that setting this to false will not disable OAuth Basic or Basic authentication using a token ;ENABLE_BASIC_AUTHENTICATION = true @@ -1012,7 +1012,7 @@ LEVEL = Info ;; Close issues as long as a commit on any branch marks it as fixed ;DEFAULT_CLOSE_ISSUES_VIA_COMMITS_IN_ANY_BRANCH = false ;; -;; Allow users to push local repositories to Gitea and have them automatically created for a user or an org +;; Allow users to push local repositories to Forgejo and have them automatically created for a user or an org ;ENABLE_PUSH_CREATE_USER = false ;ENABLE_PUSH_CREATE_ORG = false ;; @@ -1076,7 +1076,7 @@ LEVEL = Info ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -;; Path for local repository copy. Defaults to `tmp/local-repo` (content gets deleted on gitea restart) +;; Path for local repository copy. Defaults to `tmp/local-repo` (content gets deleted on Forgejo restart) ;LOCAL_COPY_PATH = tmp/local-repo ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1088,7 +1088,7 @@ LEVEL = Info ;; Whether repository file uploads are enabled. Defaults to `true` ;ENABLED = true ;; -;; Path for uploads. Defaults to `data/tmp/uploads` (content gets deleted on gitea restart) +;; Path for uploads. Defaults to `data/tmp/uploads` (content gets deleted on Forgejo restart) ;TEMP_PATH = data/tmp/uploads ;; ;; Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types. @@ -1187,7 +1187,7 @@ LEVEL = Info ;; Sets the default trust model for repositories. Options are: collaborator, committer, collaboratorcommitter ;DEFAULT_TRUST_MODEL = collaborator ;; -;; Determines when gitea should sign the initial commit when creating a repository +;; Determines when Forgejo should sign the initial commit when creating a repository ;; Either: ;; - never ;; - pubkey: only sign if the user has a pubkey @@ -1301,7 +1301,7 @@ LEVEL = Info ;; Whether the email of the user should be shown in the Explore Users page ;SHOW_USER_EMAIL = true ;; -;; Set the default theme for the Gitea install +;; Set the default theme for the Forgejo install ;DEFAULT_THEME = forgejo-auto ;; ;; All available themes. Allow users select personalized themes regardless of the value of `DEFAULT_THEME`. @@ -1706,10 +1706,10 @@ LEVEL = Info ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -;; NOTICE: this section is for Gitea 1.18 and later. If you are using Gitea 1.17 or older, +;; NOTICE: this section is for Forgejo 1.18 and later. If you are using Forgejo 1.17 or older, ;; please refer to -;; https://github.com/go-gitea/gitea/blob/release/v1.17/custom/conf/app.example.ini -;; https://github.com/go-gitea/gitea/blob/release/v1.17/docs/content/doc/advanced/config-cheat-sheet.en-us.md +;; https://codeberg.org/forgejo/forgejo/src/commit/8769df117d6cc2f4ab00d6e1d54ef4241d063f11/custom/conf/app.example.ini +;; https://codeberg.org/forgejo/forgejo/src/commit/8769df117d6cc2f4ab00d6e1d54ef4241d063f11/docs/content/doc/advanced/config-cheat-sheet.en-us.md ;; ;ENABLED = false ;; @@ -1762,7 +1762,7 @@ LEVEL = Info ;; Sometimes it is helpful to use a different address on the envelope. Set this to use ENVELOPE_FROM as the from on the envelope. Set to `<>` to send an empty address. ;ENVELOPE_FROM = ;; -;; If gitea sends mails on behave of users, it will just use the name also displayed in the WebUI. If you want e.g. `Mister X (by CodeIt) `, +;; If Forgejo sends mails on behave of users, it will just use the name also displayed in the WebUI. If you want e.g. `John Doe (by AppName) `, ;; set it to `{{ .DisplayName }} (by {{ .AppName }})`. Available Variables: `.DisplayName`, `.AppName` and `.Domain`. ;FROM_DISPLAY_NAME_FORMAT = {{ .DisplayName }} ;; @@ -1923,7 +1923,7 @@ LEVEL = Info ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -;; How Gitea deals with missing repository avatars +;; How Forgejo deals with missing repository avatars ;; none = no avatar will be displayed; random = random avatar will be displayed; image = default image will be used ;REPOSITORY_AVATAR_FALLBACK = none ;REPOSITORY_AVATAR_FALLBACK_IMAGE = /img/repo_default.png @@ -2041,7 +2041,7 @@ LEVEL = Info ;; ;; Setting this to true will enable all cron tasks periodically with default settings. ;ENABLED = false -;; Setting this to true will run all enabled cron tasks when Gitea starts. +;; Setting this to true will run all enabled cron tasks when Forgejo starts. ;RUN_AT_START = false ;; ;; Note: ``SCHEDULE`` accept formats @@ -2081,7 +2081,7 @@ LEVEL = Info ;SCHEDULE = @every 10m ;; Enable running Update mirrors task periodically. ;ENABLED = true -;; Run Update mirrors task when Gitea starts. +;; Run Update mirrors task when Forgejo starts. ;RUN_AT_START = false ;; Notice if not success ;NOTICE_ON_SUCCESS = false @@ -2102,7 +2102,7 @@ LEVEL = Info ;SCHEDULE = @midnight ;; Enable running Repository health check task periodically. ;ENABLED = true -;; Run Repository health check task when Gitea starts. +;; Run Repository health check task when Forgejo starts. ;RUN_AT_START = false ;; Notice if not success ;NOTICE_ON_SUCCESS = false @@ -2120,7 +2120,7 @@ LEVEL = Info ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Enable running check repository statistics task periodically. ;ENABLED = true -;; Run check repository statistics task when Gitea starts. +;; Run check repository statistics task when Forgejo starts. ;RUN_AT_START = true ;; Notice if not success ;NOTICE_ON_SUCCESS = false @@ -2275,7 +2275,7 @@ LEVEL = Info ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Update the '.ssh/authorized_keys' file with Gitea SSH keys +;; Update the '.ssh/authorized_keys' file with Forgejo SSH keys ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;[cron.resync_all_sshkeys] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -2348,7 +2348,7 @@ LEVEL = Info ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Check for new Gitea versions +;; Check for new Forgejo versions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;[cron.update_checker] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -2449,7 +2449,7 @@ LEVEL = Info ;[other] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Show version information about Gitea and Go in the footer +;; Show version information about Forgejo and Go in the footer ;SHOW_FOOTER_VERSION = true ;; Show template execution time in the footer ;SHOW_FOOTER_TEMPLATE_LOAD_TIME = true @@ -2700,7 +2700,7 @@ LEVEL = Info ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; settings for Gitea's LFS client (eg: mirroring an upstream lfs endpoint) +;; settings for Forgejo's LFS client (eg: mirroring an upstream lfs endpoint) ;; ;[lfs_client] ;; Limit the number of pointers in each batch request to this number diff --git a/eslint.config.mjs b/eslint.config.mjs index 83a6b6bee1..61987aef14 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -58,7 +58,14 @@ export default tseslint.config( sourceType: 'module', }, rules: { - '@typescript-eslint/no-unused-vars': 'off', // TODO: enable this rule again + '@typescript-eslint/no-unused-vars': [2, { + args: 'all', + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + ignoreRestSiblings: false, + }], '@eslint-community/eslint-comments/disable-enable-pair': [2], '@eslint-community/eslint-comments/no-aggregating-enable': [2], @@ -539,14 +546,7 @@ export default tseslint.config( 'no-unused-labels': [2], 'no-unused-private-class-members': [2], - 'no-unused-vars': [2, { - args: 'all', - argsIgnorePattern: '^_', - varsIgnorePattern: '^_', - caughtErrorsIgnorePattern: '^_', - destructuredArrayIgnorePattern: '^_', - ignoreRestSiblings: false, - }], + 'no-unused-vars': [0], 'no-use-before-define': [2, { functions: false, @@ -703,7 +703,6 @@ export default tseslint.config( '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], @@ -1083,6 +1082,7 @@ export default tseslint.config( '@vitest/no-standalone-expect': [0], '@vitest/no-test-prefixes': [0], '@vitest/no-test-return-statement': [0], + '@vitest/prefer-called-exactly-once-with': [2], '@vitest/prefer-called-with': [0], '@vitest/prefer-comparison-matcher': [0], '@vitest/prefer-each': [0], @@ -1090,6 +1090,7 @@ export default tseslint.config( '@vitest/prefer-expect-resolves': [0], '@vitest/prefer-hooks-in-order': [0], '@vitest/prefer-hooks-on-top': [2], + '@vitest/prefer-import-in-mock': [0], '@vitest/prefer-lowercase-title': [0], '@vitest/prefer-mock-promise-shorthand': [0], '@vitest/prefer-snapshot-hint': [0], diff --git a/go.mod b/go.mod index dfeeb30451..0447813724 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module forgejo.org go 1.24.0 -toolchain go1.24.7 +toolchain go1.25.3 require ( code.forgejo.org/f3/gof3/v3 v3.11.1 @@ -17,8 +17,10 @@ require ( code.forgejo.org/go-chi/session v1.0.2 code.gitea.io/actions-proto-go v0.4.0 code.gitea.io/sdk/gitea v0.21.0 + code.superseriousbusiness.org/exif-terminator v0.11.0 + code.superseriousbusiness.org/go-jpeg-image-structure/v2 v2.3.0 codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570 - connectrpc.com/connect v1.18.1 + connectrpc.com/connect v1.19.1 github.com/42wim/httpsig v1.2.3 github.com/42wim/sshsig v0.0.0-20250502153856-5100632e8920 github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 @@ -34,6 +36,7 @@ require ( 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/dsoprea/go-exif/v3 v3.0.1 github.com/dustin/go-humanize v1.0.1 github.com/editorconfig/editorconfig-core-go/v2 v2.6.3 github.com/emersion/go-imap v1.2.1 @@ -47,7 +50,7 @@ require ( github.com/go-co-op/gocron v1.37.0 github.com/go-enry/go-enry/v2 v2.9.2 github.com/go-ldap/ldap/v3 v3.4.6 - github.com/go-openapi/spec v0.21.0 + github.com/go-openapi/spec v0.22.0 github.com/go-sql-driver/mysql v1.9.3 github.com/go-webauthn/webauthn v0.14.0 github.com/gobwas/glob v0.2.3 @@ -74,7 +77,7 @@ require ( github.com/mattn/go-isatty v0.0.20 github.com/mattn/go-sqlite3 v1.14.32 github.com/meilisearch/meilisearch-go v0.34.0 - github.com/mholt/archives v0.1.4 + github.com/mholt/archives v0.1.5 github.com/microcosm-cc/bluemonday v1.0.27 github.com/minio/minio-go/v7 v7.0.95 github.com/msteinert/pam/v2 v2.1.0 @@ -99,13 +102,13 @@ require ( gitlab.com/gitlab-org/api/client-go v0.143.2 go.uber.org/mock v0.6.0 go.yaml.in/yaml/v3 v3.0.4 - golang.org/x/crypto v0.42.0 - golang.org/x/image v0.31.0 - golang.org/x/net v0.44.0 - golang.org/x/oauth2 v0.31.0 + golang.org/x/crypto v0.43.0 + golang.org/x/image v0.32.0 + golang.org/x/net v0.46.0 + golang.org/x/oauth2 v0.32.0 golang.org/x/sync v0.17.0 - golang.org/x/sys v0.36.0 - golang.org/x/text v0.29.0 + golang.org/x/sys v0.37.0 + golang.org/x/text v0.30.0 google.golang.org/protobuf v1.36.10 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/ini.v1 v1.67.0 @@ -116,6 +119,7 @@ require ( require ( cloud.google.com/go/compute/metadata v0.6.0 // indirect + code.superseriousbusiness.org/go-png-image-structure/v2 v2.3.0 // indirect dario.cat/mergo v1.0.2 // indirect filippo.io/edwards25519 v1.1.0 // indirect git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect @@ -145,7 +149,7 @@ require ( github.com/blevesearch/zapx/v14 v14.4.2 // indirect github.com/blevesearch/zapx/v15 v15.4.2 // indirect github.com/blevesearch/zapx/v16 v16.2.4 // indirect - github.com/bmatcuk/doublestar/v4 v4.8.0 // indirect + github.com/bmatcuk/doublestar/v4 v4.9.1 // indirect github.com/bodgit/plumbing v1.3.0 // indirect github.com/bodgit/sevenzip v1.6.1 // indirect github.com/bodgit/windows v1.0.1 // indirect @@ -160,6 +164,10 @@ require ( 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.5 // indirect + github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb // indirect + github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect + github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c // indirect + github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 // 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.18.0 // indirect @@ -167,17 +175,26 @@ require ( 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-errors/errors v1.4.2 // indirect github.com/go-fed/httpsig v1.1.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-git/go-git/v5 v5.16.2 // indirect github.com/go-ini/ini v1.67.0 // indirect - github.com/go-openapi/jsonpointer v0.21.1 // indirect - github.com/go-openapi/jsonreference v0.21.0 // indirect - github.com/go-openapi/swag v0.23.1 // indirect + github.com/go-openapi/jsonpointer v0.22.1 // indirect + github.com/go-openapi/jsonreference v0.21.2 // indirect + github.com/go-openapi/swag/conv v0.25.1 // indirect + github.com/go-openapi/swag/jsonname v0.25.1 // indirect + github.com/go-openapi/swag/jsonutils v0.25.1 // indirect + github.com/go-openapi/swag/loading v0.25.1 // indirect + github.com/go-openapi/swag/stringutils v0.25.1 // indirect + github.com/go-openapi/swag/typeutils v0.25.1 // indirect + github.com/go-openapi/swag/yamlutils v0.25.1 // indirect github.com/go-webauthn/x v0.1.25 // indirect + github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect + github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect @@ -198,7 +215,7 @@ require ( github.com/mailru/easyjson v0.9.0 // indirect github.com/markbates/going v1.0.3 // indirect github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-runewidth v0.0.17 // indirect github.com/mattn/go-shellwords v1.0.12 // indirect github.com/mholt/acmez/v3 v3.1.2 // indirect github.com/miekg/dns v1.1.63 // indirect @@ -212,7 +229,7 @@ require ( 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/v2 v2.1.1 // indirect + github.com/nwaples/rardecode/v2 v2.2.0 // indirect github.com/olekukonko/errors v1.1.0 // indirect github.com/olekukonko/ll v0.0.9 // indirect github.com/olekukonko/tablewriter v1.0.7 // indirect @@ -225,13 +242,13 @@ require ( github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect - github.com/rhysd/actionlint v1.7.7 // indirect + github.com/rhysd/actionlint v1.7.8 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rs/xid v1.6.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/skeema/knownhosts v1.3.1 // indirect github.com/sorairolake/lzip-go v0.3.8 // indirect - github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/afero v1.15.0 // indirect github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect github.com/tinylib/msgp v1.3.0 // indirect github.com/x448/float16 v0.8.4 // indirect @@ -243,12 +260,14 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go.uber.org/zap/exp v0.3.0 // indirect + go.yaml.in/yaml/v4 v4.0.0-rc.2 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect - golang.org/x/mod v0.27.0 // indirect + golang.org/x/mod v0.29.0 // indirect golang.org/x/time v0.13.0 // indirect - golang.org/x/tools v0.36.0 // indirect + golang.org/x/tools v0.38.0 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index f24e204f07..b49d14a809 100644 --- a/go.sum +++ b/go.sum @@ -46,10 +46,16 @@ code.gitea.io/actions-proto-go v0.4.0 h1:OsPBPhodXuQnsspG1sQ4eRE1PeoZyofd7+i73zC code.gitea.io/actions-proto-go v0.4.0/go.mod h1:mn7Wkqz6JbnTOHQpot3yDeHx+O5C9EGhMEE+htvHBas= code.gitea.io/sdk/gitea v0.21.0 h1:69n6oz6kEVHRo1+APQQyizkhrZrLsTLXey9142pfkD4= code.gitea.io/sdk/gitea v0.21.0/go.mod h1:tnBjVhuKJCn8ibdyyhvUyxrR1Ca2KHEoTWoukNhXQPA= +code.superseriousbusiness.org/exif-terminator v0.11.0 h1:Hof0MCcsa+1fS17gf86fTTZ8AQnMY9h9kzcc+2C6mVg= +code.superseriousbusiness.org/exif-terminator v0.11.0/go.mod h1:9sutT1axa/kSdlPLlRFjCNKmyo/KNx8eX3XZvWBlAEY= +code.superseriousbusiness.org/go-jpeg-image-structure/v2 v2.3.0 h1:r9uq8StaSHYKJ8DklR9Xy+E9c40G1Z8yj5TRGi8L6+4= +code.superseriousbusiness.org/go-jpeg-image-structure/v2 v2.3.0/go.mod h1:IK1OlR6APjVB3E9tuYGvf0qXMrwP+TrzcHS5rf4wffQ= +code.superseriousbusiness.org/go-png-image-structure/v2 v2.3.0 h1:I512jiIeXDC4//2BeSPrRM2ZS4wpBKUaPeTPxakMNGA= +code.superseriousbusiness.org/go-png-image-structure/v2 v2.3.0/go.mod h1:SNHomXNW88o1pFfLHpD4KsCZLfcr4z5dm+xcX5SV10A= 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.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw= -connectrpc.com/connect v1.18.1/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8= +connectrpc.com/connect v1.19.1 h1:R5M57z05+90EfEvCY1b7hBxDVOUl45PrtXtAV2fOC14= +connectrpc.com/connect v1.19.1/go.mod h1:tN20fjdGlewnSFeZxLKb0xwIZ6ozc3OQs2hTXy4du9w= dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -143,8 +149,8 @@ github.com/blevesearch/zapx/v15 v15.4.2 h1:sWxpDE0QQOTjyxYbAVjt3+0ieu8NCE0fDRaFx github.com/blevesearch/zapx/v15 v15.4.2/go.mod h1:1pssev/59FsuWcgSnTa0OeEpOzmhtmr/0/11H0Z8+Nw= github.com/blevesearch/zapx/v16 v16.2.4 h1:tGgfvleXTAkwsD5mEzgM3zCS/7pgocTCnO1oyAUjlww= github.com/blevesearch/zapx/v16 v16.2.4/go.mod h1:Rti/REtuuMmzwsI8/C/qIzRaEoSK/wiFYw5e5ctUKKs= -github.com/bmatcuk/doublestar/v4 v4.8.0 h1:DSXtrypQddoug1459viM9X9D3dp1Z7993fw36I2kNcQ= -github.com/bmatcuk/doublestar/v4 v4.8.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bmatcuk/doublestar/v4 v4.9.1 h1:X8jg9rRZmJd4yRy7ZeNDRnM+T3ZfHv15JiBJ/avrEXE= +github.com/bmatcuk/doublestar/v4 v4.9.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU= github.com/bodgit/plumbing v1.3.0/go.mod h1:JOTb4XiRu5xfnmdnDJo6GmSbSbtSyufrsyZFByMtKEs= github.com/bodgit/sevenzip v1.6.1 h1:kikg2pUMYC9ljU7W9SaqHXhym5HyKm8/M/jd31fYan4= @@ -209,6 +215,28 @@ github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cn 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/dsoprea/go-exif/v2 v2.0.0-20200321225314-640175a69fe4/go.mod h1:Lm2lMM2zx8p4a34ZemkaUV95AnMl4ZvLbCUbwOvLC2E= +github.com/dsoprea/go-exif/v3 v3.0.0-20200717053412-08f1b6708903/go.mod h1:0nsO1ce0mh5czxGeLo4+OCZ/C6Eo6ZlMWsz7rH/Gxv8= +github.com/dsoprea/go-exif/v3 v3.0.0-20210428042052-dca55bf8ca15/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk= +github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk= +github.com/dsoprea/go-exif/v3 v3.0.0-20221003160559-cf5cd88aa559/go.mod h1:rW6DMEv25U9zCtE5ukC7ttBRllXj7g7TAHl7tQrT5No= +github.com/dsoprea/go-exif/v3 v3.0.0-20221003171958-de6cb6e380a8/go.mod h1:akyZEJZ/k5bmbC9gA612ZLQkcED8enS9vuTiuAkENr0= +github.com/dsoprea/go-exif/v3 v3.0.1 h1:/IE4iW7gvY7BablV1XY0unqhMv26EYpOquVMwoBo/wc= +github.com/dsoprea/go-exif/v3 v3.0.1/go.mod h1:10HkA1Wz3h398cDP66L+Is9kKDmlqlIJGPv8pk4EWvc= +github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb h1:gwjJjUr6FY7zAWVEueFPrcRHhd9+IK81TcItbqw2du4= +github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb/go.mod h1:kYIdx9N9NaOyD7U6D+YtExN7QhRm+5kq7//yOsRXQtM= +github.com/dsoprea/go-logging v0.0.0-20190624164917-c4f10aab7696/go.mod h1:Nm/x2ZUNRW6Fe5C3LxdY1PyZY5wmDv/s5dkPJ/VB3iA= +github.com/dsoprea/go-logging v0.0.0-20200517223158-a10564966e9d/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8= +github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd h1:l+vLbuxptsC6VQyQsfD7NnEC8BZuFpz45PgY+pH8YTg= +github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8= +github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c h1:7j5aWACOzROpr+dvMtu8GnI97g9ShLWD72XIELMgn+c= +github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c/go.mod h1:pqKB+ijp27cEcrHxhXVgUUMlSDRuGJJp1E+20Lj5H0E= +github.com/dsoprea/go-utility v0.0.0-20200711062821-fab8125e9bdf/go.mod h1:95+K3z2L0mqsVYd6yveIv1lmtT3tcQQ3dVakPySffW8= +github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e/go.mod h1:uAzdkPTub5Y9yQwXe8W4m2XuP0tK4a9Q/dantD0+uaU= +github.com/dsoprea/go-utility/v2 v2.0.0-20221003142440-7a1927d49d9d/go.mod h1:LVjRU0RNUuMDqkPTxcALio0LWPFPXxxFCvVGVAwEpFc= +github.com/dsoprea/go-utility/v2 v2.0.0-20221003160719-7bc88537c05e/go.mod h1:VZ7cB0pTjm1ADBWhJUOHESu4ZYy9JN+ZPqjfiW09EPU= +github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 h1:DilThiXje0z+3UQ5YjYiSRRzVdtamFpvBQXKwMglWqw= +github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349/go.mod h1:4GC5sXji84i/p+irqghpPFZBF8tRN/Q7+700G0/DLe8= 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= @@ -258,6 +286,11 @@ github.com/go-enry/go-enry/v2 v2.9.2 h1:giOQAtCgBX08kosrX818DCQJTCNtKwoPBGu0qb6n github.com/go-enry/go-enry/v2 v2.9.2/go.mod h1:9yrj4ES1YrbNb1Wb7/PWYr2bpaCXUGRt0uafN0ISyG8= github.com/go-enry/go-oniguruma v1.2.1 h1:k8aAMuJfMrqm/56SG2lV9Cfti6tC4x8673aHCcBk+eo= github.com/go-enry/go-oniguruma v1.2.1/go.mod h1:bWDhYP+S6xZQgiRL7wlTScFYBe023B6ilRZbCAD5Hf4= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-errors/errors v1.0.2/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= +github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI= github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= @@ -274,14 +307,28 @@ 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/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= -github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= -github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= -github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= -github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= -github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= -github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= +github.com/go-openapi/jsonpointer v0.22.1 h1:sHYI1He3b9NqJ4wXLoJDKmUmHkWy/L7rtEo92JUxBNk= +github.com/go-openapi/jsonpointer v0.22.1/go.mod h1:pQT9OsLkfz1yWoMgYFy4x3U5GY5nUlsOn1qSBH5MkCM= +github.com/go-openapi/jsonreference v0.21.2 h1:Wxjda4M/BBQllegefXrY/9aq1fxBA8sI5M/lFU6tSWU= +github.com/go-openapi/jsonreference v0.21.2/go.mod h1:pp3PEjIsJ9CZDGCNOyXIQxsNuroxm8FAJ/+quA0yKzQ= +github.com/go-openapi/spec v0.22.0 h1:xT/EsX4frL3U09QviRIZXvkh80yibxQmtoEvyqug0Tw= +github.com/go-openapi/spec v0.22.0/go.mod h1:K0FhKxkez8YNS94XzF8YKEMULbFrRw4m15i2YUht4L0= +github.com/go-openapi/swag/conv v0.25.1 h1:+9o8YUg6QuqqBM5X6rYL/p1dpWeZRhoIt9x7CCP+he0= +github.com/go-openapi/swag/conv v0.25.1/go.mod h1:Z1mFEGPfyIKPu0806khI3zF+/EUXde+fdeksUl2NiDs= +github.com/go-openapi/swag/jsonname v0.25.1 h1:Sgx+qbwa4ej6AomWC6pEfXrA6uP2RkaNjA9BR8a1RJU= +github.com/go-openapi/swag/jsonname v0.25.1/go.mod h1:71Tekow6UOLBD3wS7XhdT98g5J5GR13NOTQ9/6Q11Zo= +github.com/go-openapi/swag/jsonutils v0.25.1 h1:AihLHaD0brrkJoMqEZOBNzTLnk81Kg9cWr+SPtxtgl8= +github.com/go-openapi/swag/jsonutils v0.25.1/go.mod h1:JpEkAjxQXpiaHmRO04N1zE4qbUEg3b7Udll7AMGTNOo= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.1 h1:DSQGcdB6G0N9c/KhtpYc71PzzGEIc/fZ1no35x4/XBY= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.1/go.mod h1:kjmweouyPwRUEYMSrbAidoLMGeJ5p6zdHi9BgZiqmsg= +github.com/go-openapi/swag/loading v0.25.1 h1:6OruqzjWoJyanZOim58iG2vj934TysYVptyaoXS24kw= +github.com/go-openapi/swag/loading v0.25.1/go.mod h1:xoIe2EG32NOYYbqxvXgPzne989bWvSNoWoyQVWEZicc= +github.com/go-openapi/swag/stringutils v0.25.1 h1:Xasqgjvk30eUe8VKdmyzKtjkVjeiXx1Iz0zDfMNpPbw= +github.com/go-openapi/swag/stringutils v0.25.1/go.mod h1:JLdSAq5169HaiDUbTvArA2yQxmgn4D6h4A+4HqVvAYg= +github.com/go-openapi/swag/typeutils v0.25.1 h1:rD/9HsEQieewNt6/k+JBwkxuAHktFtH3I3ysiFZqukA= +github.com/go-openapi/swag/typeutils v0.25.1/go.mod h1:9McMC/oCdS4BKwk2shEB7x17P6HmMmA6dQRtAkSnNb8= +github.com/go-openapi/swag/yamlutils v0.25.1 h1:mry5ez8joJwzvMbaTGLhw8pXUnhDK91oSJLDPF1bmGk= +github.com/go-openapi/swag/yamlutils v0.25.1/go.mod h1:cm9ywbzncy3y6uPm/97ysW8+wZ09qsks+9RS8fLWKqg= github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -291,6 +338,8 @@ github.com/go-webauthn/webauthn v0.14.0 h1:ZLNPUgPcDlAeoxe+5umWG/tEeCoQIDr7gE2Zx github.com/go-webauthn/webauthn v0.14.0/go.mod h1:QZzPFH3LJ48u5uEPAu+8/nWJImoLBWM7iAH/kSVSo6k= github.com/go-webauthn/x v0.1.25 h1:g/0noooIGcz/yCVqebcFgNnGIgBlJIccS+LYAa+0Z88= github.com/go-webauthn/x v0.1.25/go.mod h1:ieblaPY1/BVCV0oQTsA/VAo08/TWayQuJuo5Q+XxmTY= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= 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= @@ -308,6 +357,10 @@ github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9v github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 h1:gtexQ/VGyN+VVFRXSFiguSNcXmS6rkKT+X7FdIrTtfo= +github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -404,6 +457,8 @@ github.com/inbucket/html2text v0.9.0 h1:ULJmVcBEMAcmLE+/rN815KG1Fx6+a4HhbUxiDiN+ github.com/inbucket/html2text v0.9.0/go.mod h1:QDaumzl+/OzlSVbNohhmg+yAy5pKjUjzCKW2BMvztKE= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jhillyerd/enmime/v2 v2.2.0 h1:Pe35MB96eZK5Q0XjlvPftOgWypQpd1gcbfJKAt7rsB8= github.com/jhillyerd/enmime/v2 v2.2.0/go.mod h1:SOBXlCemjhiV2DvHhAKnJiWrtJGS/Ffuw4Iy7NjBTaI= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -453,8 +508,8 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.17 h1:78v8ZlW0bP43XfmAfPsdXcoNCelfMHsDmd/pkENfrjQ= +github.com/mattn/go-runewidth v0.0.17/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= @@ -463,8 +518,8 @@ github.com/meilisearch/meilisearch-go v0.34.0 h1:P+Ohdx4/PCxXaoI5wNi0LMwPkuiNrF/ github.com/meilisearch/meilisearch-go v0.34.0/go.mod h1:cUVJZ2zMqTvvwIMEEAdsWH+zrHsrLpAw6gm8Lt1MXK0= github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc= github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ= -github.com/mholt/archives v0.1.4 h1:sU+/lLNgafUontWFv3AVwO8VUWye3rrtN6hgC2dU11c= -github.com/mholt/archives v0.1.4/go.mod h1:I2ia+SQTtQHej9w1GZM/mz7qfdgQv+BHr3hEKqDcGuk= +github.com/mholt/archives v0.1.5 h1:Fh2hl1j7VEhc6DZs2DLMgiBNChUux154a1G+2esNvzQ= +github.com/mholt/archives v0.1.5/go.mod h1:3TPMmBLPsgszL+1As5zECTuKwKvIfj6YcwWPpeTAXF4= 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= @@ -498,8 +553,8 @@ github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdh github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/niklasfasching/go-org v1.9.1 h1:/3s4uTPOF06pImGa2Yvlp24yKXZoTYM+nsIlMzfpg/0= github.com/niklasfasching/go-org v1.9.1/go.mod h1:ZAGFFkWvUQcpazmi/8nHqwvARpr1xpb+Es67oUGX/48= -github.com/nwaples/rardecode/v2 v2.1.1 h1:OJaYalXdliBUXPmC8CZGQ7oZDxzX1/5mQmgn0/GASew= -github.com/nwaples/rardecode/v2 v2.1.1/go.mod h1:7uz379lSxPe6j9nvzxUZ+n7mnJNgjsRNb6IbvGVHRmw= +github.com/nwaples/rardecode/v2 v2.2.0 h1:4ufPGHiNe1rYJxYfehALLjup4Ls3ck42CWwjKiOqu0A= +github.com/nwaples/rardecode/v2 v2.2.0/go.mod h1:7uz379lSxPe6j9nvzxUZ+n7mnJNgjsRNb6IbvGVHRmw= 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= @@ -553,8 +608,8 @@ github.com/redis/go-redis/v9 v9.8.0 h1:q3nRvjrlge/6UD7eTu/DSg2uYiU2mCL0G/uzBWqhi github.com/redis/go-redis/v9 v9.8.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rhysd/actionlint v1.7.7 h1:0KgkoNTrYY7vmOCs9BW2AHxLvvpoY9nEUzgBHiPUr0k= -github.com/rhysd/actionlint v1.7.7/go.mod h1:AE6I6vJEkNaIfWqC2GNE5spIJNhxf8NCtLEKU4NnUXg= +github.com/rhysd/actionlint v1.7.8 h1:3d+N9ourgAxVYG4z2IFxFIk/YiT6V+VnKASfXGwT60E= +github.com/rhysd/actionlint v1.7.8/go.mod h1:3kiS6egcbXG+vQsJIhFxTz+UKaF1JprsE0SKrpCZKvU= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -580,8 +635,8 @@ github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnB github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= github.com/sorairolake/lzip-go v0.3.8 h1:j5Q2313INdTA80ureWYRhX+1K78mUXfMoPZCw/ivWik= github.com/sorairolake/lzip-go v0.3.8/go.mod h1:JcBqGMV0frlxwrsE9sMWXDjqn3EeVf0/54YPsw66qkU= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= 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= @@ -655,6 +710,8 @@ go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U= go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +go.yaml.in/yaml/v4 v4.0.0-rc.2 h1:/FrI8D64VSr4HtGIlUtlFMGsm7H7pWTbj6vOLVZcA6s= +go.yaml.in/yaml/v4 v4.0.0-rc.2/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= go4.org v0.0.0-20230225012048-214862532bf5 h1:nifaUDeh+rPaBCMPMQHZmvJf+QdpLFnuQPwx+LxVmtc= go4.org v0.0.0-20230225012048-214862532bf5/go.mod h1:F57wTi5Lrj6WLyswp5EYV1ncrEbFGHD4hhz6S1ZYeaU= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -669,8 +726,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -683,8 +740,8 @@ golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/y golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.31.0 h1:mLChjE2MV6g1S7oqbXC0/UcKijjm5fnJLUYKIYrLESA= -golang.org/x/image v0.31.0/go.mod h1:R9ec5Lcp96v9FTF+ajwaH3uGxPH4fKfHHAVbUILxghA= +golang.org/x/image v0.32.0 h1:6lZQWq75h7L5IWNk0r+SCpUJ6tUVd3v4ZHnbRKLkUDQ= +golang.org/x/image v0.32.0/go.mod h1:/R37rrQmKXtO6tYXAjtDLwQgFLHmhW+V6ayXlxzP2Pc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -706,8 +763,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= -golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -722,11 +779,16 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/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.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= 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.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= @@ -734,15 +796,15 @@ 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.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= -golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo= -golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= +golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -780,12 +842,15 @@ 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= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -793,8 +858,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= 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= @@ -804,8 +869,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= -golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -819,8 +884,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= @@ -854,8 +919,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= 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= @@ -921,8 +986,10 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 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.7/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= diff --git a/models/actions/run.go b/models/actions/run.go index 6ab1a666b3..2d83806b98 100644 --- a/models/actions/run.go +++ b/models/actions/run.go @@ -218,6 +218,7 @@ func updateRepoRunsNumbers(ctx context.Context, repo *repo_model.Repository) err ), ), ). + Cols("num_action_runs", "num_closed_action_runs"). Update(repo) return err } diff --git a/models/actions/run_test.go b/models/actions/run_test.go index a305dcf2fc..834d1595ae 100644 --- a/models/actions/run_test.go +++ b/models/actions/run_test.go @@ -6,7 +6,11 @@ package actions import ( "testing" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestGetRunBefore(t *testing.T) { @@ -36,3 +40,49 @@ func TestSetDefaultConcurrencyGroup(t *testing.T) { run.SetDefaultConcurrencyGroup() assert.Equal(t, "refs/heads/main_testing_pull_request__auto", run.ConcurrencyGroup) } + +func TestUpdateRepoRunsNumbers(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + t.Run("Normal", func(t *testing.T) { + t.Run("Repo 1", func(t *testing.T) { + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + + require.NoError(t, updateRepoRunsNumbers(t.Context(), repo)) + + repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + assert.Equal(t, 1, repo.NumActionRuns) + assert.Equal(t, 1, repo.NumClosedActionRuns) + }) + + t.Run("Repo 4", func(t *testing.T) { + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4}) + + require.NoError(t, updateRepoRunsNumbers(t.Context(), repo)) + + repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4}) + assert.Equal(t, 4, repo.NumActionRuns) + assert.Equal(t, 4, repo.NumClosedActionRuns) + }) + + t.Run("Repo 63", func(t *testing.T) { + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 63}) + + require.NoError(t, updateRepoRunsNumbers(t.Context(), repo)) + + repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 63}) + assert.Equal(t, 3, repo.NumActionRuns) + assert.Equal(t, 2, repo.NumClosedActionRuns) + }) + }) + + t.Run("Columns specifc", func(t *testing.T) { + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + repo.Name = "ishouldnotbeupdated" + + require.NoError(t, updateRepoRunsNumbers(t.Context(), repo)) + + repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + assert.Equal(t, "repo1", repo.Name) + }) +} diff --git a/models/auth/access_token.go b/models/auth/access_token.go index 695702b7a0..2bdb5357c5 100644 --- a/models/auth/access_token.go +++ b/models/auth/access_token.go @@ -127,6 +127,13 @@ func (t *AccessToken) DisplayPublicOnly() bool { return publicOnly } +// UpdateLastUsed updates the time this token was last used to now. +func (t *AccessToken) UpdateLastUsed(ctx context.Context) error { + t.UpdatedUnix = timeutil.TimeStampNow() + _, err := db.GetEngine(ctx).ID(t.ID).Cols("updated_unix").NoAutoTime().Update(t) + return err +} + func getAccessTokenIDFromCache(token string) int64 { if successfulAccessTokenCache == nil { return 0 @@ -220,12 +227,6 @@ func (opts ListAccessTokensOptions) ToOrders() string { return "created_unix DESC" } -// UpdateAccessToken updates information of access token. -func UpdateAccessToken(ctx context.Context, t *AccessToken) error { - _, err := db.GetEngine(ctx).ID(t.ID).AllCols().Update(t) - return err -} - // DeleteAccessTokenByID deletes access token by given ID. func DeleteAccessTokenByID(ctx context.Context, id, userID int64) error { cnt, err := db.GetEngine(ctx).ID(id).Delete(&AccessToken{ @@ -258,5 +259,6 @@ func RegenerateAccessTokenByID(ctx context.Context, id, userID int64) (*AccessTo // Reset the creation time, token is unused t.UpdatedUnix = timeutil.TimeStampNow() - return t, UpdateAccessToken(ctx, t) + _, err = db.GetEngine(ctx).ID(t.ID).Cols("token_salt", "token", "token_hash", "token_last_eight", "updated_unix").NoAutoTime().Update(t) + return t, err } diff --git a/models/auth/access_token_test.go b/models/auth/access_token_test.go index 913118433c..18e0fd3342 100644 --- a/models/auth/access_token_test.go +++ b/models/auth/access_token_test.go @@ -5,10 +5,12 @@ package auth_test import ( "testing" + "time" auth_model "forgejo.org/models/auth" "forgejo.org/models/db" "forgejo.org/models/unittest" + "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -107,14 +109,17 @@ func TestListAccessTokens(t *testing.T) { assert.Empty(t, tokens) } -func TestUpdateAccessToken(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - token, err := auth_model.GetAccessTokenBySHA(db.DefaultContext, "4c6f36e6cf498e2a448662f915d932c09c5a146c") - require.NoError(t, err) - token.Name = "Token Z" +func TestUpdateLastUsed(t *testing.T) { + timeutil.MockSet(time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)) + defer timeutil.MockUnset() - require.NoError(t, auth_model.UpdateAccessToken(db.DefaultContext, token)) - unittest.AssertExistsAndLoadBean(t, token) + require.NoError(t, unittest.PrepareTestDatabase()) + token := unittest.AssertExistsAndLoadBean(t, &auth_model.AccessToken{ID: 2}) + + require.NoError(t, token.UpdateLastUsed(t.Context())) + + token = unittest.AssertExistsAndLoadBean(t, &auth_model.AccessToken{ID: 2}) + assert.Equal(t, timeutil.TimeStampNow(), token.UpdatedUnix) } func TestDeleteAccessTokenByID(t *testing.T) { diff --git a/models/db/context.go b/models/db/context.go index 3e035cd733..34736ddbef 100644 --- a/models/db/context.go +++ b/models/db/context.go @@ -298,6 +298,31 @@ func TruncateBeans(ctx context.Context, beans ...any) (err error) { return nil } +// TruncateBeansCascade deletes all given beans. Beans MUST NOT contain delete conditions, as tables related by foreign +// keys will also be truncated. +func TruncateBeansCascade(ctx context.Context, beans ...any) (err error) { + // Expand the list of beans to any other table with a foreign key reference to the beans + cascadeTables, err := extendBeansForCascade(beans) + if err != nil { + return err + } + + // Sort the beans in inverse foreign key delete order + cascadeSorted, err := sortBeans(cascadeTables, foreignKeySortDelete) + if err != nil { + return err + } + + // Execute the truncate + e := GetEngine(ctx) + for i := range cascadeSorted { + if _, err = e.Truncate(cascadeSorted[i]); err != nil { + return err + } + } + return nil +} + // CountByBean counts the number of database records according non-empty fields of the bean as conditions. func CountByBean(ctx context.Context, bean any) (int64, error) { return GetEngine(ctx).Count(bean) diff --git a/models/db/engine.go b/models/db/engine.go index 42b9150696..71197153e5 100755 --- a/models/db/engine.go +++ b/models/db/engine.go @@ -161,9 +161,13 @@ func (w engineGroupWrapper) AddHook(hook contexts.Hook) bool { // SyncAllTables sync the schemas of all tables func SyncAllTables() error { - _, err := x.StoreEngine("InnoDB").SyncWithOptions(xorm.SyncOptions{ + sortedTables, err := sortBeans(tables, foreignKeySortInsert) + if err != nil { + return err + } + _, err = x.StoreEngine("InnoDB").SyncWithOptions(xorm.SyncOptions{ WarnIfDatabaseColumnMissed: true, - }, tables...) + }, sortedTables...) return err } diff --git a/models/db/foreign_keys.go b/models/db/foreign_keys.go index 2262ede05b..7af0b92f73 100644 --- a/models/db/foreign_keys.go +++ b/models/db/foreign_keys.go @@ -9,41 +9,101 @@ import ( "slices" "sync" + "forgejo.org/modules/container" + "xorm.io/xorm/schemas" ) +type schemaWithDefaultBean struct { + schema *schemas.Table + bean any +} + var ( cachedForeignKeyOrderedTables = sync.OnceValues(foreignKeyOrderedTables) cachedTableNameLookupOrder = sync.OnceValues(tableNameLookupOrder) + // Slice of all registered tables, including their bean from `RegisterModel()` and their schemas.Table reference. + cachedSchemaTables = sync.OnceValues(func() ([]schemaWithDefaultBean, error) { + schemaTables := make([]schemaWithDefaultBean, 0, len(tables)) + for _, bean := range tables { + table, err := TableInfo(bean) + if err != nil { + return nil, fmt.Errorf("cachedSchemaTables: failure to fetch schema table for bean %#v: %w", bean, err) + } + schemaTables = append(schemaTables, schemaWithDefaultBean{ + schema: table, + bean: bean, + }) + } + return schemaTables, nil + }) + // Lookup map from table name -> {schemas.Table, bean}. The bean is the empty bean from `RegisterModel()`. + cachedTableMap = sync.OnceValues(func() (map[string]schemaWithDefaultBean, error) { + schemaTables, err := cachedSchemaTables() + if err != nil { + return nil, err + } + retval := make(map[string]schemaWithDefaultBean, len(schemaTables)) + for _, table := range schemaTables { + retval[table.schema.Name] = table + } + return retval, nil + }) + // Table A has foreign keys to [B, C], this is a map of A -> {B, C}. + cachedReferencingTables = sync.OnceValues(func() (map[string][]string, error) { + schemaTables, err := cachedSchemaTables() + if err != nil { + return nil, err + } + return calculateReferencingTables(schemaTables), nil + }) + // Table A has foreign keys to [B, C], this is a map of B -> {A}, C -> {A}. + cachedReferencedTables = sync.OnceValues(func() (map[string][]string, error) { + referencingTables, err := cachedReferencingTables() + if err != nil { + return nil, err + } + referencedTables := make(map[string][]string) + for referencingTable, targetTables := range referencingTables { + for _, targetTable := range targetTables { + referencedTables[targetTable] = append(referencedTables[targetTable], referencingTable) + } + } + return referencedTables, nil + }) ) +// Create a map for each schema table which contains a slice of all the tables that reference it (with a foreign key). +func calculateReferencingTables(tables []schemaWithDefaultBean) map[string][]string { + referencingTables := make(map[string][]string, len(tables)) + for _, table := range tables { + tableName := table.schema.Name + for _, fk := range table.schema.ForeignKeys { + referencingTables[tableName] = append(referencingTables[tableName], fk.TargetTableName) + } + } + return referencingTables +} + // Create a list of database tables in their "foreign key order". This order specifies the safe insertion order for // records into tables, where earlier tables in the list are referenced by foreign keys that exist in tables later in // the list. This order can be used in reverse as a safe deletion order as well. // // An ordered list of tables is incompatible with tables that have self-referencing foreign keys and circular referenced // foreign keys; however neither of those cases are in-use in Forgejo. -func calculateTableForeignKeyOrder(tables []*schemas.Table) ([]*schemas.Table, error) { +func calculateTableForeignKeyOrder(tables []schemaWithDefaultBean) ([]schemaWithDefaultBean, error) { remainingTables := slices.Clone(tables) - // Create a lookup for each table that has a foreign key, and a slice of the tables that it references it. - referencingTables := make(map[string][]string) - for _, table := range remainingTables { - tableName := table.Name - for _, fk := range table.ForeignKeys { - referencingTables[tableName] = append(referencingTables[tableName], fk.TargetTableName) - } - } - - orderedTables := make([]*schemas.Table, 0, len(remainingTables)) + referencingTables := calculateReferencingTables(remainingTables) + orderedTables := make([]schemaWithDefaultBean, 0, len(remainingTables)) for len(remainingTables) > 0 { - nextGroup := make([]*schemas.Table, 0, len(remainingTables)) + nextGroup := make([]schemaWithDefaultBean, 0, len(remainingTables)) for _, targetTable := range remainingTables { // Skip if this targetTable has foreign keys and the target table hasn't been created. - slice, ok := referencingTables[targetTable.Name] - if ok && len(slice) > 1 { // This table is still referencing an uncreated table + slice, ok := referencingTables[targetTable.schema.Name] + if ok && len(slice) > 0 { // This table is still referencing an uncreated table continue } // This table's references are satisfied or it had none @@ -59,12 +119,12 @@ func calculateTableForeignKeyOrder(tables []*schemas.Table) ([]*schemas.Table, e // Cleanup between loops: remove each table in nextGroup from remainingTables, and remove their table names from // referencingTables as well. for _, doneTable := range nextGroup { - remainingTables = slices.DeleteFunc(remainingTables, func(remainingTable *schemas.Table) bool { - return remainingTable.Name == doneTable.Name + remainingTables = slices.DeleteFunc(remainingTables, func(remainingTable schemaWithDefaultBean) bool { + return remainingTable.schema.Name == doneTable.schema.Name }) for referencingTable, referencedTables := range referencingTables { referencingTables[referencingTable] = slices.DeleteFunc(referencedTables, func(tableName string) bool { - return tableName == doneTable.Name + return tableName == doneTable.schema.Name }) } } @@ -74,14 +134,10 @@ func calculateTableForeignKeyOrder(tables []*schemas.Table) ([]*schemas.Table, e } // Create a list of registered database tables in their "foreign key order", per calculateTableForeignKeyOrder. -func foreignKeyOrderedTables() ([]*schemas.Table, error) { - schemaTables := make([]*schemas.Table, 0, len(tables)) - for _, tbl := range tables { - table, err := TableInfo(tbl) - if err != nil { - return nil, fmt.Errorf("foreignKeyOrderedTables: failure to fetch schema table for bean %#v: %w", tbl, err) - } - schemaTables = append(schemaTables, table) +func foreignKeyOrderedTables() ([]schemaWithDefaultBean, error) { + schemaTables, err := cachedSchemaTables() + if err != nil { + return nil, err } orderedTables, err := calculateTableForeignKeyOrder(schemaTables) @@ -102,7 +158,7 @@ func tableNameLookupOrder() (map[string]int, error) { lookupMap := make(map[string]int, len(tables)) for i, table := range tables { - lookupMap[table.Name] = i + lookupMap[table.schema.Name] = i } return lookupMap, nil @@ -117,7 +173,7 @@ func TableNameInsertionOrderSortFunc(table1, table2 string) int { } // Since this is typically used by `slices.SortFunc` it can't return an error. If a table is referenced that isn't - // a registered model then it will be sorted at the beginning -- this case is used in models/migrations/test. + // a registered model then it will be sorted at the beginning -- this case is used in models/gitea_migrations/test. val1, ok := lookupMap[table1] if !ok { val1 = -1 @@ -129,3 +185,91 @@ func TableNameInsertionOrderSortFunc(table1, table2 string) int { return cmp.Compare(val1, val2) } + +// In "Insert" order, tables that have a foreign key will be sorted after the tables that the foreign key points to, so +// that records can be safely inserted in this order. "Delete" order is the opposite, and allows records to be safely +// deleted in this order. +type foreignKeySortOrder int8 + +const ( + foreignKeySortInsert foreignKeySortOrder = iota + foreignKeySortDelete +) + +// Sort the provided beans in the provided foreign-key sort order. +func sortBeans(beans []any, sortOrder foreignKeySortOrder) ([]any, error) { + type beanWithTableName struct { + bean any + tableName string + } + + beansWithTableNames := make([]beanWithTableName, 0, len(beans)) + for _, bean := range beans { + table, err := TableInfo(bean) + if err != nil { + return nil, fmt.Errorf("sortBeans: failure to fetch schema table for bean %#v: %w", bean, err) + } + beansWithTableNames = append(beansWithTableNames, beanWithTableName{bean: bean, tableName: table.Name}) + } + + slices.SortFunc(beansWithTableNames, func(a, b beanWithTableName) int { + if sortOrder == foreignKeySortInsert { + return TableNameInsertionOrderSortFunc(a.tableName, b.tableName) + } + return TableNameInsertionOrderSortFunc(b.tableName, a.tableName) + }) + + beanRetval := make([]any, len(beans)) + for i, beanWithTableName := range beansWithTableNames { + beanRetval[i] = beanWithTableName.bean + } + return beanRetval, nil +} + +// A database operation on `beans` may need to affect additional tables based upon foreign keys to those beans. +// extendBeansForCascade returns a new list of beans which includes all the referencing tables that link to `beans`' +// tables. For example, provided a `&User{}`, it will return `[&User{}, &Stopwatch{}, ...]` where `Stopwatch` is a table +// that references `User`. The additional beans returned will be default structs that were provided to +// `db.RegisterModel`. +func extendBeansForCascade(beans []any) ([]any, error) { + referencedTables, err := cachedReferencedTables() + if err != nil { + return nil, err + } + tableMap, err := cachedTableMap() + if err != nil { + return nil, err + } + + deduplicateTables := make(container.Set[string], len(beans)) + + finalBeans := slices.Clone(beans) + newBeans := beans + nextBeanSet := make([]any, 0) + + for { + for _, bean := range newBeans { + schema, err := TableInfo(bean) + if err != nil { + return nil, fmt.Errorf("cascadeDeleteTables: failure to fetch schema table for bean %#v: %w", bean, err) + } + if deduplicateTables.Contains(schema.Name) { + continue + } + deduplicateTables.Add(schema.Name) + for _, referencingTable := range referencedTables[schema.Name] { + table := tableMap[referencingTable] + finalBeans = append(finalBeans, table.bean) + nextBeanSet = append(nextBeanSet, table.bean) + } + } + + if len(nextBeanSet) == 0 { + break + } + newBeans = nextBeanSet + nextBeanSet = nextBeanSet[:0] // set len 0, keep allocation for reuse + } + + return finalBeans, nil +} diff --git a/models/db/iterate.go b/models/db/iterate.go index 450c7d3389..5e30b5e8bc 100644 --- a/models/db/iterate.go +++ b/models/db/iterate.go @@ -5,39 +5,82 @@ package db import ( "context" + "fmt" + "reflect" "forgejo.org/modules/setting" "xorm.io/builder" ) -// Iterate iterate all the Bean object +// Iterate iterate all the Bean object. The table being iterated must have a single-column primary key. func Iterate[Bean any](ctx context.Context, cond builder.Cond, f func(ctx context.Context, bean *Bean) error) error { - var start int + var dummy Bean batchSize := setting.Database.IterateBufferSize - sess := GetEngine(ctx) + + table, err := TableInfo(&dummy) + if err != nil { + return fmt.Errorf("unable to fetch table info for bean %v: %w", dummy, err) + } + if len(table.PrimaryKeys) != 1 { + return fmt.Errorf("iterate only supported on a table with 1 primary key field, but table %s had %d", table.Name, len(table.PrimaryKeys)) + } + + pkDbName := table.PrimaryKeys[0] + var pkStructFieldName string + + for _, c := range table.Columns() { + if c.Name == pkDbName { + pkStructFieldName = c.FieldName + break + } + } + if pkStructFieldName == "" { + return fmt.Errorf("iterate unable to identify struct field for primary key %s", pkDbName) + } + + var lastPK any + for { select { case <-ctx.Done(): return ctx.Err() default: beans := make([]*Bean, 0, batchSize) + + sess := GetEngine(ctx) + sess = sess.OrderBy(pkDbName) if cond != nil { sess = sess.Where(cond) } - if err := sess.Limit(batchSize, start).Find(&beans); err != nil { + if lastPK != nil { + sess = sess.Where(builder.Gt{pkDbName: lastPK}) + } + + if err := sess.Limit(batchSize).Find(&beans); err != nil { return err } if len(beans) == 0 { return nil } - start += len(beans) for _, bean := range beans { if err := f(ctx, bean); err != nil { return err } } + + lastBean := beans[len(beans)-1] + lastPK = extractFieldValue(lastBean, pkStructFieldName) } } } + +func extractFieldValue(bean any, fieldName string) any { + v := reflect.ValueOf(bean) + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + field := v.FieldByName(fieldName) + return field.Interface() +} diff --git a/models/db/iterate_test.go b/models/db/iterate_test.go index bdeaa876d5..405db84866 100644 --- a/models/db/iterate_test.go +++ b/models/db/iterate_test.go @@ -5,42 +5,113 @@ package db_test import ( "context" + "fmt" + "slices" "testing" "forgejo.org/models/db" repo_model "forgejo.org/models/repo" "forgejo.org/models/unittest" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "xorm.io/builder" ) func TestIterate(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - xe, err := unittest.GetXORMEngine() - require.NoError(t, err) - require.NoError(t, xe.Sync(&repo_model.RepoUnit{})) + db.SetLogSQL(t.Context(), true) + defer test.MockVariableValue(&setting.Database.IterateBufferSize, 50)() - cnt, err := db.GetEngine(db.DefaultContext).Count(&repo_model.RepoUnit{}) - require.NoError(t, err) + t.Run("No Modifications", func(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + xe, err := unittest.GetXORMEngine() + require.NoError(t, err) + require.NoError(t, xe.Sync(&repo_model.RepoUnit{})) - var repoUnitCnt int - err = db.Iterate(db.DefaultContext, nil, func(ctx context.Context, repo *repo_model.RepoUnit) error { - repoUnitCnt++ - return nil + // Fetch all the repo unit IDs... + var remainingRepoIDs []int64 + db.GetEngine(t.Context()).Table(&repo_model.RepoUnit{}).Cols("id").Find(&remainingRepoIDs) + + // Ensure that every repo unit ID is found when doing iterate: + err = db.Iterate(t.Context(), nil, func(ctx context.Context, repo *repo_model.RepoUnit) error { + remainingRepoIDs = slices.DeleteFunc(remainingRepoIDs, func(n int64) bool { + return repo.ID == n + }) + return nil + }) + require.NoError(t, err) + assert.Empty(t, remainingRepoIDs) }) - require.NoError(t, err) - assert.EqualValues(t, cnt, repoUnitCnt) - err = db.Iterate(db.DefaultContext, nil, func(ctx context.Context, repoUnit *repo_model.RepoUnit) error { - has, err := db.ExistByID[repo_model.RepoUnit](ctx, repoUnit.ID) - if err != nil { - return err - } - if !has { - return db.ErrNotExist{Resource: "repo_unit", ID: repoUnit.ID} - } - return nil + t.Run("Concurrent Delete", func(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + xe, err := unittest.GetXORMEngine() + require.NoError(t, err) + require.NoError(t, xe.Sync(&repo_model.RepoUnit{})) + + // Fetch all the repo unit IDs... + var remainingRepoIDs []int64 + db.GetEngine(t.Context()).Table(&repo_model.RepoUnit{}).Cols("id").Find(&remainingRepoIDs) + + // Ensure that every repo unit ID is found, even if someone else performs a DELETE on the table while we're + // iterating. In real-world usage the deleted record may or may not be returned, but the important + // subject-under-test is that no *other* record is skipped. + didDelete := false + err = db.Iterate(t.Context(), nil, func(ctx context.Context, repo *repo_model.RepoUnit) error { + // While on page 2 (assuming ID ordering, 50 record buffer size)... + if repo.ID == 51 { + // Delete a record that would have been on page 1. + affected, err := db.GetEngine(t.Context()).ID(25).Delete(&repo_model.RepoUnit{}) + if err != nil { + return err + } else if affected != 1 { + return fmt.Errorf("expected to delete 1 record, but affected %d records", affected) + } + didDelete = true + } + remainingRepoIDs = slices.DeleteFunc(remainingRepoIDs, func(n int64) bool { + return repo.ID == n + }) + return nil + }) + require.NoError(t, err) + assert.True(t, didDelete, "didDelete") + assert.Empty(t, remainingRepoIDs) + }) + + t.Run("Verify cond applied", func(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + xe, err := unittest.GetXORMEngine() + require.NoError(t, err) + require.NoError(t, xe.Sync(&repo_model.RepoUnit{})) + + // Fetch all the repo unit IDs... + var remainingRepoIDs []int64 + db.GetEngine(t.Context()).Table(&repo_model.RepoUnit{}).Cols("id").Find(&remainingRepoIDs) + + // Remove those that we're not expecting to find based upon `Iterate`'s condition. We'll trim the front few + // records and last few records, which will confirm that cond is applied on all pages. + remainingRepoIDs = slices.DeleteFunc(remainingRepoIDs, func(n int64) bool { + return n <= 15 || n > 1000 + }) + err = db.Iterate(t.Context(), builder.Gt{"id": 15}.And(builder.Lt{"id": 1000}), func(ctx context.Context, repo *repo_model.RepoUnit) error { + removedRecord := false + // Remove the record from remainingRepoIDs, but track to make sure we did actually remove a record + remainingRepoIDs = slices.DeleteFunc(remainingRepoIDs, func(n int64) bool { + if repo.ID == n { + removedRecord = true + return true + } + return false + }) + if !removedRecord { + return fmt.Errorf("unable to find record in remainingRepoIDs for repo %d, indicating a cond application failure", repo.ID) + } + return nil + }) + require.NoError(t, err) + assert.Empty(t, remainingRepoIDs) }) - require.NoError(t, err) } diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index eaa5f07ba5..f537ee02d5 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -1921,4 +1921,3 @@ is_fsck_enabled: true close_issues_via_commit_in_any_branch: false topics: '[]' - diff --git a/models/forgejo_migrations/README.md b/models/forgejo_migrations/README.md new file mode 100644 index 0000000000..578b75c8a0 --- /dev/null +++ b/models/forgejo_migrations/README.md @@ -0,0 +1,105 @@ +# forgejo_migrations + +Forgejo has three database migration mechanisms: + +- `models/gitea_migrations` + - Original database schema migrations from Forgejo's legacy as a fork of Gitea. + - A linear set of migrations referenced in `models/gitea_migrations/migrations.go`, each represented by a number (eg. migration 304). + - The current version is recorded in the database in the table `version`. +- `models/forgejo_migrations_legacy` + - The next 50-ish database schema migrations reflecting change in Forgejo's database structure between Forgejo v7.0 and v14.0 + - A linear set of migrations referenced in `models/forgejo_migrations_legacy/migrate.go`, each represented by a number (eg. migration 43). + - The current version is recorded in the database in the table `forgejo_version`. +- `models/forgejo_migrations` + - The most recent database schema migrations, reflecting change in the v14.0 release cycle and onwards into the future. + - Each migration is identified by the filename it is stored in. + - The applied migrations are recorded in the database in the table `forgejo_migration`. + +`forgejo_migrations` is designed to reduce code conflicts when multiple developers may be making schema migrations in close succession, which it does by avoiding having one code file with a long array of migrations. Instead, each file in `models/forgejo_migrations` registers itself as a migration, and its filename indicates the order that migration will be applied. + +Files in `forgejo_migrations` must: +- Define an `init` function which registers a function to be invoked for the migration. +- Follow the naming convention: + - The letter `v` + - A number, representing the development cycle that the migration was created in + - A letter, indicating any required migration ordering + - The character `_` (underscore) + - A short descriptive identifier for the migration + +For example, valid migration file names would look like this: +- `v14a_add-threaded-comments.go` +- `v14a_add-federated-emojis.go` +- `v14b_fix-threaded-comments-index.go` + + +## Migration Ordering + +Forgejo executes registered migrations in `forgejo_migrations` in the `strings.Compare()` ordering of their filename. + +There are edge cases where migrations may not be executed in this exact order: +- If a schema change is backported to an earlier Forgejo release. For example, if a bugfix during the v15 development cycle was backported into a v14 patch release, then a migration labeled `v15a_fix-unusual-data-corruption.go` could be applied during a v14 software upgrade. In the future when a v15 software release occurs, that migration will be identified as already applied and will be skipped. +- If a developer working on Forgejo switches between different branches with different schema migrations. +- If the contents of the `forgejo_migrations` database table are changed outside of Forgejo modifying it. + + +## Creating a new Migration + +First, determine the filename for your migration. In general, you create a new migration by starting a file with the same prefix as the most recent migration present. If `v14a_add-forgejo-migrations-table.go` was the last file, most of the time you can create your migration with the same `v14a_...` prefix. + +There are two exceptions: +- After the release branch is cut for a release, increment the version in the migration. If v14 was cut, you would start `v15a_...` as the next migration. +- If your migration requires that an earlier migration is complete first, you would increment the letter in the prefix. If you were modifying the table created by `v14a_add-forgejo-migrations-table.go`, then you would name your migration `v14b_...`. + +Once you've determined the migration filename, then you can copy this template into the file: + +```go +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations + +import ( + "forgejo.org/modules/timeutil" + + "xorm.io/xorm" +) + +func init() { + registerMigration(&Migration{ + Description: "short sentence describing this migration", + Upgrade: myMigrationFunction, // rename + }) +} + +func myMigrationFunction(x *xorm.Engine) error { + // add migration logic here + // + // to prevent `make watch` from recording this migration as done when it + // isn't authored yet, returh an error until the implementation is done + return errors.New("not implemented yet") +} +``` + +And now it's up to you to write the contents of your migration function. + + +## Development Notes + +Once migrations are executed, a record of their execution is stored in the database table `forgejo_migration`. + +```sql +=> SELECT * FROM forgejo_migration; + id | created_unix +-----------------------------------+-------------- + v14a_add-forgejo-migrations-table | 1760402451 + v14a_example-other-migration | 1760402453 + v14b_another-example | 1760402455 + v15a_add-something-cool | 1760402456 + v15a_another-example-again | 1760402457 +``` + +If your migration successfully executes once, it will be recorded in this table and it will never execute again, even if you change the migration code. It is common during development to need to re-run a migration, in which case you can delete the record that you're working on developing. The migration will be re-run as soon as the Forgejo server is restarted: + +```sql +=> DELETE FROM forgejo_migration WHERE id = 'v15a_another-example-again'; +``` diff --git a/models/forgejo_migrations/main_test.go b/models/forgejo_migrations/main_test.go index 2246e327f0..a38afed10d 100644 --- a/models/forgejo_migrations/main_test.go +++ b/models/forgejo_migrations/main_test.go @@ -1,12 +1,12 @@ -// Copyright 2023 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later package forgejo_migrations import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/forgejo_migrations/migrate.go b/models/forgejo_migrations/migrate.go index c32debaf19..53ab95d216 100644 --- a/models/forgejo_migrations/migrate.go +++ b/models/forgejo_migrations/migrate.go @@ -1,235 +1,222 @@ -// Copyright 2023 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later package forgejo_migrations import ( - "context" - "errors" "fmt" "os" + "regexp" + "runtime" + "slices" + "strings" - "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/container" "forgejo.org/modules/log" "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" "xorm.io/xorm" "xorm.io/xorm/names" ) -// ForgejoVersion describes the Forgejo version table. Should have only one row with id = 1. -type ForgejoVersion struct { - ID int64 `xorm:"pk autoincr"` - Version int64 +// ForgejoMigration table contains a record of migrations applied to the database. (Note that there are older +// migrations in the forgejo_version table from before this table was introduced, and the `version` table from Gitea +// migrations). Each record in this table represents one successfully completed migration which was completed at the +// `CreatedUnix` time. +type ForgejoMigration struct { + ID string `xorm:"pk"` + CreatedUnix timeutil.TimeStamp `xorm:"created"` } type Migration struct { - description string - migrate func(*xorm.Engine) error + Description string // short plaintext explanation of the migration + Upgrade func(*xorm.Engine) error // perform the migration + + id string // unique migration identifier } -// NewMigration creates a new migration. -func NewMigration(desc string, fn func(*xorm.Engine) error) *Migration { - return &Migration{desc, fn} +var ( + rawMigrations []*Migration + migrationFilenameRegex = regexp.MustCompile(`/(?Pv[0-9]+[a-z])_(?P[^/]+)\.go$`) +) + +var getMigrationFilename = func() string { + _, migrationFilename, _, _ := runtime.Caller(2) + return migrationFilename } -// This is a sequence of additional Forgejo migrations. -// Add new migrations to the bottom of the list. -var migrations = []*Migration{ - // v0 -> v1 - NewMigration("Create the `forgejo_blocked_user` table", forgejo_v1_20.AddForgejoBlockedUser), - // v1 -> v2 - NewMigration("Create the `forgejo_sem_ver` table", forgejo_v1_20.CreateSemVerTable), - // v2 -> v3 - NewMigration("Create the `forgejo_auth_token` table", forgejo_v1_20.CreateAuthorizationTokenTable), - // v3 -> v4 - NewMigration("Add the `default_permissions` column to the `repo_unit` table", forgejo_v1_22.AddDefaultPermissionsToRepoUnit), - // v4 -> v5 - NewMigration("Create the `forgejo_repo_flag` table", forgejo_v1_22.CreateRepoFlagTable), - // v5 -> v6 - NewMigration("Add the `wiki_branch` column to the `repository` table", forgejo_v1_22.AddWikiBranchToRepository), - // v6 -> v7 - NewMigration("Add the `enable_repo_unit_hints` column to the `user` table", forgejo_v1_22.AddUserRepoUnitHintsSetting), - // v7 -> v8 - NewMigration("Modify the `release`.`note` content to remove SSH signatures", forgejo_v1_22.RemoveSSHSignaturesFromReleaseNotes), - // v8 -> v9 - 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), - // v12 -> v13 - NewMigration("Add `hide_archive_links` column to `release` table", AddHideArchiveLinksToRelease), - // v13 -> v14 - NewMigration("Remove Gitea-specific columns from the repository and badge tables", RemoveGiteaSpecificColumnsFromRepositoryAndBadge), - // v14 -> v15 - NewMigration("Create the `federation_host` table", CreateFederationHostTable), - // v15 -> v16 - NewMigration("Create the `federated_user` table", CreateFederatedUserTable), - // v16 -> v17 - NewMigration("Add `normalized_federated_uri` column to `user` table", AddNormalizedFederatedURIToUser), - // v17 -> v18 - NewMigration("Create the `following_repo` table", CreateFollowingRepoTable), - // v18 -> v19 - NewMigration("Add external_url to attachment table", AddExternalURLColumnToAttachmentTable), - // v19 -> v20 - NewMigration("Creating Quota-related tables", CreateQuotaTables), - // v20 -> v21 - NewMigration("Add SSH keypair to `pull_mirror` table", AddSSHKeypairToPushMirror), - // v21 -> v22 - NewMigration("Add `legacy` to `web_authn_credential` table", AddLegacyToWebAuthnCredential), - // v22 -> v23 - NewMigration("Add `delete_branch_after_merge` to `auto_merge` table", AddDeleteBranchAfterMergeToAutoMerge), - // v23 -> v24 - NewMigration("Add `purpose` column to `forgejo_auth_token` table", AddPurposeToForgejoAuthToken), - // v24 -> v25 - NewMigration("Migrate `secret` column to store keying material", MigrateTwoFactorToKeying), - // v25 -> v26 - NewMigration("Add `hash_blake2b` column to `package_blob` table", AddHashBlake2bToPackageBlob), - // v26 -> v27 - NewMigration("Add `created_unix` column to `user_redirect` table", AddCreatedUnixToRedirect), - // v27 -> v28 - NewMigration("Add pronoun privacy settings to user", AddHidePronounsOptionToUser), - // v28 -> v29 - NewMigration("Add public key information to `FederatedUser` and `FederationHost`", AddPublicKeyInformationForFederation), - // v29 -> v30 - NewMigration("Migrate `User.NormalizedFederatedURI` column to extract port & schema into FederatedHost", MigrateNormalizedFederatedURI), - // v30 -> v31 - NewMigration("Normalize repository.topics to empty slice instead of null", SetTopicsAsEmptySlice), - // v31 -> v32 - NewMigration("Migrate maven package name concatenation", ChangeMavenArtifactConcatenation), - // v32 -> v33 - NewMigration("Add federated user activity tables, update the `federated_user` table & add indexes", FederatedUserActivityMigration), - // v33 -> v34 - NewMigration("Add `notify-email` column to `action_run` table", AddNotifyEmailToActionRun), - // v34 -> v35 - NewMigration("Noop because of https://codeberg.org/forgejo/forgejo/issues/8373", NoopAddIndexToActionRunStopped), - // v35 -> v36 - NewMigration("Fix wiki unit default permission", FixWikiUnitDefaultPermission), - // v36 -> v37 - NewMigration("Add `branch_filter` to `push_mirror` table", AddPushMirrorBranchFilter), - // v37 -> v38 - NewMigration("Add `resolved_unix` column to `abuse_report` table", AddResolvedUnixToAbuseReport), - // v38 -> v39 - NewMigration("Migrate `data` column of `secret` table to store keying material", MigrateActionSecretsToKeying), - // v39 -> v40 - NewMigration("Add index for release sha1", AddIndexForReleaseSha1), - // v40 -> v41 - NewMigration("Add foreign keys to stopwatch & tracked_time", AddForeignKeysStopwatchTrackedTime), - // v41 -> v42 - NewMigration("Add action_run concurrency fields", AddActionRunConcurrency), - // v42 -> v43 - NewMigration("Add action_run pre_execution_error field", AddActionRunPreExecutionError), -} +func registerMigration(migration *Migration) { + migrationFilename := getMigrationFilename() -// GetCurrentDBVersion returns the current Forgejo database version. -func GetCurrentDBVersion(x *xorm.Engine) (int64, error) { - if err := x.Sync(new(ForgejoVersion)); err != nil { - return -1, fmt.Errorf("sync: %w", err) + if migrationResolutionComplete { + panic(fmt.Sprintf("attempted to register migration from %s after migration resolution is already complete", migrationFilename)) } - currentVersion := &ForgejoVersion{ID: 1} - has, err := x.Get(currentVersion) + matches := migrationFilenameRegex.FindStringSubmatch(migrationFilename) + if len(matches) == 0 { + panic(fmt.Sprintf("registerMigration must be invoked from a file matching migrationFilenameRegex, but was invoked from %q", migrationFilename)) + } + migration.id = fmt.Sprintf("%s_%s", matches[1], matches[2]) // this just rebuilds the filename, but guarantees that the regex applied for consistent naming + + rawMigrations = append(rawMigrations, migration) +} + +// For testing only +func resetMigrations() { + rawMigrations = nil + orderedMigrations = nil + migrationResolutionComplete = false + inMemoryMigrationIDs = nil +} + +var ( + migrationResolutionComplete = false + inMemoryMigrationIDs container.Set[string] + orderedMigrations []*Migration +) + +func resolveMigrations() { + if migrationResolutionComplete { + return + } + + inMemoryMigrationIDs = make(container.Set[string]) + for _, m := range rawMigrations { + if inMemoryMigrationIDs.Contains(m.id) { + // With the filename-based migration ID this shouldn't be possible, but a bit of a sanity check.. + panic(fmt.Sprintf("migration id is duplicated: %q", m.id)) + } + inMemoryMigrationIDs.Add(m.id) + } + + orderedMigrations = slices.Clone(rawMigrations) + slices.SortFunc(orderedMigrations, func(m1, m2 *Migration) int { + return strings.Compare(m1.id, m2.id) + }) + + migrationResolutionComplete = true +} + +func getInDBMigrationIDs(x *xorm.Engine) (container.Set[string], error) { + var inDBMigrations []ForgejoMigration + err := x.Find(&inDBMigrations) if err != nil { - return -1, fmt.Errorf("get: %w", err) + return nil, err } - if !has { - return -1, nil - } - return currentVersion.Version, nil -} -// ExpectedVersion returns the expected Forgejo database version. -func ExpectedVersion() int64 { - return int64(len(migrations)) + inDBMigrationIDs := make(container.Set[string], len(inDBMigrations)) + for _, inDB := range inDBMigrations { + inDBMigrationIDs.Add(inDB.ID) + } + + return inDBMigrationIDs, nil } // EnsureUpToDate will check if the Forgejo database is at the correct version. func EnsureUpToDate(x *xorm.Engine) error { - currentDB, err := GetCurrentDBVersion(x) + resolveMigrations() + + inDBMigrationIDs, err := getInDBMigrationIDs(x) if err != nil { return err } - if currentDB < 0 { - return errors.New("database has not been initialized") + // invalidMigrations are those that are in the database, but aren't registered. + invalidMigrations := inDBMigrationIDs.Difference(inMemoryMigrationIDs) + if len(invalidMigrations) > 0 { + return fmt.Errorf("current Forgejo database has migration(s) %s applied, which are not registered migrations", strings.Join(invalidMigrations.Slice(), ", ")) } - expected := ExpectedVersion() - - if currentDB != expected { - return fmt.Errorf(`current Forgejo 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) + // unappliedMigrations are those that haven't yet been applied, but seem valid + unappliedMigrations := inMemoryMigrationIDs.Difference(inDBMigrationIDs) + if len(unappliedMigrations) > 0 { + return fmt.Errorf(`current Forgejo database is missing migration(s) %s. Please run "forgejo [--config /path/to/app.ini] migrate" to update the database version`, strings.Join(unappliedMigrations.Slice(), ", ")) } return nil } +func recordMigrationComplete(x *xorm.Engine, migration *Migration) error { + affected, err := x.Insert(&ForgejoMigration{ID: migration.id}) + if err != nil { + return err + } else if affected != 1 { + return fmt.Errorf("migration[%s]: failed to insert into DB, %d records affected", migration.id, affected) + } + return nil +} + // Migrate Forgejo database to current version. -func Migrate(x *xorm.Engine) error { +func Migrate(x *xorm.Engine, freshDB bool) error { + resolveMigrations() + // Set a new clean the default mapper to GonicMapper as that is the default for . x.SetMapper(names.GonicMapper{}) - if err := x.Sync(new(ForgejoVersion)); err != nil { + if err := x.Sync(new(ForgejoMigration)); err != nil { return fmt.Errorf("sync: %w", err) } - currentVersion := &ForgejoVersion{ID: 1} - has, err := x.Get(currentVersion) + inDBMigrationIDs, err := getInDBMigrationIDs(x) if err != nil { - return fmt.Errorf("get: %w", err) - } else if !has { - // If the version record does not exist we think - // it is a fresh installation and we can skip all migrations. - currentVersion.ID = 0 - currentVersion.Version = ExpectedVersion() - - if _, err = x.InsertOne(currentVersion); err != nil { - return fmt.Errorf("insert: %w", err) + return err + } else if len(inDBMigrationIDs) == 0 && freshDB { + // During startup on a new, empty database, and during integration tests, we rely only on `SyncAllTables` to + // create the DB schema. No migrations can be applied because `SyncAllTables` occurs later in the + // initialization cycle. We mark all migrations as complete up to this point and only run future migrations. + for _, migration := range orderedMigrations { + err := recordMigrationComplete(x, migration) + if err != nil { + return err + } } + inDBMigrationIDs, err = getInDBMigrationIDs(x) + if err != nil { + return err + } + } else if freshDB { + return fmt.Errorf("unexpected state: migrator called with freshDB=true, but existing migrations in DB %#v", inDBMigrationIDs) } - v := currentVersion.Version - - // Downgrading Forgejo's database version not supported - if v > ExpectedVersion() { - msg := fmt.Sprintf("Your Forgejo database (migration version: %d) is for a newer version of Forgejo, you cannot use the newer database for this old Forgejo release (%d).", v, ExpectedVersion()) + // invalidMigrations are those that are in the database, but aren't registered. + invalidMigrations := inDBMigrationIDs.Difference(inMemoryMigrationIDs) + if len(invalidMigrations) > 0 { + // Downgrading Forgejo's database version not supported + msg := fmt.Sprintf("Your Forgejo database has %d migration(s) (%s) for a newer version of Forgejo, you cannot use the newer database for this old Forgejo release.", len(invalidMigrations), strings.Join(invalidMigrations.Slice(), ", ")) 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 cause data loss)." 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 forgejo_version SET version=%d WHERE id=1;", ExpectedVersion()) + msg += "\nIf you are in development and know what you're doing, you can remove the migration records from the forgejo_migration table. The affect of those migrations will still be present." + quoted := slices.Clone(invalidMigrations.Slice()) + for i, s := range quoted { + quoted[i] = "'" + s + "'" + } + msg += fmt.Sprintf("\n DELETE FROM forgejo_migration WHERE id IN (%s)", strings.Join(quoted, ", ")) } _, _ = fmt.Fprintln(os.Stderr, msg) log.Fatal(msg) return nil } - // Some migration tasks depend on the git command - if git.DefaultContext == nil { - if err = git.InitSimple(context.Background()); err != nil { - return err + // unappliedMigrations are those that are registered but haven't been applied. + unappliedMigrations := inMemoryMigrationIDs.Difference(inDBMigrationIDs) + for _, migration := range orderedMigrations { + if !unappliedMigrations.Contains(migration.id) { + continue } - } - // Migrate - for i, m := range migrations[v:] { - log.Info("Migration[%d]: %s", v+int64(i), m.description) + log.Info("Migration[%s]: %s", migration.id, migration.Description) + // Reset the mapper between each migration - migrations are not supposed to depend on each other x.SetMapper(names.GonicMapper{}) - if err = m.migrate(x); err != nil { - return fmt.Errorf("migration[%d]: %s failed: %w", v+int64(i), m.description, err) + if err = migration.Upgrade(x); err != nil { + return fmt.Errorf("migration[%s]: %s failed: %w", migration.id, migration.Description, err) } - currentVersion.Version = v + int64(i) + 1 - if _, err = x.ID(1).Update(currentVersion); err != nil { + + err := recordMigrationComplete(x, migration) + if err != nil { return err } } - if err := x.Sync(new(semver.ForgejoSemVer)); err != nil { - return fmt.Errorf("sync: %w", err) - } - - return semver.SetVersionStringWithEngine(x, setting.ForgejoVersion) + return nil } diff --git a/models/forgejo_migrations/migrate_test.go b/models/forgejo_migrations/migrate_test.go index 9d16c9fe1c..360f6a16d5 100644 --- a/models/forgejo_migrations/migrate_test.go +++ b/models/forgejo_migrations/migrate_test.go @@ -1,39 +1,314 @@ -// Copyright 2023 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later package forgejo_migrations import ( + "fmt" "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" + "forgejo.org/modules/test" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "xorm.io/xorm" ) -// TestEnsureUpToDate tests the behavior of EnsureUpToDate. -func TestEnsureUpToDate(t *testing.T) { - x, deferable := migration_tests.PrepareTestEnv(t, 0, new(ForgejoVersion)) - defer deferable() - if x == nil || t.Failed() { - return +func noOpMigration(x *xorm.Engine) error { + return nil +} + +func nilMigration() *Migration { + return &Migration{ + Description: "nothing", + Upgrade: noOpMigration, + } +} + +func TestRegisterMigration(t *testing.T) { + resetMigrations() + + defer test.MockVariableValue(&getMigrationFilename, func() string { + return "some-path/v99b_neat_migration.go" + })() + + t.Run("migrationResolutionComplete", func(t *testing.T) { + defer test.MockVariableValue(&migrationResolutionComplete, true)() + assert.PanicsWithValue(t, "attempted to register migration from some-path/v99b_neat_migration.go after migration resolution is already complete", func() { + registerMigration(nilMigration()) + }) + }) + + for _, fn := range []string{ + "v99b_neat_migration.go", // no leading path + "vb_neat_migration.go", // no version number + "v12_neat_migration.go", // no migration group letter + "v12a-neat-migration.go", // no undescore + "v12a.go", // no descriptive identifier + } { + t.Run(fmt.Sprintf("bad name - %s", fn), func(t *testing.T) { + defer test.MockVariableValue(&getMigrationFilename, func() string { + return fn + })() + assert.PanicsWithValue(t, fmt.Sprintf("registerMigration must be invoked from a file matching migrationFilenameRegex, but was invoked from %q", fn), func() { + registerMigration(nilMigration()) + }) + }) } - // Ensure error if there's no row in Forgejo Version. - err := EnsureUpToDate(x) - require.Error(t, err) - - // Insert 'good' Forgejo Version row. - _, err = x.InsertOne(&ForgejoVersion{ID: 1, Version: ExpectedVersion()}) - require.NoError(t, err) - - err = EnsureUpToDate(x) - require.NoError(t, err) - - // Modify forgejo version to have a lower version. - _, err = x.Exec("UPDATE `forgejo_version` SET version = ? WHERE id = 1", ExpectedVersion()-1) - require.NoError(t, err) - - err = EnsureUpToDate(x) - require.Error(t, err) + registerMigration(nilMigration()) + found := false + for _, m := range rawMigrations { + if m.id == "v99b_neat_migration" { + found = true + } + } + require.True(t, found, "found registered migration") +} + +func TestResolveMigrations(t *testing.T) { + t.Run("duplicate migration IDs", func(t *testing.T) { + resetMigrations() + defer test.MockVariableValue(&getMigrationFilename, func() string { + return "some-path/v99b_neat_migration.go" + })() + registerMigration(nilMigration()) + registerMigration(nilMigration()) + + assert.PanicsWithValue(t, "migration id is duplicated: \"v99b_neat_migration\"", func() { + resolveMigrations() + }) + }) + + t.Run("success", func(t *testing.T) { + resetMigrations() + defer test.MockVariableValue(&getMigrationFilename, func() string { + return "some-path/v99b_neat_migration.go" + })() + registerMigration(nilMigration()) + + defer test.MockVariableValue(&getMigrationFilename, func() string { + return "some-path/v77a_neat_migration.go" + })() + registerMigration(nilMigration()) + + resolveMigrations() + + assert.True(t, migrationResolutionComplete, "migration resolution complete") + assert.Contains(t, inMemoryMigrationIDs, "v77a_neat_migration") + assert.Contains(t, inMemoryMigrationIDs, "v99b_neat_migration") + require.Len(t, orderedMigrations, 2) + assert.Equal(t, "v77a_neat_migration", orderedMigrations[0].id) + assert.Equal(t, "v99b_neat_migration", orderedMigrations[1].id) + }) +} + +func TestGetInDBMigrationIDs(t *testing.T) { + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(ForgejoMigration)) + defer deferable() + require.NotNil(t, x) + + migrationIDs, err := getInDBMigrationIDs(x) + require.NoError(t, err) + require.NotNil(t, migrationIDs) + assert.Empty(t, migrationIDs) + + _, err = x.Insert(&ForgejoMigration{ID: "v77a_neat_migration"}) + require.NoError(t, err) + _, err = x.Insert(&ForgejoMigration{ID: "v99b_neat_migration"}) + require.NoError(t, err) + + migrationIDs, err = getInDBMigrationIDs(x) + require.NoError(t, err) + require.NotNil(t, migrationIDs) + assert.Len(t, migrationIDs, 2) + assert.Contains(t, migrationIDs, "v77a_neat_migration") + assert.Contains(t, migrationIDs, "v99b_neat_migration") +} + +func TestEnsureUpToDate(t *testing.T) { + tests := []struct { + desc string + inMemory []string + inDB []string + err string + }{ + { + desc: "up-to-date", + inMemory: []string{"v77a_neat_migration"}, + inDB: []string{"v77a_neat_migration"}, + }, + { + desc: "invalid-migration", + inMemory: []string{}, + inDB: []string{"v77a_neat_migration"}, + err: "current Forgejo database has migration(s) v77a_neat_migration applied, which are not registered migrations", + }, + { + desc: "missing-migration", + inMemory: []string{"v77a_neat_migration"}, + inDB: []string{}, + err: "current Forgejo database is missing migration(s) v77a_neat_migration", + }, + } + + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + resetMigrations() + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(ForgejoMigration)) + defer deferable() + require.NotNil(t, x) + + for _, inMemory := range tc.inMemory { + defer test.MockVariableValue(&getMigrationFilename, func() string { + return fmt.Sprintf("some-path/%s.go", inMemory) + })() + registerMigration(nilMigration()) + } + for _, inDB := range tc.inDB { + x.Insert(&ForgejoMigration{ID: inDB}) + } + + err := EnsureUpToDate(x) + if tc.err == "" { + assert.NoError(t, err) + } else { + assert.ErrorContains(t, err, tc.err) + } + }) + } +} + +func TestMigrate(t *testing.T) { + resetMigrations() + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(ForgejoMigration)) + defer deferable() + require.NotNil(t, x) + + v77aRun := false + defer test.MockVariableValue(&getMigrationFilename, func() string { + return "some-path/v77a_neat_migration.go" + })() + registerMigration(&Migration{ + Description: "nothing", + Upgrade: func(x *xorm.Engine) error { + v77aRun = true + return nil + }, + }) + // v77a_neat_migration will already be marked as already run + _, err := x.Insert(&ForgejoMigration{ID: "v77a_neat_migration"}) + require.NoError(t, err) + + v99bRun := false + defer test.MockVariableValue(&getMigrationFilename, func() string { + return "some-path/v99b_neat_migration.go" + })() + registerMigration(&Migration{ + Description: "nothing", + Upgrade: func(x *xorm.Engine) error { + v99bRun = true + type ForgejoMagicFunctionality struct { + ID int64 `xorm:"pk autoincr"` + Name string + } + return x.Sync(new(ForgejoMagicFunctionality)) + }, + }) + + v99cRun := false + defer test.MockVariableValue(&getMigrationFilename, func() string { + return "some-path/v99c_neat_migration.go" + })() + registerMigration(&Migration{ + Description: "nothing", + Upgrade: func(x *xorm.Engine) error { + v99cRun = true + type ForgejoMagicFunctionality struct { + NewField string + } + return x.Sync(new(ForgejoMagicFunctionality)) + }, + }) + + err = Migrate(x, false) + require.NoError(t, err) + + assert.False(t, v77aRun, "v77aRun") // was already marked as run in the DB so shouldn't have run again + assert.True(t, v99bRun, "v99bRun") + assert.True(t, v99cRun, "v99cRun") + migrationIDs, err := getInDBMigrationIDs(x) + require.NoError(t, err) + assert.Contains(t, migrationIDs, "v77a_neat_migration") + assert.Contains(t, migrationIDs, "v99b_neat_migration") + assert.Contains(t, migrationIDs, "v99c_neat_migration") + + // should be able to query all three of the fields from this table created, verifying both migrations creating the + // table and adding a column were run + rec := make([]map[string]any, 0) + err = x.Cols("id", "name", "new_field").Table("forgejo_magic_functionality").Find(&rec) + assert.NoError(t, err) +} + +func TestMigrateFreshDB(t *testing.T) { + resetMigrations() + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(ForgejoMigration)) + defer deferable() + require.NotNil(t, x) + + v77aRun := false + defer test.MockVariableValue(&getMigrationFilename, func() string { + return "some-path/v77a_neat_migration.go" + })() + registerMigration(&Migration{ + Description: "nothing", + Upgrade: func(x *xorm.Engine) error { + v77aRun = true + return nil + }, + }) + + v99bRun := false + defer test.MockVariableValue(&getMigrationFilename, func() string { + return "some-path/v99b_neat_migration.go" + })() + registerMigration(&Migration{ + Description: "nothing", + Upgrade: func(x *xorm.Engine) error { + v99bRun = true + type ForgejoMagicFunctionality struct { + ID int64 `xorm:"pk autoincr"` + Name string + } + return x.Sync(new(ForgejoMagicFunctionality)) + }, + }) + + v99cRun := false + defer test.MockVariableValue(&getMigrationFilename, func() string { + return "some-path/v99c_neat_migration.go" + })() + registerMigration(&Migration{ + Description: "nothing", + Upgrade: func(x *xorm.Engine) error { + v99cRun = true + type ForgejoMagicFunctionality struct { + NewField string + } + return x.Sync(new(ForgejoMagicFunctionality)) + }, + }) + + err := Migrate(x, true) + require.NoError(t, err) + + assert.False(t, v77aRun, "v77aRun") // none should be run due to freshDB flag + assert.False(t, v99bRun, "v99bRun") + assert.False(t, v99cRun, "v99cRun") + migrationIDs, err := getInDBMigrationIDs(x) + require.NoError(t, err) + assert.Contains(t, migrationIDs, "v77a_neat_migration") + assert.Contains(t, migrationIDs, "v99b_neat_migration") + assert.Contains(t, migrationIDs, "v99c_neat_migration") } diff --git a/models/forgejo_migrations/v14a_add-forgejo-migrations-table.go b/models/forgejo_migrations/v14a_add-forgejo-migrations-table.go new file mode 100644 index 0000000000..f78eec8789 --- /dev/null +++ b/models/forgejo_migrations/v14a_add-forgejo-migrations-table.go @@ -0,0 +1,25 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations + +import ( + "forgejo.org/modules/timeutil" + + "xorm.io/xorm" +) + +func init() { + registerMigration(&Migration{ + Description: "add forgejo_migration table", + Upgrade: addForgejoMigration, + }) +} + +func addForgejoMigration(x *xorm.Engine) error { + type ForgejoMigration struct { + ID string `xorm:"pk"` + CreatedUnix timeutil.TimeStamp `xorm:"created"` + } + return x.Sync(new(ForgejoMigration)) +} diff --git a/models/forgejo_migrations_legacy/main_test.go b/models/forgejo_migrations_legacy/main_test.go new file mode 100644 index 0000000000..2622af8e22 --- /dev/null +++ b/models/forgejo_migrations_legacy/main_test.go @@ -0,0 +1,14 @@ +// Copyright 2023 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forgejo_migrations_legacy + +import ( + "testing" + + migration_tests "forgejo.org/models/gitea_migrations/test" +) + +func TestMain(m *testing.M) { + migration_tests.MainTest(m) +} diff --git a/models/forgejo_migrations_legacy/migrate.go b/models/forgejo_migrations_legacy/migrate.go new file mode 100644 index 0000000000..72bbf66bdc --- /dev/null +++ b/models/forgejo_migrations_legacy/migrate.go @@ -0,0 +1,246 @@ +// Copyright 2023 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forgejo_migrations_legacy + +import ( + "context" + "errors" + "fmt" + "os" + + "forgejo.org/models/forgejo/semver" + "forgejo.org/models/forgejo_migrations" + forgejo_v1_20 "forgejo.org/models/forgejo_migrations_legacy/v1_20" + forgejo_v1_22 "forgejo.org/models/forgejo_migrations_legacy/v1_22" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + + "xorm.io/xorm" + "xorm.io/xorm/names" +) + +// ForgejoVersion describes the Forgejo version table. Should have only one row with id = 1. +type ForgejoVersion struct { + ID int64 `xorm:"pk autoincr"` + Version int64 +} + +type Migration struct { + description string + migrate func(*xorm.Engine) error +} + +// NewMigration creates a new migration. +func NewMigration(desc string, fn func(*xorm.Engine) error) *Migration { + return &Migration{desc, fn} +} + +// This is a sequence of additional Forgejo migrations. +// Add new migrations to the bottom of the list. +var migrations = []*Migration{ + // v0 -> v1 + NewMigration("Create the `forgejo_blocked_user` table", forgejo_v1_20.AddForgejoBlockedUser), + // v1 -> v2 + NewMigration("Create the `forgejo_sem_ver` table", forgejo_v1_20.CreateSemVerTable), + // v2 -> v3 + NewMigration("Create the `forgejo_auth_token` table", forgejo_v1_20.CreateAuthorizationTokenTable), + // v3 -> v4 + NewMigration("Add the `default_permissions` column to the `repo_unit` table", forgejo_v1_22.AddDefaultPermissionsToRepoUnit), + // v4 -> v5 + NewMigration("Create the `forgejo_repo_flag` table", forgejo_v1_22.CreateRepoFlagTable), + // v5 -> v6 + NewMigration("Add the `wiki_branch` column to the `repository` table", forgejo_v1_22.AddWikiBranchToRepository), + // v6 -> v7 + NewMigration("Add the `enable_repo_unit_hints` column to the `user` table", forgejo_v1_22.AddUserRepoUnitHintsSetting), + // v7 -> v8 + NewMigration("Modify the `release`.`note` content to remove SSH signatures", forgejo_v1_22.RemoveSSHSignaturesFromReleaseNotes), + // v8 -> v9 + 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), + // v12 -> v13 + NewMigration("Add `hide_archive_links` column to `release` table", AddHideArchiveLinksToRelease), + // v13 -> v14 + NewMigration("Remove Gitea-specific columns from the repository and badge tables", RemoveGiteaSpecificColumnsFromRepositoryAndBadge), + // v14 -> v15 + NewMigration("Create the `federation_host` table", CreateFederationHostTable), + // v15 -> v16 + NewMigration("Create the `federated_user` table", CreateFederatedUserTable), + // v16 -> v17 + NewMigration("Add `normalized_federated_uri` column to `user` table", AddNormalizedFederatedURIToUser), + // v17 -> v18 + NewMigration("Create the `following_repo` table", CreateFollowingRepoTable), + // v18 -> v19 + NewMigration("Add external_url to attachment table", AddExternalURLColumnToAttachmentTable), + // v19 -> v20 + NewMigration("Creating Quota-related tables", CreateQuotaTables), + // v20 -> v21 + NewMigration("Add SSH keypair to `pull_mirror` table", AddSSHKeypairToPushMirror), + // v21 -> v22 + NewMigration("Add `legacy` to `web_authn_credential` table", AddLegacyToWebAuthnCredential), + // v22 -> v23 + NewMigration("Add `delete_branch_after_merge` to `auto_merge` table", AddDeleteBranchAfterMergeToAutoMerge), + // v23 -> v24 + NewMigration("Add `purpose` column to `forgejo_auth_token` table", AddPurposeToForgejoAuthToken), + // v24 -> v25 + NewMigration("Migrate `secret` column to store keying material", MigrateTwoFactorToKeying), + // v25 -> v26 + NewMigration("Add `hash_blake2b` column to `package_blob` table", AddHashBlake2bToPackageBlob), + // v26 -> v27 + NewMigration("Add `created_unix` column to `user_redirect` table", AddCreatedUnixToRedirect), + // v27 -> v28 + NewMigration("Add pronoun privacy settings to user", AddHidePronounsOptionToUser), + // v28 -> v29 + NewMigration("Add public key information to `FederatedUser` and `FederationHost`", AddPublicKeyInformationForFederation), + // v29 -> v30 + NewMigration("Migrate `User.NormalizedFederatedURI` column to extract port & schema into FederatedHost", MigrateNormalizedFederatedURI), + // v30 -> v31 + NewMigration("Normalize repository.topics to empty slice instead of null", SetTopicsAsEmptySlice), + // v31 -> v32 + NewMigration("Migrate maven package name concatenation", ChangeMavenArtifactConcatenation), + // v32 -> v33 + NewMigration("Add federated user activity tables, update the `federated_user` table & add indexes", FederatedUserActivityMigration), + // v33 -> v34 + NewMigration("Add `notify-email` column to `action_run` table", AddNotifyEmailToActionRun), + // v34 -> v35 + NewMigration("Noop because of https://codeberg.org/forgejo/forgejo/issues/8373", NoopAddIndexToActionRunStopped), + // v35 -> v36 + NewMigration("Fix wiki unit default permission", FixWikiUnitDefaultPermission), + // v36 -> v37 + NewMigration("Add `branch_filter` to `push_mirror` table", AddPushMirrorBranchFilter), + // v37 -> v38 + NewMigration("Add `resolved_unix` column to `abuse_report` table", AddResolvedUnixToAbuseReport), + // v38 -> v39 + NewMigration("Migrate `data` column of `secret` table to store keying material", MigrateActionSecretsToKeying), + // v39 -> v40 + NewMigration("Add index for release sha1", AddIndexForReleaseSha1), + // v40 -> v41 + NewMigration("Add foreign keys to stopwatch & tracked_time", AddForeignKeysStopwatchTrackedTime), + // v41 -> v42 + NewMigration("Add action_run concurrency fields", AddActionRunConcurrency), + // v42 -> v43 + NewMigration("Add action_run pre_execution_error field", AddActionRunPreExecutionError), + // v43 -> v44 + NewMigration("Add foreign keys to access", AddForeignKeysAccess), +} + +// GetCurrentDBVersion returns the current Forgejo database version. +func GetCurrentDBVersion(x *xorm.Engine) (int64, error) { + if err := x.Sync(new(ForgejoVersion)); err != nil { + return -1, fmt.Errorf("sync: %w", err) + } + + currentVersion := &ForgejoVersion{ID: 1} + has, err := x.Get(currentVersion) + if err != nil { + return -1, fmt.Errorf("get: %w", err) + } + if !has { + return -1, nil + } + return currentVersion.Version, nil +} + +// ExpectedVersion returns the expected Forgejo database version. +func ExpectedVersion() int64 { + return int64(len(migrations)) +} + +// EnsureUpToDate will check if the Forgejo database is at the correct version. +func EnsureUpToDate(x *xorm.Engine) error { + currentDB, err := GetCurrentDBVersion(x) + if err != nil { + return err + } + + if currentDB < 0 { + return errors.New("database has not been initialized") + } + + expected := ExpectedVersion() + + if currentDB != expected { + return fmt.Errorf(`current Forgejo 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 forgejoMigrationsEnsureUpToDate(x) +} + +var forgejoMigrationsEnsureUpToDate = forgejo_migrations.EnsureUpToDate + +// Migrate Forgejo database to current version. +func Migrate(x *xorm.Engine) error { + // Set a new clean the default mapper to GonicMapper as that is the default for . + x.SetMapper(names.GonicMapper{}) + if err := x.Sync(new(ForgejoVersion)); err != nil { + return fmt.Errorf("sync: %w", err) + } + + currentVersion := &ForgejoVersion{ID: 1} + has, err := x.Get(currentVersion) + freshDB := false + if err != nil { + return fmt.Errorf("get: %w", err) + } else if !has { + // If the version record does not exist we think + // it is a fresh installation and we can skip all migrations. + currentVersion.ID = 0 + currentVersion.Version = ExpectedVersion() + freshDB = true + + if _, err = x.InsertOne(currentVersion); err != nil { + return fmt.Errorf("insert: %w", err) + } + } + + v := currentVersion.Version + + // Downgrading Forgejo's database version not supported + if v > ExpectedVersion() { + msg := fmt.Sprintf("Your Forgejo database (migration version: %d) is for a newer version of Forgejo, you cannot use the newer database for this old Forgejo release (%d).", v, ExpectedVersion()) + 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 cause data loss)." + 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 forgejo_version SET version=%d WHERE id=1;", ExpectedVersion()) + } + _, _ = fmt.Fprintln(os.Stderr, msg) + log.Fatal(msg) + return nil + } + + // Some migration tasks depend on the git command + if git.DefaultContext == nil { + if err = git.InitSimple(context.Background()); err != nil { + return err + } + } + + // Migrate + for i, m := range migrations[v:] { + 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", v+int64(i), m.description, err) + } + currentVersion.Version = v + int64(i) + 1 + if _, err = x.ID(1).Update(currentVersion); err != nil { + return err + } + } + + if err := x.Sync(new(semver.ForgejoSemVer)); err != nil { + return fmt.Errorf("sync: %w", err) + } + + if err := semver.SetVersionStringWithEngine(x, setting.ForgejoVersion); err != nil { + return fmt.Errorf("SetVersionStringWithEngine: %w", err) + } + + return forgejo_migrations.Migrate(x, freshDB) +} diff --git a/models/forgejo_migrations_legacy/migrate_test.go b/models/forgejo_migrations_legacy/migrate_test.go new file mode 100644 index 0000000000..1a0fa14671 --- /dev/null +++ b/models/forgejo_migrations_legacy/migrate_test.go @@ -0,0 +1,45 @@ +// Copyright 2023 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forgejo_migrations_legacy + +import ( + "testing" + + migration_tests "forgejo.org/models/gitea_migrations/test" + "forgejo.org/modules/test" + + "github.com/stretchr/testify/require" + "xorm.io/xorm" +) + +// TestEnsureUpToDate tests the behavior of EnsureUpToDate. +func TestEnsureUpToDate(t *testing.T) { + defer test.MockVariableValue(&forgejoMigrationsEnsureUpToDate, func(x *xorm.Engine) error { + return nil + })() + + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(ForgejoVersion)) + defer deferable() + if x == nil || t.Failed() { + return + } + + // Ensure error if there's no row in Forgejo Version. + err := EnsureUpToDate(x) + require.Error(t, err) + + // Insert 'good' Forgejo Version row. + _, err = x.InsertOne(&ForgejoVersion{ID: 1, Version: ExpectedVersion()}) + require.NoError(t, err) + + err = EnsureUpToDate(x) + require.NoError(t, err) + + // Modify forgejo version to have a lower version. + _, err = x.Exec("UPDATE `forgejo_version` SET version = ? WHERE id = 1", ExpectedVersion()-1) + require.NoError(t, err) + + err = EnsureUpToDate(x) + require.Error(t, err) +} diff --git a/models/forgejo_migrations/v13.go b/models/forgejo_migrations_legacy/v13.go similarity index 90% rename from models/forgejo_migrations/v13.go rename to models/forgejo_migrations_legacy/v13.go index ba4183885e..6c216b3732 100644 --- a/models/forgejo_migrations/v13.go +++ b/models/forgejo_migrations_legacy/v13.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v14.go b/models/forgejo_migrations_legacy/v14.go similarity index 91% rename from models/forgejo_migrations/v14.go rename to models/forgejo_migrations_legacy/v14.go index 65b857d343..7085fb0722 100644 --- a/models/forgejo_migrations/v14.go +++ b/models/forgejo_migrations_legacy/v14.go @@ -1,10 +1,10 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" ) diff --git a/models/forgejo_migrations/v15.go b/models/forgejo_migrations_legacy/v15.go similarity index 95% rename from models/forgejo_migrations/v15.go rename to models/forgejo_migrations_legacy/v15.go index a63199ab19..13e1651fd3 100644 --- a/models/forgejo_migrations/v15.go +++ b/models/forgejo_migrations_legacy/v15.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import ( "time" diff --git a/models/forgejo_migrations/v16.go b/models/forgejo_migrations_legacy/v16.go similarity index 93% rename from models/forgejo_migrations/v16.go rename to models/forgejo_migrations_legacy/v16.go index a7d4d5d590..7d18751262 100644 --- a/models/forgejo_migrations/v16.go +++ b/models/forgejo_migrations_legacy/v16.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v17.go b/models/forgejo_migrations_legacy/v17.go similarity index 90% rename from models/forgejo_migrations/v17.go rename to models/forgejo_migrations_legacy/v17.go index 8ef6f2c681..403351e221 100644 --- a/models/forgejo_migrations/v17.go +++ b/models/forgejo_migrations_legacy/v17.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v18.go b/models/forgejo_migrations_legacy/v18.go similarity index 94% rename from models/forgejo_migrations/v18.go rename to models/forgejo_migrations_legacy/v18.go index e39b0cbf10..e2d2937bfa 100644 --- a/models/forgejo_migrations/v18.go +++ b/models/forgejo_migrations_legacy/v18.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v19.go b/models/forgejo_migrations_legacy/v19.go similarity index 90% rename from models/forgejo_migrations/v19.go rename to models/forgejo_migrations_legacy/v19.go index 43d279dcb0..e0a48a388d 100644 --- a/models/forgejo_migrations/v19.go +++ b/models/forgejo_migrations_legacy/v19.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v1_20/v1.go b/models/forgejo_migrations_legacy/v1_20/v1.go similarity index 100% rename from models/forgejo_migrations/v1_20/v1.go rename to models/forgejo_migrations_legacy/v1_20/v1.go diff --git a/models/forgejo_migrations/v1_20/v2.go b/models/forgejo_migrations_legacy/v1_20/v2.go similarity index 100% rename from models/forgejo_migrations/v1_20/v2.go rename to models/forgejo_migrations_legacy/v1_20/v2.go diff --git a/models/forgejo_migrations/v1_20/v3.go b/models/forgejo_migrations_legacy/v1_20/v3.go similarity index 100% rename from models/forgejo_migrations/v1_20/v3.go rename to models/forgejo_migrations_legacy/v1_20/v3.go diff --git a/models/forgejo_migrations/v1_22/main_test.go b/models/forgejo_migrations_legacy/v1_22/main_test.go similarity index 76% rename from models/forgejo_migrations/v1_22/main_test.go rename to models/forgejo_migrations_legacy/v1_22/main_test.go index d6a5bdacee..26930f8e70 100644 --- a/models/forgejo_migrations/v1_22/main_test.go +++ b/models/forgejo_migrations_legacy/v1_22/main_test.go @@ -6,7 +6,7 @@ package v1_22 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/forgejo_migrations/v1_22/v10.go b/models/forgejo_migrations_legacy/v1_22/v10.go similarity index 100% rename from models/forgejo_migrations/v1_22/v10.go rename to models/forgejo_migrations_legacy/v1_22/v10.go diff --git a/models/forgejo_migrations/v1_22/v11.go b/models/forgejo_migrations_legacy/v1_22/v11.go similarity index 100% rename from models/forgejo_migrations/v1_22/v11.go rename to models/forgejo_migrations_legacy/v1_22/v11.go diff --git a/models/forgejo_migrations/v1_22/v12.go b/models/forgejo_migrations_legacy/v1_22/v12.go similarity index 100% rename from models/forgejo_migrations/v1_22/v12.go rename to models/forgejo_migrations_legacy/v1_22/v12.go diff --git a/models/forgejo_migrations/v1_22/v4.go b/models/forgejo_migrations_legacy/v1_22/v4.go similarity index 100% rename from models/forgejo_migrations/v1_22/v4.go rename to models/forgejo_migrations_legacy/v1_22/v4.go diff --git a/models/forgejo_migrations/v1_22/v5.go b/models/forgejo_migrations_legacy/v1_22/v5.go similarity index 100% rename from models/forgejo_migrations/v1_22/v5.go rename to models/forgejo_migrations_legacy/v1_22/v5.go diff --git a/models/forgejo_migrations/v1_22/v6.go b/models/forgejo_migrations_legacy/v1_22/v6.go similarity index 100% rename from models/forgejo_migrations/v1_22/v6.go rename to models/forgejo_migrations_legacy/v1_22/v6.go diff --git a/models/forgejo_migrations/v1_22/v7.go b/models/forgejo_migrations_legacy/v1_22/v7.go similarity index 100% rename from models/forgejo_migrations/v1_22/v7.go rename to models/forgejo_migrations_legacy/v1_22/v7.go diff --git a/models/forgejo_migrations/v1_22/v8.go b/models/forgejo_migrations_legacy/v1_22/v8.go similarity index 100% rename from models/forgejo_migrations/v1_22/v8.go rename to models/forgejo_migrations_legacy/v1_22/v8.go diff --git a/models/forgejo_migrations/v1_22/v8_test.go b/models/forgejo_migrations_legacy/v1_22/v8_test.go similarity index 93% rename from models/forgejo_migrations/v1_22/v8_test.go rename to models/forgejo_migrations_legacy/v1_22/v8_test.go index 5117dd2dfb..3ef4a05f9f 100644 --- a/models/forgejo_migrations/v1_22/v8_test.go +++ b/models/forgejo_migrations_legacy/v1_22/v8_test.go @@ -6,7 +6,7 @@ package v1_22 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/forgejo_migrations/v1_22/v9.go b/models/forgejo_migrations_legacy/v1_22/v9.go similarity index 100% rename from models/forgejo_migrations/v1_22/v9.go rename to models/forgejo_migrations_legacy/v1_22/v9.go diff --git a/models/forgejo_migrations/v20.go b/models/forgejo_migrations_legacy/v20.go similarity index 97% rename from models/forgejo_migrations/v20.go rename to models/forgejo_migrations_legacy/v20.go index 91c7b8e911..4bd0be6047 100644 --- a/models/forgejo_migrations/v20.go +++ b/models/forgejo_migrations_legacy/v20.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v21.go b/models/forgejo_migrations_legacy/v21.go similarity index 91% rename from models/forgejo_migrations/v21.go rename to models/forgejo_migrations_legacy/v21.go index 61d7950c5a..cc7da2772c 100644 --- a/models/forgejo_migrations/v21.go +++ b/models/forgejo_migrations_legacy/v21.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v22.go b/models/forgejo_migrations_legacy/v22.go similarity index 93% rename from models/forgejo_migrations/v22.go rename to models/forgejo_migrations_legacy/v22.go index 8078591da6..892a5ce851 100644 --- a/models/forgejo_migrations/v22.go +++ b/models/forgejo_migrations_legacy/v22.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v23.go b/models/forgejo_migrations_legacy/v23.go similarity index 93% rename from models/forgejo_migrations/v23.go rename to models/forgejo_migrations_legacy/v23.go index a79a4f3d6e..48aac74204 100644 --- a/models/forgejo_migrations/v23.go +++ b/models/forgejo_migrations_legacy/v23.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v24.go b/models/forgejo_migrations_legacy/v24.go similarity index 93% rename from models/forgejo_migrations/v24.go rename to models/forgejo_migrations_legacy/v24.go index 084a57e1ce..bf3b7b2220 100644 --- a/models/forgejo_migrations/v24.go +++ b/models/forgejo_migrations_legacy/v24.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v25.go b/models/forgejo_migrations_legacy/v25.go similarity index 96% rename from models/forgejo_migrations/v25.go rename to models/forgejo_migrations_legacy/v25.go index 56cde499a3..8c4b623c84 100644 --- a/models/forgejo_migrations/v25.go +++ b/models/forgejo_migrations_legacy/v25.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import ( "context" @@ -23,7 +23,7 @@ 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 + // called from models/gitea_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) diff --git a/models/forgejo_migrations/v25_test.go b/models/forgejo_migrations_legacy/v25_test.go similarity index 94% rename from models/forgejo_migrations/v25_test.go rename to models/forgejo_migrations_legacy/v25_test.go index 68e71da012..86286b2ab1 100644 --- a/models/forgejo_migrations/v25_test.go +++ b/models/forgejo_migrations_legacy/v25_test.go @@ -1,13 +1,13 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import ( "testing" "forgejo.org/models/auth" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "forgejo.org/modules/keying" "forgejo.org/modules/timeutil" diff --git a/models/forgejo_migrations/v26.go b/models/forgejo_migrations_legacy/v26.go similarity index 91% rename from models/forgejo_migrations/v26.go rename to models/forgejo_migrations_legacy/v26.go index a0c47799c2..03d05ad96d 100644 --- a/models/forgejo_migrations/v26.go +++ b/models/forgejo_migrations_legacy/v26.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v27.go b/models/forgejo_migrations_legacy/v27.go similarity index 92% rename from models/forgejo_migrations/v27.go rename to models/forgejo_migrations_legacy/v27.go index 9cfbc64370..531170d06f 100644 --- a/models/forgejo_migrations/v27.go +++ b/models/forgejo_migrations_legacy/v27.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "forgejo.org/modules/timeutil" diff --git a/models/forgejo_migrations/v28.go b/models/forgejo_migrations_legacy/v28.go similarity index 90% rename from models/forgejo_migrations/v28.go rename to models/forgejo_migrations_legacy/v28.go index 19f0dcd862..443c3f5d66 100644 --- a/models/forgejo_migrations/v28.go +++ b/models/forgejo_migrations_legacy/v28.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v29.go b/models/forgejo_migrations_legacy/v29.go similarity index 94% rename from models/forgejo_migrations/v29.go rename to models/forgejo_migrations_legacy/v29.go index 92eb05e8b3..9b79139fcc 100644 --- a/models/forgejo_migrations/v29.go +++ b/models/forgejo_migrations_legacy/v29.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import ( "database/sql" diff --git a/models/forgejo_migrations/v30.go b/models/forgejo_migrations_legacy/v30.go similarity index 97% rename from models/forgejo_migrations/v30.go rename to models/forgejo_migrations_legacy/v30.go index 05a1dff898..2ffafd3fe7 100644 --- a/models/forgejo_migrations/v30.go +++ b/models/forgejo_migrations_legacy/v30.go @@ -1,12 +1,12 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import ( "time" - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "forgejo.org/modules/forgefed" "forgejo.org/modules/log" "forgejo.org/modules/timeutil" diff --git a/models/forgejo_migrations/v30_test.go b/models/forgejo_migrations_legacy/v30_test.go similarity index 96% rename from models/forgejo_migrations/v30_test.go rename to models/forgejo_migrations_legacy/v30_test.go index 152fddeb47..73bfefac90 100644 --- a/models/forgejo_migrations/v30_test.go +++ b/models/forgejo_migrations_legacy/v30_test.go @@ -1,13 +1,13 @@ // Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "testing" "time" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "forgejo.org/modules/timeutil" "github.com/stretchr/testify/require" diff --git a/models/forgejo_migrations/v31.go b/models/forgejo_migrations_legacy/v31.go similarity index 97% rename from models/forgejo_migrations/v31.go rename to models/forgejo_migrations_legacy/v31.go index 23397c7c13..f500ffa231 100644 --- a/models/forgejo_migrations/v31.go +++ b/models/forgejo_migrations_legacy/v31.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "xorm.io/xorm" diff --git a/models/forgejo_migrations/v31_test.go b/models/forgejo_migrations_legacy/v31_test.go similarity index 89% rename from models/forgejo_migrations/v31_test.go rename to models/forgejo_migrations_legacy/v31_test.go index 6d1690aae0..0adc9cc69b 100644 --- a/models/forgejo_migrations/v31_test.go +++ b/models/forgejo_migrations_legacy/v31_test.go @@ -1,12 +1,12 @@ // Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/require" ) diff --git a/models/forgejo_migrations/v32.go b/models/forgejo_migrations_legacy/v32.go similarity index 99% rename from models/forgejo_migrations/v32.go rename to models/forgejo_migrations_legacy/v32.go index ce3f855694..bd5176db1e 100644 --- a/models/forgejo_migrations/v32.go +++ b/models/forgejo_migrations_legacy/v32.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "encoding/xml" diff --git a/models/forgejo_migrations/v32_test.go b/models/forgejo_migrations_legacy/v32_test.go similarity index 99% rename from models/forgejo_migrations/v32_test.go rename to models/forgejo_migrations_legacy/v32_test.go index 24cda891bc..6abb5f9004 100644 --- a/models/forgejo_migrations/v32_test.go +++ b/models/forgejo_migrations_legacy/v32_test.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "bytes" @@ -11,7 +11,7 @@ import ( "strings" "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "forgejo.org/models/packages" "github.com/stretchr/testify/assert" diff --git a/models/forgejo_migrations/v33.go b/models/forgejo_migrations_legacy/v33.go similarity index 98% rename from models/forgejo_migrations/v33.go rename to models/forgejo_migrations_legacy/v33.go index b9ea8efe47..ce220d8179 100644 --- a/models/forgejo_migrations/v33.go +++ b/models/forgejo_migrations_legacy/v33.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import ( "fmt" diff --git a/models/forgejo_migrations/v33_test.go b/models/forgejo_migrations_legacy/v33_test.go similarity index 92% rename from models/forgejo_migrations/v33_test.go rename to models/forgejo_migrations_legacy/v33_test.go index 1d3298da15..a77dfed0c2 100644 --- a/models/forgejo_migrations/v33_test.go +++ b/models/forgejo_migrations_legacy/v33_test.go @@ -1,13 +1,13 @@ // Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "testing" "time" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "forgejo.org/modules/log" ft "forgejo.org/modules/test" diff --git a/models/forgejo_migrations/v34.go b/models/forgejo_migrations_legacy/v34.go similarity index 89% rename from models/forgejo_migrations/v34.go rename to models/forgejo_migrations_legacy/v34.go index d193d799e7..c1a1bfc8d6 100644 --- a/models/forgejo_migrations/v34.go +++ b/models/forgejo_migrations_legacy/v34.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v35.go b/models/forgejo_migrations_legacy/v35.go similarity index 88% rename from models/forgejo_migrations/v35.go rename to models/forgejo_migrations_legacy/v35.go index 9b389fcc12..ea3765fce5 100644 --- a/models/forgejo_migrations/v35.go +++ b/models/forgejo_migrations_legacy/v35.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "xorm.io/xorm" diff --git a/models/forgejo_migrations/v36.go b/models/forgejo_migrations_legacy/v36.go similarity index 97% rename from models/forgejo_migrations/v36.go rename to models/forgejo_migrations_legacy/v36.go index 1a798147cf..5c13f3878e 100644 --- a/models/forgejo_migrations/v36.go +++ b/models/forgejo_migrations_legacy/v36.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "xorm.io/xorm" diff --git a/models/forgejo_migrations/v37.go b/models/forgejo_migrations_legacy/v37.go similarity index 90% rename from models/forgejo_migrations/v37.go rename to models/forgejo_migrations_legacy/v37.go index 89358991af..508f798055 100644 --- a/models/forgejo_migrations/v37.go +++ b/models/forgejo_migrations_legacy/v37.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "xorm.io/xorm" diff --git a/models/forgejo_migrations/v38.go b/models/forgejo_migrations_legacy/v38.go similarity index 92% rename from models/forgejo_migrations/v38.go rename to models/forgejo_migrations_legacy/v38.go index 24240f15a0..93cff2cabb 100644 --- a/models/forgejo_migrations/v38.go +++ b/models/forgejo_migrations_legacy/v38.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "forgejo.org/modules/timeutil" diff --git a/models/forgejo_migrations/v39.go b/models/forgejo_migrations_legacy/v39.go similarity index 98% rename from models/forgejo_migrations/v39.go rename to models/forgejo_migrations_legacy/v39.go index 9af1c250b3..3f0d94b6aa 100644 --- a/models/forgejo_migrations/v39.go +++ b/models/forgejo_migrations_legacy/v39.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "context" diff --git a/models/forgejo_migrations/v39_test.go b/models/forgejo_migrations_legacy/v39_test.go similarity index 94% rename from models/forgejo_migrations/v39_test.go rename to models/forgejo_migrations_legacy/v39_test.go index 42934d912f..6c82f7180f 100644 --- a/models/forgejo_migrations/v39_test.go +++ b/models/forgejo_migrations_legacy/v39_test.go @@ -1,12 +1,12 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "forgejo.org/models/secret" "forgejo.org/modules/keying" "forgejo.org/modules/timeutil" diff --git a/models/forgejo_migrations/v40.go b/models/forgejo_migrations_legacy/v40.go similarity index 88% rename from models/forgejo_migrations/v40.go rename to models/forgejo_migrations_legacy/v40.go index 11e8fbd85e..50dccd393c 100644 --- a/models/forgejo_migrations/v40.go +++ b/models/forgejo_migrations_legacy/v40.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v41.go b/models/forgejo_migrations_legacy/v41.go similarity index 98% rename from models/forgejo_migrations/v41.go rename to models/forgejo_migrations_legacy/v41.go index 5c5e2f8789..4b3306debd 100644 --- a/models/forgejo_migrations/v41.go +++ b/models/forgejo_migrations_legacy/v41.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import ( "errors" diff --git a/models/forgejo_migrations/v42.go b/models/forgejo_migrations_legacy/v42.go similarity index 94% rename from models/forgejo_migrations/v42.go rename to models/forgejo_migrations_legacy/v42.go index 0eb267e93c..940c270699 100644 --- a/models/forgejo_migrations/v42.go +++ b/models/forgejo_migrations_legacy/v42.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v43.go b/models/forgejo_migrations_legacy/v43.go similarity index 93% rename from models/forgejo_migrations/v43.go rename to models/forgejo_migrations_legacy/v43.go index fbf3783e46..215299031c 100644 --- a/models/forgejo_migrations/v43.go +++ b/models/forgejo_migrations_legacy/v43.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations +package forgejo_migrations_legacy import "xorm.io/xorm" diff --git a/models/forgejo_migrations_legacy/v44.go b/models/forgejo_migrations_legacy/v44.go new file mode 100644 index 0000000000..459c7ac29d --- /dev/null +++ b/models/forgejo_migrations_legacy/v44.go @@ -0,0 +1,18 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations_legacy + +import ( + "xorm.io/xorm" +) + +func AddForeignKeysAccess(x *xorm.Engine) error { + type Access struct { + UserID int64 `xorm:"UNIQUE(s) REFERENCES(user, id)"` + RepoID int64 `xorm:"UNIQUE(s) REFERENCES(repository, id)"` + } + return syncDoctorForeignKey(x, []any{ + new(Access), + }) +} diff --git a/models/migrations/base/db.go b/models/gitea_migrations/base/db.go similarity index 100% rename from models/migrations/base/db.go rename to models/gitea_migrations/base/db.go diff --git a/models/migrations/base/db_test.go b/models/gitea_migrations/base/db_test.go similarity index 97% rename from models/migrations/base/db_test.go rename to models/gitea_migrations/base/db_test.go index 4a610e065d..4633c7de10 100644 --- a/models/migrations/base/db_test.go +++ b/models/gitea_migrations/base/db_test.go @@ -6,7 +6,7 @@ package base import ( "testing" - migrations_tests "forgejo.org/models/migrations/test" + migrations_tests "forgejo.org/models/gitea_migrations/test" "forgejo.org/modules/timeutil" "xorm.io/xorm/names" diff --git a/models/migrations/base/hash.go b/models/gitea_migrations/base/hash.go similarity index 100% rename from models/migrations/base/hash.go rename to models/gitea_migrations/base/hash.go diff --git a/models/migrations/base/main_test.go b/models/gitea_migrations/base/main_test.go similarity index 75% rename from models/migrations/base/main_test.go rename to models/gitea_migrations/base/main_test.go index 2b3889441a..73bc7a3521 100644 --- a/models/migrations/base/main_test.go +++ b/models/gitea_migrations/base/main_test.go @@ -6,7 +6,7 @@ package base import ( "testing" - migrations_tests "forgejo.org/models/migrations/test" + migrations_tests "forgejo.org/models/gitea_migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/fixtures/Test_AddCombinedIndexToIssueUser/issue_user.yml b/models/gitea_migrations/fixtures/Test_AddCombinedIndexToIssueUser/issue_user.yml similarity index 100% rename from models/migrations/fixtures/Test_AddCombinedIndexToIssueUser/issue_user.yml rename to models/gitea_migrations/fixtures/Test_AddCombinedIndexToIssueUser/issue_user.yml diff --git a/models/migrations/fixtures/Test_AddConfidentialClientColumnToOAuth2ApplicationTable/oauth2_application.yml b/models/gitea_migrations/fixtures/Test_AddConfidentialClientColumnToOAuth2ApplicationTable/oauth2_application.yml similarity index 100% rename from models/migrations/fixtures/Test_AddConfidentialClientColumnToOAuth2ApplicationTable/oauth2_application.yml rename to models/gitea_migrations/fixtures/Test_AddConfidentialClientColumnToOAuth2ApplicationTable/oauth2_application.yml diff --git a/models/migrations/fixtures/Test_AddHeaderAuthorizationEncryptedColWebhook/expected_webhook.yml b/models/gitea_migrations/fixtures/Test_AddHeaderAuthorizationEncryptedColWebhook/expected_webhook.yml similarity index 100% rename from models/migrations/fixtures/Test_AddHeaderAuthorizationEncryptedColWebhook/expected_webhook.yml rename to models/gitea_migrations/fixtures/Test_AddHeaderAuthorizationEncryptedColWebhook/expected_webhook.yml diff --git a/models/migrations/fixtures/Test_AddHeaderAuthorizationEncryptedColWebhook/hook_task.yml b/models/gitea_migrations/fixtures/Test_AddHeaderAuthorizationEncryptedColWebhook/hook_task.yml similarity index 100% rename from models/migrations/fixtures/Test_AddHeaderAuthorizationEncryptedColWebhook/hook_task.yml rename to models/gitea_migrations/fixtures/Test_AddHeaderAuthorizationEncryptedColWebhook/hook_task.yml diff --git a/models/migrations/fixtures/Test_AddHeaderAuthorizationEncryptedColWebhook/webhook.yml b/models/gitea_migrations/fixtures/Test_AddHeaderAuthorizationEncryptedColWebhook/webhook.yml similarity index 100% rename from models/migrations/fixtures/Test_AddHeaderAuthorizationEncryptedColWebhook/webhook.yml rename to models/gitea_migrations/fixtures/Test_AddHeaderAuthorizationEncryptedColWebhook/webhook.yml diff --git a/models/migrations/fixtures/Test_AddIssueResourceIndexTable/issue.yml b/models/gitea_migrations/fixtures/Test_AddIssueResourceIndexTable/issue.yml similarity index 100% rename from models/migrations/fixtures/Test_AddIssueResourceIndexTable/issue.yml rename to models/gitea_migrations/fixtures/Test_AddIssueResourceIndexTable/issue.yml diff --git a/models/migrations/fixtures/Test_AddPayloadVersionToHookTaskTable/hook_task.yml b/models/gitea_migrations/fixtures/Test_AddPayloadVersionToHookTaskTable/hook_task.yml similarity index 100% rename from models/migrations/fixtures/Test_AddPayloadVersionToHookTaskTable/hook_task.yml rename to models/gitea_migrations/fixtures/Test_AddPayloadVersionToHookTaskTable/hook_task.yml diff --git a/models/migrations/fixtures/Test_AddPayloadVersionToHookTaskTable/hook_task_migrated.yml b/models/gitea_migrations/fixtures/Test_AddPayloadVersionToHookTaskTable/hook_task_migrated.yml similarity index 100% rename from models/migrations/fixtures/Test_AddPayloadVersionToHookTaskTable/hook_task_migrated.yml rename to models/gitea_migrations/fixtures/Test_AddPayloadVersionToHookTaskTable/hook_task_migrated.yml diff --git a/models/migrations/fixtures/Test_AddRepoIDForAttachment/attachment.yml b/models/gitea_migrations/fixtures/Test_AddRepoIDForAttachment/attachment.yml similarity index 100% rename from models/migrations/fixtures/Test_AddRepoIDForAttachment/attachment.yml rename to models/gitea_migrations/fixtures/Test_AddRepoIDForAttachment/attachment.yml diff --git a/models/migrations/fixtures/Test_AddRepoIDForAttachment/issue.yml b/models/gitea_migrations/fixtures/Test_AddRepoIDForAttachment/issue.yml similarity index 100% rename from models/migrations/fixtures/Test_AddRepoIDForAttachment/issue.yml rename to models/gitea_migrations/fixtures/Test_AddRepoIDForAttachment/issue.yml diff --git a/models/migrations/fixtures/Test_AddRepoIDForAttachment/release.yml b/models/gitea_migrations/fixtures/Test_AddRepoIDForAttachment/release.yml similarity index 100% rename from models/migrations/fixtures/Test_AddRepoIDForAttachment/release.yml rename to models/gitea_migrations/fixtures/Test_AddRepoIDForAttachment/release.yml diff --git a/models/migrations/fixtures/Test_AddUniqueIndexForProjectIssue/project_issue.yml b/models/gitea_migrations/fixtures/Test_AddUniqueIndexForProjectIssue/project_issue.yml similarity index 100% rename from models/migrations/fixtures/Test_AddUniqueIndexForProjectIssue/project_issue.yml rename to models/gitea_migrations/fixtures/Test_AddUniqueIndexForProjectIssue/project_issue.yml diff --git a/models/migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package.yml b/models/gitea_migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package.yml similarity index 100% rename from models/migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package.yml rename to models/gitea_migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package.yml diff --git a/models/migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package_blob.yml b/models/gitea_migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package_blob.yml similarity index 100% rename from models/migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package_blob.yml rename to models/gitea_migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package_blob.yml diff --git a/models/migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package_file.yml b/models/gitea_migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package_file.yml similarity index 100% rename from models/migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package_file.yml rename to models/gitea_migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package_file.yml diff --git a/models/migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package_version.yml b/models/gitea_migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package_version.yml similarity index 100% rename from models/migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package_version.yml rename to models/gitea_migrations/fixtures/Test_ChangeMavenArtifactConcatenation/package_version.yml diff --git a/models/migrations/fixtures/Test_CheckProjectColumnsConsistency/project.yml b/models/gitea_migrations/fixtures/Test_CheckProjectColumnsConsistency/project.yml similarity index 100% rename from models/migrations/fixtures/Test_CheckProjectColumnsConsistency/project.yml rename to models/gitea_migrations/fixtures/Test_CheckProjectColumnsConsistency/project.yml diff --git a/models/migrations/fixtures/Test_CheckProjectColumnsConsistency/project_board.yml b/models/gitea_migrations/fixtures/Test_CheckProjectColumnsConsistency/project_board.yml similarity index 100% rename from models/migrations/fixtures/Test_CheckProjectColumnsConsistency/project_board.yml rename to models/gitea_migrations/fixtures/Test_CheckProjectColumnsConsistency/project_board.yml diff --git a/models/migrations/fixtures/Test_DeleteOrphanedIssueLabels/issue_label.yml b/models/gitea_migrations/fixtures/Test_DeleteOrphanedIssueLabels/issue_label.yml similarity index 100% rename from models/migrations/fixtures/Test_DeleteOrphanedIssueLabels/issue_label.yml rename to models/gitea_migrations/fixtures/Test_DeleteOrphanedIssueLabels/issue_label.yml diff --git a/models/migrations/fixtures/Test_DeleteOrphanedIssueLabels/label.yml b/models/gitea_migrations/fixtures/Test_DeleteOrphanedIssueLabels/label.yml similarity index 100% rename from models/migrations/fixtures/Test_DeleteOrphanedIssueLabels/label.yml rename to models/gitea_migrations/fixtures/Test_DeleteOrphanedIssueLabels/label.yml diff --git a/models/migrations/fixtures/Test_MigrateActionSecretToKeying/secret.yml b/models/gitea_migrations/fixtures/Test_MigrateActionSecretToKeying/secret.yml similarity index 100% rename from models/migrations/fixtures/Test_MigrateActionSecretToKeying/secret.yml rename to models/gitea_migrations/fixtures/Test_MigrateActionSecretToKeying/secret.yml diff --git a/models/migrations/fixtures/Test_MigrateNormalizedFederatedURI/federated_user.yaml b/models/gitea_migrations/fixtures/Test_MigrateNormalizedFederatedURI/federated_user.yaml similarity index 100% rename from models/migrations/fixtures/Test_MigrateNormalizedFederatedURI/federated_user.yaml rename to models/gitea_migrations/fixtures/Test_MigrateNormalizedFederatedURI/federated_user.yaml diff --git a/models/migrations/fixtures/Test_MigrateNormalizedFederatedURI/federation_host.yaml b/models/gitea_migrations/fixtures/Test_MigrateNormalizedFederatedURI/federation_host.yaml similarity index 100% rename from models/migrations/fixtures/Test_MigrateNormalizedFederatedURI/federation_host.yaml rename to models/gitea_migrations/fixtures/Test_MigrateNormalizedFederatedURI/federation_host.yaml diff --git a/models/migrations/fixtures/Test_MigrateNormalizedFederatedURI/user.yaml b/models/gitea_migrations/fixtures/Test_MigrateNormalizedFederatedURI/user.yaml similarity index 100% rename from models/migrations/fixtures/Test_MigrateNormalizedFederatedURI/user.yaml rename to models/gitea_migrations/fixtures/Test_MigrateNormalizedFederatedURI/user.yaml diff --git a/models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml b/models/gitea_migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml similarity index 100% rename from models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml rename to models/gitea_migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml diff --git a/models/migrations/fixtures/Test_RemigrateU2FCredentials/expected_webauthn_credential.yml b/models/gitea_migrations/fixtures/Test_RemigrateU2FCredentials/expected_webauthn_credential.yml similarity index 100% rename from models/migrations/fixtures/Test_RemigrateU2FCredentials/expected_webauthn_credential.yml rename to models/gitea_migrations/fixtures/Test_RemigrateU2FCredentials/expected_webauthn_credential.yml diff --git a/models/migrations/fixtures/Test_RemigrateU2FCredentials/u2f_registration.yml b/models/gitea_migrations/fixtures/Test_RemigrateU2FCredentials/u2f_registration.yml similarity index 100% rename from models/migrations/fixtures/Test_RemigrateU2FCredentials/u2f_registration.yml rename to models/gitea_migrations/fixtures/Test_RemigrateU2FCredentials/u2f_registration.yml diff --git a/models/migrations/fixtures/Test_RemigrateU2FCredentials/webauthn_credential.yml b/models/gitea_migrations/fixtures/Test_RemigrateU2FCredentials/webauthn_credential.yml similarity index 100% rename from models/migrations/fixtures/Test_RemigrateU2FCredentials/webauthn_credential.yml rename to models/gitea_migrations/fixtures/Test_RemigrateU2FCredentials/webauthn_credential.yml diff --git a/models/migrations/fixtures/Test_RemoveInvalidLabels/comment.yml b/models/gitea_migrations/fixtures/Test_RemoveInvalidLabels/comment.yml similarity index 100% rename from models/migrations/fixtures/Test_RemoveInvalidLabels/comment.yml rename to models/gitea_migrations/fixtures/Test_RemoveInvalidLabels/comment.yml diff --git a/models/migrations/fixtures/Test_RemoveInvalidLabels/issue.yml b/models/gitea_migrations/fixtures/Test_RemoveInvalidLabels/issue.yml similarity index 100% rename from models/migrations/fixtures/Test_RemoveInvalidLabels/issue.yml rename to models/gitea_migrations/fixtures/Test_RemoveInvalidLabels/issue.yml diff --git a/models/migrations/fixtures/Test_RemoveInvalidLabels/issue_label.yml b/models/gitea_migrations/fixtures/Test_RemoveInvalidLabels/issue_label.yml similarity index 100% rename from models/migrations/fixtures/Test_RemoveInvalidLabels/issue_label.yml rename to models/gitea_migrations/fixtures/Test_RemoveInvalidLabels/issue_label.yml diff --git a/models/migrations/fixtures/Test_RemoveInvalidLabels/label.yml b/models/gitea_migrations/fixtures/Test_RemoveInvalidLabels/label.yml similarity index 100% rename from models/migrations/fixtures/Test_RemoveInvalidLabels/label.yml rename to models/gitea_migrations/fixtures/Test_RemoveInvalidLabels/label.yml diff --git a/models/migrations/fixtures/Test_RemoveInvalidLabels/repository.yml b/models/gitea_migrations/fixtures/Test_RemoveInvalidLabels/repository.yml similarity index 100% rename from models/migrations/fixtures/Test_RemoveInvalidLabels/repository.yml rename to models/gitea_migrations/fixtures/Test_RemoveInvalidLabels/repository.yml diff --git a/models/migrations/fixtures/Test_RemoveSSHSignaturesFromReleaseNotes/release.yml b/models/gitea_migrations/fixtures/Test_RemoveSSHSignaturesFromReleaseNotes/release.yml similarity index 100% rename from models/migrations/fixtures/Test_RemoveSSHSignaturesFromReleaseNotes/release.yml rename to models/gitea_migrations/fixtures/Test_RemoveSSHSignaturesFromReleaseNotes/release.yml diff --git a/models/migrations/fixtures/Test_RepositoryFormat/comment.yml b/models/gitea_migrations/fixtures/Test_RepositoryFormat/comment.yml similarity index 100% rename from models/migrations/fixtures/Test_RepositoryFormat/comment.yml rename to models/gitea_migrations/fixtures/Test_RepositoryFormat/comment.yml diff --git a/models/migrations/fixtures/Test_RepositoryFormat/commit_status.yml b/models/gitea_migrations/fixtures/Test_RepositoryFormat/commit_status.yml similarity index 100% rename from models/migrations/fixtures/Test_RepositoryFormat/commit_status.yml rename to models/gitea_migrations/fixtures/Test_RepositoryFormat/commit_status.yml diff --git a/models/migrations/fixtures/Test_RepositoryFormat/pull_request.yml b/models/gitea_migrations/fixtures/Test_RepositoryFormat/pull_request.yml similarity index 100% rename from models/migrations/fixtures/Test_RepositoryFormat/pull_request.yml rename to models/gitea_migrations/fixtures/Test_RepositoryFormat/pull_request.yml diff --git a/models/migrations/fixtures/Test_RepositoryFormat/release.yml b/models/gitea_migrations/fixtures/Test_RepositoryFormat/release.yml similarity index 100% rename from models/migrations/fixtures/Test_RepositoryFormat/release.yml rename to models/gitea_migrations/fixtures/Test_RepositoryFormat/release.yml diff --git a/models/migrations/fixtures/Test_RepositoryFormat/repo_archiver.yml b/models/gitea_migrations/fixtures/Test_RepositoryFormat/repo_archiver.yml similarity index 100% rename from models/migrations/fixtures/Test_RepositoryFormat/repo_archiver.yml rename to models/gitea_migrations/fixtures/Test_RepositoryFormat/repo_archiver.yml diff --git a/models/migrations/fixtures/Test_RepositoryFormat/repo_indexer_status.yml b/models/gitea_migrations/fixtures/Test_RepositoryFormat/repo_indexer_status.yml similarity index 100% rename from models/migrations/fixtures/Test_RepositoryFormat/repo_indexer_status.yml rename to models/gitea_migrations/fixtures/Test_RepositoryFormat/repo_indexer_status.yml diff --git a/models/migrations/fixtures/Test_RepositoryFormat/repository.yml b/models/gitea_migrations/fixtures/Test_RepositoryFormat/repository.yml similarity index 100% rename from models/migrations/fixtures/Test_RepositoryFormat/repository.yml rename to models/gitea_migrations/fixtures/Test_RepositoryFormat/repository.yml diff --git a/models/migrations/fixtures/Test_RepositoryFormat/review_state.yml b/models/gitea_migrations/fixtures/Test_RepositoryFormat/review_state.yml similarity index 100% rename from models/migrations/fixtures/Test_RepositoryFormat/review_state.yml rename to models/gitea_migrations/fixtures/Test_RepositoryFormat/review_state.yml diff --git a/models/migrations/fixtures/Test_SetTopicsAsEmptySlice/repository.yml b/models/gitea_migrations/fixtures/Test_SetTopicsAsEmptySlice/repository.yml similarity index 100% rename from models/migrations/fixtures/Test_SetTopicsAsEmptySlice/repository.yml rename to models/gitea_migrations/fixtures/Test_SetTopicsAsEmptySlice/repository.yml diff --git a/models/migrations/fixtures/Test_StoreWebauthnCredentialIDAsBytes/expected_webauthn_credential.yml b/models/gitea_migrations/fixtures/Test_StoreWebauthnCredentialIDAsBytes/expected_webauthn_credential.yml similarity index 100% rename from models/migrations/fixtures/Test_StoreWebauthnCredentialIDAsBytes/expected_webauthn_credential.yml rename to models/gitea_migrations/fixtures/Test_StoreWebauthnCredentialIDAsBytes/expected_webauthn_credential.yml diff --git a/models/migrations/fixtures/Test_StoreWebauthnCredentialIDAsBytes/webauthn_credential.yml b/models/gitea_migrations/fixtures/Test_StoreWebauthnCredentialIDAsBytes/webauthn_credential.yml similarity index 100% rename from models/migrations/fixtures/Test_StoreWebauthnCredentialIDAsBytes/webauthn_credential.yml rename to models/gitea_migrations/fixtures/Test_StoreWebauthnCredentialIDAsBytes/webauthn_credential.yml diff --git a/models/migrations/fixtures/Test_UnwrapLDAPSourceCfg/login_source.yml b/models/gitea_migrations/fixtures/Test_UnwrapLDAPSourceCfg/login_source.yml similarity index 100% rename from models/migrations/fixtures/Test_UnwrapLDAPSourceCfg/login_source.yml rename to models/gitea_migrations/fixtures/Test_UnwrapLDAPSourceCfg/login_source.yml diff --git a/models/migrations/fixtures/Test_UpdateBadgeColName/badge.yml b/models/gitea_migrations/fixtures/Test_UpdateBadgeColName/badge.yml similarity index 100% rename from models/migrations/fixtures/Test_UpdateBadgeColName/badge.yml rename to models/gitea_migrations/fixtures/Test_UpdateBadgeColName/badge.yml diff --git a/models/migrations/fixtures/Test_UpdateOpenMilestoneCounts/expected_milestone.yml b/models/gitea_migrations/fixtures/Test_UpdateOpenMilestoneCounts/expected_milestone.yml similarity index 100% rename from models/migrations/fixtures/Test_UpdateOpenMilestoneCounts/expected_milestone.yml rename to models/gitea_migrations/fixtures/Test_UpdateOpenMilestoneCounts/expected_milestone.yml diff --git a/models/migrations/fixtures/Test_UpdateOpenMilestoneCounts/issue.yml b/models/gitea_migrations/fixtures/Test_UpdateOpenMilestoneCounts/issue.yml similarity index 100% rename from models/migrations/fixtures/Test_UpdateOpenMilestoneCounts/issue.yml rename to models/gitea_migrations/fixtures/Test_UpdateOpenMilestoneCounts/issue.yml diff --git a/models/migrations/fixtures/Test_UpdateOpenMilestoneCounts/milestone.yml b/models/gitea_migrations/fixtures/Test_UpdateOpenMilestoneCounts/milestone.yml similarity index 100% rename from models/migrations/fixtures/Test_UpdateOpenMilestoneCounts/milestone.yml rename to models/gitea_migrations/fixtures/Test_UpdateOpenMilestoneCounts/milestone.yml diff --git a/models/migrations/migrations.go b/models/gitea_migrations/migrations.go similarity index 96% rename from models/migrations/migrations.go rename to models/gitea_migrations/migrations.go index 2a5b97f519..7dae8bfcb4 100644 --- a/models/migrations/migrations.go +++ b/models/gitea_migrations/migrations.go @@ -2,7 +2,7 @@ // Copyright 2017 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package migrations +package gitea_migrations import ( "context" @@ -10,25 +10,25 @@ import ( "fmt" "forgejo.org/models/db" - "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/models/forgejo_migrations_legacy" + "forgejo.org/models/gitea_migrations/v1_10" + "forgejo.org/models/gitea_migrations/v1_11" + "forgejo.org/models/gitea_migrations/v1_12" + "forgejo.org/models/gitea_migrations/v1_13" + "forgejo.org/models/gitea_migrations/v1_14" + "forgejo.org/models/gitea_migrations/v1_15" + "forgejo.org/models/gitea_migrations/v1_16" + "forgejo.org/models/gitea_migrations/v1_17" + "forgejo.org/models/gitea_migrations/v1_18" + "forgejo.org/models/gitea_migrations/v1_19" + "forgejo.org/models/gitea_migrations/v1_20" + "forgejo.org/models/gitea_migrations/v1_21" + "forgejo.org/models/gitea_migrations/v1_22" + "forgejo.org/models/gitea_migrations/v1_23" + "forgejo.org/models/gitea_migrations/v1_6" + "forgejo.org/models/gitea_migrations/v1_7" + "forgejo.org/models/gitea_migrations/v1_8" + "forgejo.org/models/gitea_migrations/v1_9" "forgejo.org/modules/git" "forgejo.org/modules/log" "forgejo.org/modules/setting" @@ -367,7 +367,7 @@ func prepareMigrationTasks() []*migration { // Migration to Forgejo v10 newMigration(303, "Gitea last drop", v1_23.GiteaLastDrop), - newMigration(304, "Migrate `secret` column to store keying material", forgejo_migrations.MigrateTwoFactorToKeying), + newMigration(304, "Migrate `secret` column to store keying material", forgejo_migrations_legacy.MigrateTwoFactorToKeying), } return preparedMigrations } @@ -426,7 +426,7 @@ func EnsureUpToDate(x *xorm.Engine) error { return fmt.Errorf(`current database version %d is not equal to the expected version %d. Please run "forgejo [--config /path/to/app.ini] migrate" to update the database version`, currentDB, expectedDB) } - return forgejo_migrations.EnsureUpToDate(x) + return forgejo_migrations_legacy.EnsureUpToDate(x) } func getPendingMigrations(curDBVer int64, migrations []*migration) []*migration { @@ -510,7 +510,7 @@ Please try upgrading to a lower version first (suggested v1.6.4), then upgrade t } // Execute Forgejo specific migrations. - return forgejo_migrations.Migrate(x) + return forgejo_migrations_legacy.Migrate(x) } // WrapperMigrate is a wrapper for Migrate to be called in diagnostics diff --git a/models/migrations/migrations_test.go b/models/gitea_migrations/migrations_test.go similarity index 96% rename from models/migrations/migrations_test.go rename to models/gitea_migrations/migrations_test.go index 468c918c93..a2491dd65a 100644 --- a/models/migrations/migrations_test.go +++ b/models/gitea_migrations/migrations_test.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package migrations +package gitea_migrations import ( "testing" diff --git a/models/migrations/test/tests.go b/models/gitea_migrations/test/tests.go similarity index 98% rename from models/migrations/test/tests.go rename to models/gitea_migrations/test/tests.go index 67a65eef44..6a4865194d 100644 --- a/models/migrations/test/tests.go +++ b/models/gitea_migrations/test/tests.go @@ -31,7 +31,7 @@ import ( // PrepareTestEnv prepares the test environment and reset the database. The skip parameter should usually be 0. // Provide models to be sync'd with the database - in particular any models you expect fixtures to be loaded from. // -// fixtures in `models/migrations/fixtures/` will be loaded automatically +// fixtures in `models/gitea_migrations/fixtures/` will be loaded automatically func PrepareTestEnv(t *testing.T, skip int, syncModels ...any) (*xorm.Engine, func()) { t.Helper() ourSkip := 2 @@ -89,7 +89,7 @@ func PrepareTestEnv(t *testing.T, skip int, syncModels ...any) (*xorm.Engine, fu } } - fixturesDir := filepath.Join(filepath.Dir(setting.AppPath), "models", "migrations", "fixtures", t.Name()) + fixturesDir := filepath.Join(filepath.Dir(setting.AppPath), "models", "gitea_migrations", "fixtures", t.Name()) if _, err := os.Stat(fixturesDir); err == nil { t.Logf("initializing fixtures from: %s", fixturesDir) diff --git a/models/migrations/v1_10/v100.go b/models/gitea_migrations/v1_10/v100.go similarity index 100% rename from models/migrations/v1_10/v100.go rename to models/gitea_migrations/v1_10/v100.go diff --git a/models/migrations/v1_10/v101.go b/models/gitea_migrations/v1_10/v101.go similarity index 100% rename from models/migrations/v1_10/v101.go rename to models/gitea_migrations/v1_10/v101.go diff --git a/models/migrations/v1_10/v88.go b/models/gitea_migrations/v1_10/v88.go similarity index 100% rename from models/migrations/v1_10/v88.go rename to models/gitea_migrations/v1_10/v88.go diff --git a/models/migrations/v1_10/v89.go b/models/gitea_migrations/v1_10/v89.go similarity index 100% rename from models/migrations/v1_10/v89.go rename to models/gitea_migrations/v1_10/v89.go diff --git a/models/migrations/v1_10/v90.go b/models/gitea_migrations/v1_10/v90.go similarity index 100% rename from models/migrations/v1_10/v90.go rename to models/gitea_migrations/v1_10/v90.go diff --git a/models/migrations/v1_10/v91.go b/models/gitea_migrations/v1_10/v91.go similarity index 100% rename from models/migrations/v1_10/v91.go rename to models/gitea_migrations/v1_10/v91.go diff --git a/models/migrations/v1_10/v92.go b/models/gitea_migrations/v1_10/v92.go similarity index 100% rename from models/migrations/v1_10/v92.go rename to models/gitea_migrations/v1_10/v92.go diff --git a/models/migrations/v1_10/v93.go b/models/gitea_migrations/v1_10/v93.go similarity index 100% rename from models/migrations/v1_10/v93.go rename to models/gitea_migrations/v1_10/v93.go diff --git a/models/migrations/v1_10/v94.go b/models/gitea_migrations/v1_10/v94.go similarity index 100% rename from models/migrations/v1_10/v94.go rename to models/gitea_migrations/v1_10/v94.go diff --git a/models/migrations/v1_10/v95.go b/models/gitea_migrations/v1_10/v95.go similarity index 100% rename from models/migrations/v1_10/v95.go rename to models/gitea_migrations/v1_10/v95.go diff --git a/models/migrations/v1_10/v96.go b/models/gitea_migrations/v1_10/v96.go similarity index 100% rename from models/migrations/v1_10/v96.go rename to models/gitea_migrations/v1_10/v96.go diff --git a/models/migrations/v1_10/v97.go b/models/gitea_migrations/v1_10/v97.go similarity index 100% rename from models/migrations/v1_10/v97.go rename to models/gitea_migrations/v1_10/v97.go diff --git a/models/migrations/v1_10/v98.go b/models/gitea_migrations/v1_10/v98.go similarity index 100% rename from models/migrations/v1_10/v98.go rename to models/gitea_migrations/v1_10/v98.go diff --git a/models/migrations/v1_10/v99.go b/models/gitea_migrations/v1_10/v99.go similarity index 100% rename from models/migrations/v1_10/v99.go rename to models/gitea_migrations/v1_10/v99.go diff --git a/models/migrations/v1_11/v102.go b/models/gitea_migrations/v1_11/v102.go similarity index 90% rename from models/migrations/v1_11/v102.go rename to models/gitea_migrations/v1_11/v102.go index 15f0c83c36..53288f18ec 100644 --- a/models/migrations/v1_11/v102.go +++ b/models/gitea_migrations/v1_11/v102.go @@ -4,7 +4,7 @@ package v1_11 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_11/v103.go b/models/gitea_migrations/v1_11/v103.go similarity index 100% rename from models/migrations/v1_11/v103.go rename to models/gitea_migrations/v1_11/v103.go diff --git a/models/migrations/v1_11/v104.go b/models/gitea_migrations/v1_11/v104.go similarity index 93% rename from models/migrations/v1_11/v104.go rename to models/gitea_migrations/v1_11/v104.go index 7461f0cda3..47cf320359 100644 --- a/models/migrations/v1_11/v104.go +++ b/models/gitea_migrations/v1_11/v104.go @@ -4,7 +4,7 @@ package v1_11 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_11/v105.go b/models/gitea_migrations/v1_11/v105.go similarity index 100% rename from models/migrations/v1_11/v105.go rename to models/gitea_migrations/v1_11/v105.go diff --git a/models/migrations/v1_11/v106.go b/models/gitea_migrations/v1_11/v106.go similarity index 100% rename from models/migrations/v1_11/v106.go rename to models/gitea_migrations/v1_11/v106.go diff --git a/models/migrations/v1_11/v107.go b/models/gitea_migrations/v1_11/v107.go similarity index 100% rename from models/migrations/v1_11/v107.go rename to models/gitea_migrations/v1_11/v107.go diff --git a/models/migrations/v1_11/v108.go b/models/gitea_migrations/v1_11/v108.go similarity index 100% rename from models/migrations/v1_11/v108.go rename to models/gitea_migrations/v1_11/v108.go diff --git a/models/migrations/v1_11/v109.go b/models/gitea_migrations/v1_11/v109.go similarity index 100% rename from models/migrations/v1_11/v109.go rename to models/gitea_migrations/v1_11/v109.go diff --git a/models/migrations/v1_11/v110.go b/models/gitea_migrations/v1_11/v110.go similarity index 100% rename from models/migrations/v1_11/v110.go rename to models/gitea_migrations/v1_11/v110.go diff --git a/models/migrations/v1_11/v111.go b/models/gitea_migrations/v1_11/v111.go similarity index 100% rename from models/migrations/v1_11/v111.go rename to models/gitea_migrations/v1_11/v111.go diff --git a/models/migrations/v1_11/v112.go b/models/gitea_migrations/v1_11/v112.go similarity index 100% rename from models/migrations/v1_11/v112.go rename to models/gitea_migrations/v1_11/v112.go diff --git a/models/migrations/v1_11/v113.go b/models/gitea_migrations/v1_11/v113.go similarity index 100% rename from models/migrations/v1_11/v113.go rename to models/gitea_migrations/v1_11/v113.go diff --git a/models/migrations/v1_11/v114.go b/models/gitea_migrations/v1_11/v114.go similarity index 100% rename from models/migrations/v1_11/v114.go rename to models/gitea_migrations/v1_11/v114.go diff --git a/models/migrations/v1_11/v115.go b/models/gitea_migrations/v1_11/v115.go similarity index 100% rename from models/migrations/v1_11/v115.go rename to models/gitea_migrations/v1_11/v115.go diff --git a/models/migrations/v1_11/v116.go b/models/gitea_migrations/v1_11/v116.go similarity index 100% rename from models/migrations/v1_11/v116.go rename to models/gitea_migrations/v1_11/v116.go diff --git a/models/migrations/v1_12/v117.go b/models/gitea_migrations/v1_12/v117.go similarity index 100% rename from models/migrations/v1_12/v117.go rename to models/gitea_migrations/v1_12/v117.go diff --git a/models/migrations/v1_12/v118.go b/models/gitea_migrations/v1_12/v118.go similarity index 100% rename from models/migrations/v1_12/v118.go rename to models/gitea_migrations/v1_12/v118.go diff --git a/models/migrations/v1_12/v119.go b/models/gitea_migrations/v1_12/v119.go similarity index 100% rename from models/migrations/v1_12/v119.go rename to models/gitea_migrations/v1_12/v119.go diff --git a/models/migrations/v1_12/v120.go b/models/gitea_migrations/v1_12/v120.go similarity index 100% rename from models/migrations/v1_12/v120.go rename to models/gitea_migrations/v1_12/v120.go diff --git a/models/migrations/v1_12/v121.go b/models/gitea_migrations/v1_12/v121.go similarity index 100% rename from models/migrations/v1_12/v121.go rename to models/gitea_migrations/v1_12/v121.go diff --git a/models/migrations/v1_12/v122.go b/models/gitea_migrations/v1_12/v122.go similarity index 100% rename from models/migrations/v1_12/v122.go rename to models/gitea_migrations/v1_12/v122.go diff --git a/models/migrations/v1_12/v123.go b/models/gitea_migrations/v1_12/v123.go similarity index 100% rename from models/migrations/v1_12/v123.go rename to models/gitea_migrations/v1_12/v123.go diff --git a/models/migrations/v1_12/v124.go b/models/gitea_migrations/v1_12/v124.go similarity index 100% rename from models/migrations/v1_12/v124.go rename to models/gitea_migrations/v1_12/v124.go diff --git a/models/migrations/v1_12/v125.go b/models/gitea_migrations/v1_12/v125.go similarity index 100% rename from models/migrations/v1_12/v125.go rename to models/gitea_migrations/v1_12/v125.go diff --git a/models/migrations/v1_12/v126.go b/models/gitea_migrations/v1_12/v126.go similarity index 100% rename from models/migrations/v1_12/v126.go rename to models/gitea_migrations/v1_12/v126.go diff --git a/models/migrations/v1_12/v127.go b/models/gitea_migrations/v1_12/v127.go similarity index 100% rename from models/migrations/v1_12/v127.go rename to models/gitea_migrations/v1_12/v127.go diff --git a/models/migrations/v1_12/v128.go b/models/gitea_migrations/v1_12/v128.go similarity index 100% rename from models/migrations/v1_12/v128.go rename to models/gitea_migrations/v1_12/v128.go diff --git a/models/migrations/v1_12/v129.go b/models/gitea_migrations/v1_12/v129.go similarity index 100% rename from models/migrations/v1_12/v129.go rename to models/gitea_migrations/v1_12/v129.go diff --git a/models/migrations/v1_12/v130.go b/models/gitea_migrations/v1_12/v130.go similarity index 100% rename from models/migrations/v1_12/v130.go rename to models/gitea_migrations/v1_12/v130.go diff --git a/models/migrations/v1_12/v131.go b/models/gitea_migrations/v1_12/v131.go similarity index 100% rename from models/migrations/v1_12/v131.go rename to models/gitea_migrations/v1_12/v131.go diff --git a/models/migrations/v1_12/v132.go b/models/gitea_migrations/v1_12/v132.go similarity index 100% rename from models/migrations/v1_12/v132.go rename to models/gitea_migrations/v1_12/v132.go diff --git a/models/migrations/v1_12/v133.go b/models/gitea_migrations/v1_12/v133.go similarity index 100% rename from models/migrations/v1_12/v133.go rename to models/gitea_migrations/v1_12/v133.go diff --git a/models/migrations/v1_12/v134.go b/models/gitea_migrations/v1_12/v134.go similarity index 100% rename from models/migrations/v1_12/v134.go rename to models/gitea_migrations/v1_12/v134.go diff --git a/models/migrations/v1_12/v135.go b/models/gitea_migrations/v1_12/v135.go similarity index 100% rename from models/migrations/v1_12/v135.go rename to models/gitea_migrations/v1_12/v135.go diff --git a/models/migrations/v1_12/v136.go b/models/gitea_migrations/v1_12/v136.go similarity index 100% rename from models/migrations/v1_12/v136.go rename to models/gitea_migrations/v1_12/v136.go diff --git a/models/migrations/v1_12/v137.go b/models/gitea_migrations/v1_12/v137.go similarity index 100% rename from models/migrations/v1_12/v137.go rename to models/gitea_migrations/v1_12/v137.go diff --git a/models/migrations/v1_12/v138.go b/models/gitea_migrations/v1_12/v138.go similarity index 100% rename from models/migrations/v1_12/v138.go rename to models/gitea_migrations/v1_12/v138.go diff --git a/models/migrations/v1_12/v139.go b/models/gitea_migrations/v1_12/v139.go similarity index 100% rename from models/migrations/v1_12/v139.go rename to models/gitea_migrations/v1_12/v139.go diff --git a/models/migrations/v1_13/v140.go b/models/gitea_migrations/v1_13/v140.go similarity index 96% rename from models/migrations/v1_13/v140.go rename to models/gitea_migrations/v1_13/v140.go index 5bb612c098..c9213a3f54 100644 --- a/models/migrations/v1_13/v140.go +++ b/models/gitea_migrations/v1_13/v140.go @@ -6,7 +6,7 @@ package v1_13 import ( "fmt" - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "forgejo.org/modules/setting" "xorm.io/xorm" diff --git a/models/migrations/v1_13/v141.go b/models/gitea_migrations/v1_13/v141.go similarity index 100% rename from models/migrations/v1_13/v141.go rename to models/gitea_migrations/v1_13/v141.go diff --git a/models/migrations/v1_13/v142.go b/models/gitea_migrations/v1_13/v142.go similarity index 100% rename from models/migrations/v1_13/v142.go rename to models/gitea_migrations/v1_13/v142.go diff --git a/models/migrations/v1_13/v143.go b/models/gitea_migrations/v1_13/v143.go similarity index 100% rename from models/migrations/v1_13/v143.go rename to models/gitea_migrations/v1_13/v143.go diff --git a/models/migrations/v1_13/v144.go b/models/gitea_migrations/v1_13/v144.go similarity index 100% rename from models/migrations/v1_13/v144.go rename to models/gitea_migrations/v1_13/v144.go diff --git a/models/migrations/v1_13/v145.go b/models/gitea_migrations/v1_13/v145.go similarity index 100% rename from models/migrations/v1_13/v145.go rename to models/gitea_migrations/v1_13/v145.go diff --git a/models/migrations/v1_13/v146.go b/models/gitea_migrations/v1_13/v146.go similarity index 100% rename from models/migrations/v1_13/v146.go rename to models/gitea_migrations/v1_13/v146.go diff --git a/models/migrations/v1_13/v147.go b/models/gitea_migrations/v1_13/v147.go similarity index 100% rename from models/migrations/v1_13/v147.go rename to models/gitea_migrations/v1_13/v147.go diff --git a/models/migrations/v1_13/v148.go b/models/gitea_migrations/v1_13/v148.go similarity index 100% rename from models/migrations/v1_13/v148.go rename to models/gitea_migrations/v1_13/v148.go diff --git a/models/migrations/v1_13/v149.go b/models/gitea_migrations/v1_13/v149.go similarity index 100% rename from models/migrations/v1_13/v149.go rename to models/gitea_migrations/v1_13/v149.go diff --git a/models/migrations/v1_13/v150.go b/models/gitea_migrations/v1_13/v150.go similarity index 95% rename from models/migrations/v1_13/v150.go rename to models/gitea_migrations/v1_13/v150.go index f943bdbc57..0f92712327 100644 --- a/models/migrations/v1_13/v150.go +++ b/models/gitea_migrations/v1_13/v150.go @@ -4,7 +4,7 @@ package v1_13 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "forgejo.org/modules/timeutil" "xorm.io/xorm" diff --git a/models/migrations/v1_13/v151.go b/models/gitea_migrations/v1_13/v151.go similarity index 100% rename from models/migrations/v1_13/v151.go rename to models/gitea_migrations/v1_13/v151.go diff --git a/models/migrations/v1_13/v152.go b/models/gitea_migrations/v1_13/v152.go similarity index 100% rename from models/migrations/v1_13/v152.go rename to models/gitea_migrations/v1_13/v152.go diff --git a/models/migrations/v1_13/v153.go b/models/gitea_migrations/v1_13/v153.go similarity index 100% rename from models/migrations/v1_13/v153.go rename to models/gitea_migrations/v1_13/v153.go diff --git a/models/migrations/v1_13/v154.go b/models/gitea_migrations/v1_13/v154.go similarity index 100% rename from models/migrations/v1_13/v154.go rename to models/gitea_migrations/v1_13/v154.go diff --git a/models/migrations/v1_14/main_test.go b/models/gitea_migrations/v1_14/main_test.go similarity index 76% rename from models/migrations/v1_14/main_test.go rename to models/gitea_migrations/v1_14/main_test.go index 57cf995be1..129e66f032 100644 --- a/models/migrations/v1_14/main_test.go +++ b/models/gitea_migrations/v1_14/main_test.go @@ -6,7 +6,7 @@ package v1_14 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_14/v155.go b/models/gitea_migrations/v1_14/v155.go similarity index 100% rename from models/migrations/v1_14/v155.go rename to models/gitea_migrations/v1_14/v155.go diff --git a/models/migrations/v1_14/v156.go b/models/gitea_migrations/v1_14/v156.go similarity index 100% rename from models/migrations/v1_14/v156.go rename to models/gitea_migrations/v1_14/v156.go diff --git a/models/migrations/v1_14/v157.go b/models/gitea_migrations/v1_14/v157.go similarity index 100% rename from models/migrations/v1_14/v157.go rename to models/gitea_migrations/v1_14/v157.go diff --git a/models/migrations/v1_14/v158.go b/models/gitea_migrations/v1_14/v158.go similarity index 100% rename from models/migrations/v1_14/v158.go rename to models/gitea_migrations/v1_14/v158.go diff --git a/models/migrations/v1_14/v159.go b/models/gitea_migrations/v1_14/v159.go similarity index 96% rename from models/migrations/v1_14/v159.go rename to models/gitea_migrations/v1_14/v159.go index d8c9a421b7..d8193d25bc 100644 --- a/models/migrations/v1_14/v159.go +++ b/models/gitea_migrations/v1_14/v159.go @@ -4,7 +4,7 @@ package v1_14 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "forgejo.org/modules/timeutil" "xorm.io/xorm" diff --git a/models/migrations/v1_14/v160.go b/models/gitea_migrations/v1_14/v160.go similarity index 100% rename from models/migrations/v1_14/v160.go rename to models/gitea_migrations/v1_14/v160.go diff --git a/models/migrations/v1_14/v161.go b/models/gitea_migrations/v1_14/v161.go similarity index 96% rename from models/migrations/v1_14/v161.go rename to models/gitea_migrations/v1_14/v161.go index 9c850ad0c2..b689a75a05 100644 --- a/models/migrations/v1_14/v161.go +++ b/models/gitea_migrations/v1_14/v161.go @@ -6,7 +6,7 @@ package v1_14 import ( "context" - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v162.go b/models/gitea_migrations/v1_14/v162.go similarity index 96% rename from models/migrations/v1_14/v162.go rename to models/gitea_migrations/v1_14/v162.go index ead63f16f4..69016f3f72 100644 --- a/models/migrations/v1_14/v162.go +++ b/models/gitea_migrations/v1_14/v162.go @@ -4,7 +4,7 @@ package v1_14 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v163.go b/models/gitea_migrations/v1_14/v163.go similarity index 94% rename from models/migrations/v1_14/v163.go rename to models/gitea_migrations/v1_14/v163.go index 696ee17138..4c838df865 100644 --- a/models/migrations/v1_14/v163.go +++ b/models/gitea_migrations/v1_14/v163.go @@ -4,7 +4,7 @@ package v1_14 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v164.go b/models/gitea_migrations/v1_14/v164.go similarity index 100% rename from models/migrations/v1_14/v164.go rename to models/gitea_migrations/v1_14/v164.go diff --git a/models/migrations/v1_14/v165.go b/models/gitea_migrations/v1_14/v165.go similarity index 96% rename from models/migrations/v1_14/v165.go rename to models/gitea_migrations/v1_14/v165.go index 90fd2b1e46..11b46e5742 100644 --- a/models/migrations/v1_14/v165.go +++ b/models/gitea_migrations/v1_14/v165.go @@ -4,7 +4,7 @@ package v1_14 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/migrations/v1_14/v166.go b/models/gitea_migrations/v1_14/v166.go similarity index 100% rename from models/migrations/v1_14/v166.go rename to models/gitea_migrations/v1_14/v166.go diff --git a/models/migrations/v1_14/v167.go b/models/gitea_migrations/v1_14/v167.go similarity index 100% rename from models/migrations/v1_14/v167.go rename to models/gitea_migrations/v1_14/v167.go diff --git a/models/migrations/v1_14/v168.go b/models/gitea_migrations/v1_14/v168.go similarity index 100% rename from models/migrations/v1_14/v168.go rename to models/gitea_migrations/v1_14/v168.go diff --git a/models/migrations/v1_14/v169.go b/models/gitea_migrations/v1_14/v169.go similarity index 100% rename from models/migrations/v1_14/v169.go rename to models/gitea_migrations/v1_14/v169.go diff --git a/models/migrations/v1_14/v170.go b/models/gitea_migrations/v1_14/v170.go similarity index 100% rename from models/migrations/v1_14/v170.go rename to models/gitea_migrations/v1_14/v170.go diff --git a/models/migrations/v1_14/v171.go b/models/gitea_migrations/v1_14/v171.go similarity index 100% rename from models/migrations/v1_14/v171.go rename to models/gitea_migrations/v1_14/v171.go diff --git a/models/migrations/v1_14/v172.go b/models/gitea_migrations/v1_14/v172.go similarity index 100% rename from models/migrations/v1_14/v172.go rename to models/gitea_migrations/v1_14/v172.go diff --git a/models/migrations/v1_14/v173.go b/models/gitea_migrations/v1_14/v173.go similarity index 100% rename from models/migrations/v1_14/v173.go rename to models/gitea_migrations/v1_14/v173.go diff --git a/models/migrations/v1_14/v174.go b/models/gitea_migrations/v1_14/v174.go similarity index 100% rename from models/migrations/v1_14/v174.go rename to models/gitea_migrations/v1_14/v174.go diff --git a/models/migrations/v1_14/v175.go b/models/gitea_migrations/v1_14/v175.go similarity index 100% rename from models/migrations/v1_14/v175.go rename to models/gitea_migrations/v1_14/v175.go diff --git a/models/migrations/v1_14/v176.go b/models/gitea_migrations/v1_14/v176.go similarity index 100% rename from models/migrations/v1_14/v176.go rename to models/gitea_migrations/v1_14/v176.go diff --git a/models/migrations/v1_14/v176_test.go b/models/gitea_migrations/v1_14/v176_test.go similarity index 98% rename from models/migrations/v1_14/v176_test.go rename to models/gitea_migrations/v1_14/v176_test.go index d56b3e0470..60b555b520 100644 --- a/models/migrations/v1_14/v176_test.go +++ b/models/gitea_migrations/v1_14/v176_test.go @@ -6,7 +6,7 @@ package v1_14 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/assert" ) diff --git a/models/migrations/v1_14/v177.go b/models/gitea_migrations/v1_14/v177.go similarity index 100% rename from models/migrations/v1_14/v177.go rename to models/gitea_migrations/v1_14/v177.go diff --git a/models/migrations/v1_14/v177_test.go b/models/gitea_migrations/v1_14/v177_test.go similarity index 97% rename from models/migrations/v1_14/v177_test.go rename to models/gitea_migrations/v1_14/v177_test.go index 0e0a67fd33..ee69dbad53 100644 --- a/models/migrations/v1_14/v177_test.go +++ b/models/gitea_migrations/v1_14/v177_test.go @@ -6,7 +6,7 @@ package v1_14 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" diff --git a/models/migrations/v1_15/main_test.go b/models/gitea_migrations/v1_15/main_test.go similarity index 76% rename from models/migrations/v1_15/main_test.go rename to models/gitea_migrations/v1_15/main_test.go index 4cf6d6f695..4811142c43 100644 --- a/models/migrations/v1_15/main_test.go +++ b/models/gitea_migrations/v1_15/main_test.go @@ -6,7 +6,7 @@ package v1_15 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_15/v178.go b/models/gitea_migrations/v1_15/v178.go similarity index 100% rename from models/migrations/v1_15/v178.go rename to models/gitea_migrations/v1_15/v178.go diff --git a/models/migrations/v1_15/v179.go b/models/gitea_migrations/v1_15/v179.go similarity index 93% rename from models/migrations/v1_15/v179.go rename to models/gitea_migrations/v1_15/v179.go index ce514cc4a9..eb87702475 100644 --- a/models/migrations/v1_15/v179.go +++ b/models/gitea_migrations/v1_15/v179.go @@ -4,7 +4,7 @@ package v1_15 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/migrations/v1_15/v180.go b/models/gitea_migrations/v1_15/v180.go similarity index 100% rename from models/migrations/v1_15/v180.go rename to models/gitea_migrations/v1_15/v180.go diff --git a/models/migrations/v1_15/v181.go b/models/gitea_migrations/v1_15/v181.go similarity index 100% rename from models/migrations/v1_15/v181.go rename to models/gitea_migrations/v1_15/v181.go diff --git a/models/migrations/v1_15/v181_test.go b/models/gitea_migrations/v1_15/v181_test.go similarity index 95% rename from models/migrations/v1_15/v181_test.go rename to models/gitea_migrations/v1_15/v181_test.go index 8196f751e5..130bb35cc7 100644 --- a/models/migrations/v1_15/v181_test.go +++ b/models/gitea_migrations/v1_15/v181_test.go @@ -7,7 +7,7 @@ import ( "strings" "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_15/v182.go b/models/gitea_migrations/v1_15/v182.go similarity index 100% rename from models/migrations/v1_15/v182.go rename to models/gitea_migrations/v1_15/v182.go diff --git a/models/migrations/v1_15/v182_test.go b/models/gitea_migrations/v1_15/v182_test.go similarity index 95% rename from models/migrations/v1_15/v182_test.go rename to models/gitea_migrations/v1_15/v182_test.go index 2baf90d06a..f67fc6586a 100644 --- a/models/migrations/v1_15/v182_test.go +++ b/models/gitea_migrations/v1_15/v182_test.go @@ -6,7 +6,7 @@ package v1_15 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_15/v183.go b/models/gitea_migrations/v1_15/v183.go similarity index 100% rename from models/migrations/v1_15/v183.go rename to models/gitea_migrations/v1_15/v183.go diff --git a/models/migrations/v1_15/v184.go b/models/gitea_migrations/v1_15/v184.go similarity index 97% rename from models/migrations/v1_15/v184.go rename to models/gitea_migrations/v1_15/v184.go index fbe0dcd780..58cf99af43 100644 --- a/models/migrations/v1_15/v184.go +++ b/models/gitea_migrations/v1_15/v184.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "forgejo.org/modules/setting" "xorm.io/xorm" diff --git a/models/migrations/v1_15/v185.go b/models/gitea_migrations/v1_15/v185.go similarity index 100% rename from models/migrations/v1_15/v185.go rename to models/gitea_migrations/v1_15/v185.go diff --git a/models/migrations/v1_15/v186.go b/models/gitea_migrations/v1_15/v186.go similarity index 100% rename from models/migrations/v1_15/v186.go rename to models/gitea_migrations/v1_15/v186.go diff --git a/models/migrations/v1_15/v187.go b/models/gitea_migrations/v1_15/v187.go similarity index 96% rename from models/migrations/v1_15/v187.go rename to models/gitea_migrations/v1_15/v187.go index fabef14779..76c29755f1 100644 --- a/models/migrations/v1_15/v187.go +++ b/models/gitea_migrations/v1_15/v187.go @@ -4,7 +4,7 @@ package v1_15 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_15/v188.go b/models/gitea_migrations/v1_15/v188.go similarity index 100% rename from models/migrations/v1_15/v188.go rename to models/gitea_migrations/v1_15/v188.go diff --git a/models/migrations/v1_16/main_test.go b/models/gitea_migrations/v1_16/main_test.go similarity index 76% rename from models/migrations/v1_16/main_test.go rename to models/gitea_migrations/v1_16/main_test.go index 8c0a043be6..5b7cdb0032 100644 --- a/models/migrations/v1_16/main_test.go +++ b/models/gitea_migrations/v1_16/main_test.go @@ -6,7 +6,7 @@ package v1_16 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_16/v189.go b/models/gitea_migrations/v1_16/v189.go similarity index 98% rename from models/migrations/v1_16/v189.go rename to models/gitea_migrations/v1_16/v189.go index 19bfcb2423..a2ba3a0c64 100644 --- a/models/migrations/v1_16/v189.go +++ b/models/gitea_migrations/v1_16/v189.go @@ -7,7 +7,7 @@ import ( "encoding/binary" "fmt" - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "forgejo.org/modules/json" "xorm.io/xorm" diff --git a/models/migrations/v1_16/v189_test.go b/models/gitea_migrations/v1_16/v189_test.go similarity index 97% rename from models/migrations/v1_16/v189_test.go rename to models/gitea_migrations/v1_16/v189_test.go index 9d74462a92..7b50cac3d8 100644 --- a/models/migrations/v1_16/v189_test.go +++ b/models/gitea_migrations/v1_16/v189_test.go @@ -6,7 +6,7 @@ package v1_16 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "forgejo.org/modules/json" "github.com/stretchr/testify/assert" diff --git a/models/migrations/v1_16/v190.go b/models/gitea_migrations/v1_16/v190.go similarity index 100% rename from models/migrations/v1_16/v190.go rename to models/gitea_migrations/v1_16/v190.go diff --git a/models/migrations/v1_16/v191.go b/models/gitea_migrations/v1_16/v191.go similarity index 100% rename from models/migrations/v1_16/v191.go rename to models/gitea_migrations/v1_16/v191.go diff --git a/models/migrations/v1_16/v192.go b/models/gitea_migrations/v1_16/v192.go similarity index 88% rename from models/migrations/v1_16/v192.go rename to models/gitea_migrations/v1_16/v192.go index 31e8c36346..0e2fd522f9 100644 --- a/models/migrations/v1_16/v192.go +++ b/models/gitea_migrations/v1_16/v192.go @@ -4,7 +4,7 @@ package v1_16 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_16/v193.go b/models/gitea_migrations/v1_16/v193.go similarity index 100% rename from models/migrations/v1_16/v193.go rename to models/gitea_migrations/v1_16/v193.go diff --git a/models/migrations/v1_16/v193_test.go b/models/gitea_migrations/v1_16/v193_test.go similarity index 97% rename from models/migrations/v1_16/v193_test.go rename to models/gitea_migrations/v1_16/v193_test.go index bf8d8a7dc6..73159118ab 100644 --- a/models/migrations/v1_16/v193_test.go +++ b/models/gitea_migrations/v1_16/v193_test.go @@ -6,7 +6,7 @@ package v1_16 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_16/v194.go b/models/gitea_migrations/v1_16/v194.go similarity index 100% rename from models/migrations/v1_16/v194.go rename to models/gitea_migrations/v1_16/v194.go diff --git a/models/migrations/v1_16/v195.go b/models/gitea_migrations/v1_16/v195.go similarity index 100% rename from models/migrations/v1_16/v195.go rename to models/gitea_migrations/v1_16/v195.go diff --git a/models/migrations/v1_16/v195_test.go b/models/gitea_migrations/v1_16/v195_test.go similarity index 96% rename from models/migrations/v1_16/v195_test.go rename to models/gitea_migrations/v1_16/v195_test.go index 1fc7b51f3c..d3e4ffc56e 100644 --- a/models/migrations/v1_16/v195_test.go +++ b/models/gitea_migrations/v1_16/v195_test.go @@ -6,7 +6,7 @@ package v1_16 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_16/v196.go b/models/gitea_migrations/v1_16/v196.go similarity index 100% rename from models/migrations/v1_16/v196.go rename to models/gitea_migrations/v1_16/v196.go diff --git a/models/migrations/v1_16/v197.go b/models/gitea_migrations/v1_16/v197.go similarity index 100% rename from models/migrations/v1_16/v197.go rename to models/gitea_migrations/v1_16/v197.go diff --git a/models/migrations/v1_16/v198.go b/models/gitea_migrations/v1_16/v198.go similarity index 100% rename from models/migrations/v1_16/v198.go rename to models/gitea_migrations/v1_16/v198.go diff --git a/models/migrations/v1_16/v199.go b/models/gitea_migrations/v1_16/v199.go similarity index 100% rename from models/migrations/v1_16/v199.go rename to models/gitea_migrations/v1_16/v199.go diff --git a/models/migrations/v1_16/v200.go b/models/gitea_migrations/v1_16/v200.go similarity index 100% rename from models/migrations/v1_16/v200.go rename to models/gitea_migrations/v1_16/v200.go diff --git a/models/migrations/v1_16/v201.go b/models/gitea_migrations/v1_16/v201.go similarity index 100% rename from models/migrations/v1_16/v201.go rename to models/gitea_migrations/v1_16/v201.go diff --git a/models/migrations/v1_16/v202.go b/models/gitea_migrations/v1_16/v202.go similarity index 100% rename from models/migrations/v1_16/v202.go rename to models/gitea_migrations/v1_16/v202.go diff --git a/models/migrations/v1_16/v203.go b/models/gitea_migrations/v1_16/v203.go similarity index 100% rename from models/migrations/v1_16/v203.go rename to models/gitea_migrations/v1_16/v203.go diff --git a/models/migrations/v1_16/v204.go b/models/gitea_migrations/v1_16/v204.go similarity index 100% rename from models/migrations/v1_16/v204.go rename to models/gitea_migrations/v1_16/v204.go diff --git a/models/migrations/v1_16/v205.go b/models/gitea_migrations/v1_16/v205.go similarity index 94% rename from models/migrations/v1_16/v205.go rename to models/gitea_migrations/v1_16/v205.go index cb452dfd7f..a89edfdef4 100644 --- a/models/migrations/v1_16/v205.go +++ b/models/gitea_migrations/v1_16/v205.go @@ -4,7 +4,7 @@ package v1_16 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/migrations/v1_16/v206.go b/models/gitea_migrations/v1_16/v206.go similarity index 100% rename from models/migrations/v1_16/v206.go rename to models/gitea_migrations/v1_16/v206.go diff --git a/models/migrations/v1_16/v207.go b/models/gitea_migrations/v1_16/v207.go similarity index 100% rename from models/migrations/v1_16/v207.go rename to models/gitea_migrations/v1_16/v207.go diff --git a/models/migrations/v1_16/v208.go b/models/gitea_migrations/v1_16/v208.go similarity index 100% rename from models/migrations/v1_16/v208.go rename to models/gitea_migrations/v1_16/v208.go diff --git a/models/migrations/v1_16/v209.go b/models/gitea_migrations/v1_16/v209.go similarity index 100% rename from models/migrations/v1_16/v209.go rename to models/gitea_migrations/v1_16/v209.go diff --git a/models/migrations/v1_16/v210.go b/models/gitea_migrations/v1_16/v210.go similarity index 100% rename from models/migrations/v1_16/v210.go rename to models/gitea_migrations/v1_16/v210.go diff --git a/models/migrations/v1_16/v210_test.go b/models/gitea_migrations/v1_16/v210_test.go similarity index 98% rename from models/migrations/v1_16/v210_test.go rename to models/gitea_migrations/v1_16/v210_test.go index 8454920aa0..7972c191f0 100644 --- a/models/migrations/v1_16/v210_test.go +++ b/models/gitea_migrations/v1_16/v210_test.go @@ -7,7 +7,7 @@ import ( "encoding/hex" "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" diff --git a/models/migrations/v1_17/main_test.go b/models/gitea_migrations/v1_17/main_test.go similarity index 76% rename from models/migrations/v1_17/main_test.go rename to models/gitea_migrations/v1_17/main_test.go index 166860b3b1..e54e2a9029 100644 --- a/models/migrations/v1_17/main_test.go +++ b/models/gitea_migrations/v1_17/main_test.go @@ -6,7 +6,7 @@ package v1_17 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_17/v211.go b/models/gitea_migrations/v1_17/v211.go similarity index 100% rename from models/migrations/v1_17/v211.go rename to models/gitea_migrations/v1_17/v211.go diff --git a/models/migrations/v1_17/v212.go b/models/gitea_migrations/v1_17/v212.go similarity index 100% rename from models/migrations/v1_17/v212.go rename to models/gitea_migrations/v1_17/v212.go diff --git a/models/migrations/v1_17/v213.go b/models/gitea_migrations/v1_17/v213.go similarity index 100% rename from models/migrations/v1_17/v213.go rename to models/gitea_migrations/v1_17/v213.go diff --git a/models/migrations/v1_17/v214.go b/models/gitea_migrations/v1_17/v214.go similarity index 100% rename from models/migrations/v1_17/v214.go rename to models/gitea_migrations/v1_17/v214.go diff --git a/models/migrations/v1_17/v215.go b/models/gitea_migrations/v1_17/v215.go similarity index 100% rename from models/migrations/v1_17/v215.go rename to models/gitea_migrations/v1_17/v215.go diff --git a/models/migrations/v1_17/v216.go b/models/gitea_migrations/v1_17/v216.go similarity index 100% rename from models/migrations/v1_17/v216.go rename to models/gitea_migrations/v1_17/v216.go diff --git a/models/migrations/v1_17/v217.go b/models/gitea_migrations/v1_17/v217.go similarity index 100% rename from models/migrations/v1_17/v217.go rename to models/gitea_migrations/v1_17/v217.go diff --git a/models/migrations/v1_17/v218.go b/models/gitea_migrations/v1_17/v218.go similarity index 100% rename from models/migrations/v1_17/v218.go rename to models/gitea_migrations/v1_17/v218.go diff --git a/models/migrations/v1_17/v219.go b/models/gitea_migrations/v1_17/v219.go similarity index 100% rename from models/migrations/v1_17/v219.go rename to models/gitea_migrations/v1_17/v219.go diff --git a/models/migrations/v1_17/v220.go b/models/gitea_migrations/v1_17/v220.go similarity index 100% rename from models/migrations/v1_17/v220.go rename to models/gitea_migrations/v1_17/v220.go diff --git a/models/migrations/v1_17/v221.go b/models/gitea_migrations/v1_17/v221.go similarity index 100% rename from models/migrations/v1_17/v221.go rename to models/gitea_migrations/v1_17/v221.go diff --git a/models/migrations/v1_17/v221_test.go b/models/gitea_migrations/v1_17/v221_test.go similarity index 96% rename from models/migrations/v1_17/v221_test.go rename to models/gitea_migrations/v1_17/v221_test.go index a9c47136b2..592fd15f5e 100644 --- a/models/migrations/v1_17/v221_test.go +++ b/models/gitea_migrations/v1_17/v221_test.go @@ -7,7 +7,7 @@ import ( "encoding/base32" "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_17/v222.go b/models/gitea_migrations/v1_17/v222.go similarity index 97% rename from models/migrations/v1_17/v222.go rename to models/gitea_migrations/v1_17/v222.go index 873769881e..77095f4e7e 100644 --- a/models/migrations/v1_17/v222.go +++ b/models/gitea_migrations/v1_17/v222.go @@ -8,7 +8,7 @@ import ( "errors" "fmt" - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "forgejo.org/modules/timeutil" "xorm.io/xorm" diff --git a/models/migrations/v1_17/v223.go b/models/gitea_migrations/v1_17/v223.go similarity index 98% rename from models/migrations/v1_17/v223.go rename to models/gitea_migrations/v1_17/v223.go index 4f5d34d841..4cc91c4f46 100644 --- a/models/migrations/v1_17/v223.go +++ b/models/gitea_migrations/v1_17/v223.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "forgejo.org/modules/setting" "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_18/main_test.go b/models/gitea_migrations/v1_18/main_test.go similarity index 76% rename from models/migrations/v1_18/main_test.go rename to models/gitea_migrations/v1_18/main_test.go index 0c20934cea..73e634ca35 100644 --- a/models/migrations/v1_18/main_test.go +++ b/models/gitea_migrations/v1_18/main_test.go @@ -6,7 +6,7 @@ package v1_18 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_18/v224.go b/models/gitea_migrations/v1_18/v224.go similarity index 100% rename from models/migrations/v1_18/v224.go rename to models/gitea_migrations/v1_18/v224.go diff --git a/models/migrations/v1_18/v225.go b/models/gitea_migrations/v1_18/v225.go similarity index 100% rename from models/migrations/v1_18/v225.go rename to models/gitea_migrations/v1_18/v225.go diff --git a/models/migrations/v1_18/v226.go b/models/gitea_migrations/v1_18/v226.go similarity index 100% rename from models/migrations/v1_18/v226.go rename to models/gitea_migrations/v1_18/v226.go diff --git a/models/migrations/v1_18/v227.go b/models/gitea_migrations/v1_18/v227.go similarity index 100% rename from models/migrations/v1_18/v227.go rename to models/gitea_migrations/v1_18/v227.go diff --git a/models/migrations/v1_18/v228.go b/models/gitea_migrations/v1_18/v228.go similarity index 100% rename from models/migrations/v1_18/v228.go rename to models/gitea_migrations/v1_18/v228.go diff --git a/models/migrations/v1_18/v229.go b/models/gitea_migrations/v1_18/v229.go similarity index 100% rename from models/migrations/v1_18/v229.go rename to models/gitea_migrations/v1_18/v229.go diff --git a/models/migrations/v1_18/v229_test.go b/models/gitea_migrations/v1_18/v229_test.go similarity index 94% rename from models/migrations/v1_18/v229_test.go rename to models/gitea_migrations/v1_18/v229_test.go index 903a60c851..deea44ab86 100644 --- a/models/migrations/v1_18/v229_test.go +++ b/models/gitea_migrations/v1_18/v229_test.go @@ -6,8 +6,8 @@ package v1_18 import ( "testing" + migration_tests "forgejo.org/models/gitea_migrations/test" "forgejo.org/models/issues" - migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_18/v230.go b/models/gitea_migrations/v1_18/v230.go similarity index 100% rename from models/migrations/v1_18/v230.go rename to models/gitea_migrations/v1_18/v230.go diff --git a/models/migrations/v1_18/v230_test.go b/models/gitea_migrations/v1_18/v230_test.go similarity index 94% rename from models/migrations/v1_18/v230_test.go rename to models/gitea_migrations/v1_18/v230_test.go index da31b0dc9b..0db7025838 100644 --- a/models/migrations/v1_18/v230_test.go +++ b/models/gitea_migrations/v1_18/v230_test.go @@ -6,7 +6,7 @@ package v1_18 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_19/main_test.go b/models/gitea_migrations/v1_19/main_test.go similarity index 76% rename from models/migrations/v1_19/main_test.go rename to models/gitea_migrations/v1_19/main_test.go index 9d1c3a57ea..6bf5ec4cc9 100644 --- a/models/migrations/v1_19/main_test.go +++ b/models/gitea_migrations/v1_19/main_test.go @@ -6,7 +6,7 @@ package v1_19 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_19/v231.go b/models/gitea_migrations/v1_19/v231.go similarity index 100% rename from models/migrations/v1_19/v231.go rename to models/gitea_migrations/v1_19/v231.go diff --git a/models/migrations/v1_19/v232.go b/models/gitea_migrations/v1_19/v232.go similarity index 100% rename from models/migrations/v1_19/v232.go rename to models/gitea_migrations/v1_19/v232.go diff --git a/models/migrations/v1_19/v233.go b/models/gitea_migrations/v1_19/v233.go similarity index 100% rename from models/migrations/v1_19/v233.go rename to models/gitea_migrations/v1_19/v233.go diff --git a/models/migrations/v1_19/v233_test.go b/models/gitea_migrations/v1_19/v233_test.go similarity index 97% rename from models/migrations/v1_19/v233_test.go rename to models/gitea_migrations/v1_19/v233_test.go index 3d5eac9887..72770d9544 100644 --- a/models/migrations/v1_19/v233_test.go +++ b/models/gitea_migrations/v1_19/v233_test.go @@ -6,7 +6,7 @@ package v1_19 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "forgejo.org/modules/json" "forgejo.org/modules/secret" "forgejo.org/modules/setting" diff --git a/models/migrations/v1_19/v234.go b/models/gitea_migrations/v1_19/v234.go similarity index 100% rename from models/migrations/v1_19/v234.go rename to models/gitea_migrations/v1_19/v234.go diff --git a/models/migrations/v1_19/v235.go b/models/gitea_migrations/v1_19/v235.go similarity index 100% rename from models/migrations/v1_19/v235.go rename to models/gitea_migrations/v1_19/v235.go diff --git a/models/migrations/v1_19/v236.go b/models/gitea_migrations/v1_19/v236.go similarity index 100% rename from models/migrations/v1_19/v236.go rename to models/gitea_migrations/v1_19/v236.go diff --git a/models/migrations/v1_19/v237.go b/models/gitea_migrations/v1_19/v237.go similarity index 100% rename from models/migrations/v1_19/v237.go rename to models/gitea_migrations/v1_19/v237.go diff --git a/models/migrations/v1_19/v238.go b/models/gitea_migrations/v1_19/v238.go similarity index 100% rename from models/migrations/v1_19/v238.go rename to models/gitea_migrations/v1_19/v238.go diff --git a/models/migrations/v1_19/v239.go b/models/gitea_migrations/v1_19/v239.go similarity index 100% rename from models/migrations/v1_19/v239.go rename to models/gitea_migrations/v1_19/v239.go diff --git a/models/migrations/v1_19/v240.go b/models/gitea_migrations/v1_19/v240.go similarity index 100% rename from models/migrations/v1_19/v240.go rename to models/gitea_migrations/v1_19/v240.go diff --git a/models/migrations/v1_19/v241.go b/models/gitea_migrations/v1_19/v241.go similarity index 100% rename from models/migrations/v1_19/v241.go rename to models/gitea_migrations/v1_19/v241.go diff --git a/models/migrations/v1_19/v242.go b/models/gitea_migrations/v1_19/v242.go similarity index 100% rename from models/migrations/v1_19/v242.go rename to models/gitea_migrations/v1_19/v242.go diff --git a/models/migrations/v1_19/v243.go b/models/gitea_migrations/v1_19/v243.go similarity index 100% rename from models/migrations/v1_19/v243.go rename to models/gitea_migrations/v1_19/v243.go diff --git a/models/migrations/v1_20/main_test.go b/models/gitea_migrations/v1_20/main_test.go similarity index 76% rename from models/migrations/v1_20/main_test.go rename to models/gitea_migrations/v1_20/main_test.go index ee5eec5ef6..dd71e73804 100644 --- a/models/migrations/v1_20/main_test.go +++ b/models/gitea_migrations/v1_20/main_test.go @@ -6,7 +6,7 @@ package v1_20 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_20/v244.go b/models/gitea_migrations/v1_20/v244.go similarity index 100% rename from models/migrations/v1_20/v244.go rename to models/gitea_migrations/v1_20/v244.go diff --git a/models/migrations/v1_20/v245.go b/models/gitea_migrations/v1_20/v245.go similarity index 97% rename from models/migrations/v1_20/v245.go rename to models/gitea_migrations/v1_20/v245.go index 5e034568c4..730af95ad0 100644 --- a/models/migrations/v1_20/v245.go +++ b/models/gitea_migrations/v1_20/v245.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "forgejo.org/modules/setting" "xorm.io/xorm" diff --git a/models/migrations/v1_20/v246.go b/models/gitea_migrations/v1_20/v246.go similarity index 100% rename from models/migrations/v1_20/v246.go rename to models/gitea_migrations/v1_20/v246.go diff --git a/models/migrations/v1_20/v247.go b/models/gitea_migrations/v1_20/v247.go similarity index 100% rename from models/migrations/v1_20/v247.go rename to models/gitea_migrations/v1_20/v247.go diff --git a/models/migrations/v1_20/v248.go b/models/gitea_migrations/v1_20/v248.go similarity index 100% rename from models/migrations/v1_20/v248.go rename to models/gitea_migrations/v1_20/v248.go diff --git a/models/migrations/v1_20/v249.go b/models/gitea_migrations/v1_20/v249.go similarity index 100% rename from models/migrations/v1_20/v249.go rename to models/gitea_migrations/v1_20/v249.go diff --git a/models/migrations/v1_20/v250.go b/models/gitea_migrations/v1_20/v250.go similarity index 100% rename from models/migrations/v1_20/v250.go rename to models/gitea_migrations/v1_20/v250.go diff --git a/models/migrations/v1_20/v251.go b/models/gitea_migrations/v1_20/v251.go similarity index 100% rename from models/migrations/v1_20/v251.go rename to models/gitea_migrations/v1_20/v251.go diff --git a/models/migrations/v1_20/v252.go b/models/gitea_migrations/v1_20/v252.go similarity index 100% rename from models/migrations/v1_20/v252.go rename to models/gitea_migrations/v1_20/v252.go diff --git a/models/migrations/v1_20/v253.go b/models/gitea_migrations/v1_20/v253.go similarity index 100% rename from models/migrations/v1_20/v253.go rename to models/gitea_migrations/v1_20/v253.go diff --git a/models/migrations/v1_20/v254.go b/models/gitea_migrations/v1_20/v254.go similarity index 100% rename from models/migrations/v1_20/v254.go rename to models/gitea_migrations/v1_20/v254.go diff --git a/models/migrations/v1_20/v255.go b/models/gitea_migrations/v1_20/v255.go similarity index 100% rename from models/migrations/v1_20/v255.go rename to models/gitea_migrations/v1_20/v255.go diff --git a/models/migrations/v1_20/v256.go b/models/gitea_migrations/v1_20/v256.go similarity index 100% rename from models/migrations/v1_20/v256.go rename to models/gitea_migrations/v1_20/v256.go diff --git a/models/migrations/v1_20/v257.go b/models/gitea_migrations/v1_20/v257.go similarity index 100% rename from models/migrations/v1_20/v257.go rename to models/gitea_migrations/v1_20/v257.go diff --git a/models/migrations/v1_20/v258.go b/models/gitea_migrations/v1_20/v258.go similarity index 100% rename from models/migrations/v1_20/v258.go rename to models/gitea_migrations/v1_20/v258.go diff --git a/models/migrations/v1_20/v259.go b/models/gitea_migrations/v1_20/v259.go similarity index 100% rename from models/migrations/v1_20/v259.go rename to models/gitea_migrations/v1_20/v259.go diff --git a/models/migrations/v1_20/v259_test.go b/models/gitea_migrations/v1_20/v259_test.go similarity index 97% rename from models/migrations/v1_20/v259_test.go rename to models/gitea_migrations/v1_20/v259_test.go index b41b6c7995..6805eb31ce 100644 --- a/models/migrations/v1_20/v259_test.go +++ b/models/gitea_migrations/v1_20/v259_test.go @@ -8,7 +8,7 @@ import ( "strings" "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_21/main_test.go b/models/gitea_migrations/v1_21/main_test.go similarity index 76% rename from models/migrations/v1_21/main_test.go rename to models/gitea_migrations/v1_21/main_test.go index 3f10a39a94..e467c66a91 100644 --- a/models/migrations/v1_21/main_test.go +++ b/models/gitea_migrations/v1_21/main_test.go @@ -6,7 +6,7 @@ package v1_21 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_21/v260.go b/models/gitea_migrations/v1_21/v260.go similarity index 91% rename from models/migrations/v1_21/v260.go rename to models/gitea_migrations/v1_21/v260.go index b73b53bd61..31f9c5b161 100644 --- a/models/migrations/v1_21/v260.go +++ b/models/gitea_migrations/v1_21/v260.go @@ -4,7 +4,7 @@ package v1_21 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v261.go b/models/gitea_migrations/v1_21/v261.go similarity index 100% rename from models/migrations/v1_21/v261.go rename to models/gitea_migrations/v1_21/v261.go diff --git a/models/migrations/v1_21/v262.go b/models/gitea_migrations/v1_21/v262.go similarity index 100% rename from models/migrations/v1_21/v262.go rename to models/gitea_migrations/v1_21/v262.go diff --git a/models/migrations/v1_21/v263.go b/models/gitea_migrations/v1_21/v263.go similarity index 100% rename from models/migrations/v1_21/v263.go rename to models/gitea_migrations/v1_21/v263.go diff --git a/models/migrations/v1_21/v264.go b/models/gitea_migrations/v1_21/v264.go similarity index 100% rename from models/migrations/v1_21/v264.go rename to models/gitea_migrations/v1_21/v264.go diff --git a/models/migrations/v1_21/v265.go b/models/gitea_migrations/v1_21/v265.go similarity index 100% rename from models/migrations/v1_21/v265.go rename to models/gitea_migrations/v1_21/v265.go diff --git a/models/migrations/v1_21/v266.go b/models/gitea_migrations/v1_21/v266.go similarity index 100% rename from models/migrations/v1_21/v266.go rename to models/gitea_migrations/v1_21/v266.go diff --git a/models/migrations/v1_21/v267.go b/models/gitea_migrations/v1_21/v267.go similarity index 100% rename from models/migrations/v1_21/v267.go rename to models/gitea_migrations/v1_21/v267.go diff --git a/models/migrations/v1_21/v268.go b/models/gitea_migrations/v1_21/v268.go similarity index 100% rename from models/migrations/v1_21/v268.go rename to models/gitea_migrations/v1_21/v268.go diff --git a/models/migrations/v1_21/v269.go b/models/gitea_migrations/v1_21/v269.go similarity index 100% rename from models/migrations/v1_21/v269.go rename to models/gitea_migrations/v1_21/v269.go diff --git a/models/migrations/v1_21/v270.go b/models/gitea_migrations/v1_21/v270.go similarity index 100% rename from models/migrations/v1_21/v270.go rename to models/gitea_migrations/v1_21/v270.go diff --git a/models/migrations/v1_21/v271.go b/models/gitea_migrations/v1_21/v271.go similarity index 100% rename from models/migrations/v1_21/v271.go rename to models/gitea_migrations/v1_21/v271.go diff --git a/models/migrations/v1_21/v272.go b/models/gitea_migrations/v1_21/v272.go similarity index 100% rename from models/migrations/v1_21/v272.go rename to models/gitea_migrations/v1_21/v272.go diff --git a/models/migrations/v1_21/v273.go b/models/gitea_migrations/v1_21/v273.go similarity index 100% rename from models/migrations/v1_21/v273.go rename to models/gitea_migrations/v1_21/v273.go diff --git a/models/migrations/v1_21/v274.go b/models/gitea_migrations/v1_21/v274.go similarity index 100% rename from models/migrations/v1_21/v274.go rename to models/gitea_migrations/v1_21/v274.go diff --git a/models/migrations/v1_21/v275.go b/models/gitea_migrations/v1_21/v275.go similarity index 100% rename from models/migrations/v1_21/v275.go rename to models/gitea_migrations/v1_21/v275.go diff --git a/models/migrations/v1_21/v276.go b/models/gitea_migrations/v1_21/v276.go similarity index 100% rename from models/migrations/v1_21/v276.go rename to models/gitea_migrations/v1_21/v276.go diff --git a/models/migrations/v1_21/v277.go b/models/gitea_migrations/v1_21/v277.go similarity index 100% rename from models/migrations/v1_21/v277.go rename to models/gitea_migrations/v1_21/v277.go diff --git a/models/migrations/v1_21/v278.go b/models/gitea_migrations/v1_21/v278.go similarity index 100% rename from models/migrations/v1_21/v278.go rename to models/gitea_migrations/v1_21/v278.go diff --git a/models/migrations/v1_21/v279.go b/models/gitea_migrations/v1_21/v279.go similarity index 100% rename from models/migrations/v1_21/v279.go rename to models/gitea_migrations/v1_21/v279.go diff --git a/models/migrations/v1_22/main_test.go b/models/gitea_migrations/v1_22/main_test.go similarity index 76% rename from models/migrations/v1_22/main_test.go rename to models/gitea_migrations/v1_22/main_test.go index 7b05993e09..81e4664b90 100644 --- a/models/migrations/v1_22/main_test.go +++ b/models/gitea_migrations/v1_22/main_test.go @@ -6,7 +6,7 @@ package v1_22 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_22/v280.go b/models/gitea_migrations/v1_22/v280.go similarity index 100% rename from models/migrations/v1_22/v280.go rename to models/gitea_migrations/v1_22/v280.go diff --git a/models/migrations/v1_22/v281.go b/models/gitea_migrations/v1_22/v281.go similarity index 100% rename from models/migrations/v1_22/v281.go rename to models/gitea_migrations/v1_22/v281.go diff --git a/models/migrations/v1_22/v282.go b/models/gitea_migrations/v1_22/v282.go similarity index 100% rename from models/migrations/v1_22/v282.go rename to models/gitea_migrations/v1_22/v282.go diff --git a/models/migrations/v1_22/v283.go b/models/gitea_migrations/v1_22/v283.go similarity index 100% rename from models/migrations/v1_22/v283.go rename to models/gitea_migrations/v1_22/v283.go diff --git a/models/migrations/v1_22/v283_test.go b/models/gitea_migrations/v1_22/v283_test.go similarity index 91% rename from models/migrations/v1_22/v283_test.go rename to models/gitea_migrations/v1_22/v283_test.go index 652d96ac16..647555ca9e 100644 --- a/models/migrations/v1_22/v283_test.go +++ b/models/gitea_migrations/v1_22/v283_test.go @@ -6,7 +6,7 @@ package v1_22 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/require" ) diff --git a/models/migrations/v1_22/v284.go b/models/gitea_migrations/v1_22/v284.go similarity index 100% rename from models/migrations/v1_22/v284.go rename to models/gitea_migrations/v1_22/v284.go diff --git a/models/migrations/v1_22/v285.go b/models/gitea_migrations/v1_22/v285.go similarity index 100% rename from models/migrations/v1_22/v285.go rename to models/gitea_migrations/v1_22/v285.go diff --git a/models/migrations/v1_22/v286.go b/models/gitea_migrations/v1_22/v286.go similarity index 100% rename from models/migrations/v1_22/v286.go rename to models/gitea_migrations/v1_22/v286.go diff --git a/models/migrations/v1_22/v286_test.go b/models/gitea_migrations/v1_22/v286_test.go similarity index 97% rename from models/migrations/v1_22/v286_test.go rename to models/gitea_migrations/v1_22/v286_test.go index 5bb3334df2..fd630508ec 100644 --- a/models/migrations/v1_22/v286_test.go +++ b/models/gitea_migrations/v1_22/v286_test.go @@ -6,7 +6,7 @@ package v1_22 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_22/v287.go b/models/gitea_migrations/v1_22/v287.go similarity index 100% rename from models/migrations/v1_22/v287.go rename to models/gitea_migrations/v1_22/v287.go diff --git a/models/migrations/v1_22/v288.go b/models/gitea_migrations/v1_22/v288.go similarity index 100% rename from models/migrations/v1_22/v288.go rename to models/gitea_migrations/v1_22/v288.go diff --git a/models/migrations/v1_22/v289.go b/models/gitea_migrations/v1_22/v289.go similarity index 100% rename from models/migrations/v1_22/v289.go rename to models/gitea_migrations/v1_22/v289.go diff --git a/models/migrations/v1_22/v290.go b/models/gitea_migrations/v1_22/v290.go similarity index 100% rename from models/migrations/v1_22/v290.go rename to models/gitea_migrations/v1_22/v290.go diff --git a/models/migrations/v1_22/v290_test.go b/models/gitea_migrations/v1_22/v290_test.go similarity index 96% rename from models/migrations/v1_22/v290_test.go rename to models/gitea_migrations/v1_22/v290_test.go index a1907cf4d6..a1c303cd28 100644 --- a/models/migrations/v1_22/v290_test.go +++ b/models/gitea_migrations/v1_22/v290_test.go @@ -7,7 +7,7 @@ import ( "strconv" "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "forgejo.org/modules/timeutil" webhook_module "forgejo.org/modules/webhook" diff --git a/models/migrations/v1_22/v291.go b/models/gitea_migrations/v1_22/v291.go similarity index 100% rename from models/migrations/v1_22/v291.go rename to models/gitea_migrations/v1_22/v291.go diff --git a/models/migrations/v1_22/v292.go b/models/gitea_migrations/v1_22/v292.go similarity index 100% rename from models/migrations/v1_22/v292.go rename to models/gitea_migrations/v1_22/v292.go diff --git a/models/migrations/v1_22/v293.go b/models/gitea_migrations/v1_22/v293.go similarity index 100% rename from models/migrations/v1_22/v293.go rename to models/gitea_migrations/v1_22/v293.go diff --git a/models/migrations/v1_22/v293_test.go b/models/gitea_migrations/v1_22/v293_test.go similarity index 95% rename from models/migrations/v1_22/v293_test.go rename to models/gitea_migrations/v1_22/v293_test.go index 6b1931b761..902e20fbc2 100644 --- a/models/migrations/v1_22/v293_test.go +++ b/models/gitea_migrations/v1_22/v293_test.go @@ -7,7 +7,7 @@ import ( "testing" "forgejo.org/models/db" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "forgejo.org/models/project" "github.com/stretchr/testify/assert" diff --git a/models/migrations/v1_22/v294.go b/models/gitea_migrations/v1_22/v294.go similarity index 100% rename from models/migrations/v1_22/v294.go rename to models/gitea_migrations/v1_22/v294.go diff --git a/models/migrations/v1_22/v294_test.go b/models/gitea_migrations/v1_22/v294_test.go similarity index 95% rename from models/migrations/v1_22/v294_test.go rename to models/gitea_migrations/v1_22/v294_test.go index e87a4bc85f..197fada2a0 100644 --- a/models/migrations/v1_22/v294_test.go +++ b/models/gitea_migrations/v1_22/v294_test.go @@ -7,7 +7,7 @@ import ( "slices" "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_22/v295.go b/models/gitea_migrations/v1_22/v295.go similarity index 100% rename from models/migrations/v1_22/v295.go rename to models/gitea_migrations/v1_22/v295.go diff --git a/models/migrations/v1_22/v296.go b/models/gitea_migrations/v1_22/v296.go similarity index 100% rename from models/migrations/v1_22/v296.go rename to models/gitea_migrations/v1_22/v296.go diff --git a/models/migrations/v1_22/v298.go b/models/gitea_migrations/v1_22/v298.go similarity index 100% rename from models/migrations/v1_22/v298.go rename to models/gitea_migrations/v1_22/v298.go diff --git a/models/migrations/v1_23/main_test.go b/models/gitea_migrations/v1_23/main_test.go similarity index 76% rename from models/migrations/v1_23/main_test.go rename to models/gitea_migrations/v1_23/main_test.go index 5fb4fec999..f8337ab2ee 100644 --- a/models/migrations/v1_23/main_test.go +++ b/models/gitea_migrations/v1_23/main_test.go @@ -6,7 +6,7 @@ package v1_23 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_23/v299.go b/models/gitea_migrations/v1_23/v299.go similarity index 100% rename from models/migrations/v1_23/v299.go rename to models/gitea_migrations/v1_23/v299.go diff --git a/models/migrations/v1_23/v300.go b/models/gitea_migrations/v1_23/v300.go similarity index 100% rename from models/migrations/v1_23/v300.go rename to models/gitea_migrations/v1_23/v300.go diff --git a/models/migrations/v1_23/v301.go b/models/gitea_migrations/v1_23/v301.go similarity index 100% rename from models/migrations/v1_23/v301.go rename to models/gitea_migrations/v1_23/v301.go diff --git a/models/migrations/v1_23/v302.go b/models/gitea_migrations/v1_23/v302.go similarity index 100% rename from models/migrations/v1_23/v302.go rename to models/gitea_migrations/v1_23/v302.go diff --git a/models/migrations/v1_23/v303.go b/models/gitea_migrations/v1_23/v303.go similarity index 96% rename from models/migrations/v1_23/v303.go rename to models/gitea_migrations/v1_23/v303.go index 03197d2857..f6cbf7d859 100644 --- a/models/migrations/v1_23/v303.go +++ b/models/gitea_migrations/v1_23/v303.go @@ -4,7 +4,7 @@ package v1_23 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/migrations/v1_23/v303_test.go b/models/gitea_migrations/v1_23/v303_test.go similarity index 93% rename from models/migrations/v1_23/v303_test.go rename to models/gitea_migrations/v1_23/v303_test.go index f2c764bae3..5eee15c47a 100644 --- a/models/migrations/v1_23/v303_test.go +++ b/models/gitea_migrations/v1_23/v303_test.go @@ -6,7 +6,7 @@ package v1_23 import ( "testing" - migration_tests "forgejo.org/models/migrations/test" + migration_tests "forgejo.org/models/gitea_migrations/test" "github.com/stretchr/testify/require" "xorm.io/xorm/schemas" diff --git a/models/migrations/v1_6/v70.go b/models/gitea_migrations/v1_6/v70.go similarity index 100% rename from models/migrations/v1_6/v70.go rename to models/gitea_migrations/v1_6/v70.go diff --git a/models/migrations/v1_6/v71.go b/models/gitea_migrations/v1_6/v71.go similarity index 97% rename from models/migrations/v1_6/v71.go rename to models/gitea_migrations/v1_6/v71.go index 42fe8cd1ba..c9e96980d3 100644 --- a/models/migrations/v1_6/v71.go +++ b/models/gitea_migrations/v1_6/v71.go @@ -6,7 +6,7 @@ package v1_6 import ( "fmt" - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "forgejo.org/modules/timeutil" "forgejo.org/modules/util" diff --git a/models/migrations/v1_6/v72.go b/models/gitea_migrations/v1_6/v72.go similarity index 100% rename from models/migrations/v1_6/v72.go rename to models/gitea_migrations/v1_6/v72.go diff --git a/models/migrations/v1_7/v73.go b/models/gitea_migrations/v1_7/v73.go similarity index 100% rename from models/migrations/v1_7/v73.go rename to models/gitea_migrations/v1_7/v73.go diff --git a/models/migrations/v1_7/v74.go b/models/gitea_migrations/v1_7/v74.go similarity index 100% rename from models/migrations/v1_7/v74.go rename to models/gitea_migrations/v1_7/v74.go diff --git a/models/migrations/v1_7/v75.go b/models/gitea_migrations/v1_7/v75.go similarity index 100% rename from models/migrations/v1_7/v75.go rename to models/gitea_migrations/v1_7/v75.go diff --git a/models/migrations/v1_8/v76.go b/models/gitea_migrations/v1_8/v76.go similarity index 100% rename from models/migrations/v1_8/v76.go rename to models/gitea_migrations/v1_8/v76.go diff --git a/models/migrations/v1_8/v77.go b/models/gitea_migrations/v1_8/v77.go similarity index 100% rename from models/migrations/v1_8/v77.go rename to models/gitea_migrations/v1_8/v77.go diff --git a/models/migrations/v1_8/v78.go b/models/gitea_migrations/v1_8/v78.go similarity index 94% rename from models/migrations/v1_8/v78.go rename to models/gitea_migrations/v1_8/v78.go index 840fc20d96..829435ead6 100644 --- a/models/migrations/v1_8/v78.go +++ b/models/gitea_migrations/v1_8/v78.go @@ -4,7 +4,7 @@ package v1_8 import ( - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_8/v79.go b/models/gitea_migrations/v1_8/v79.go similarity index 100% rename from models/migrations/v1_8/v79.go rename to models/gitea_migrations/v1_8/v79.go diff --git a/models/migrations/v1_8/v80.go b/models/gitea_migrations/v1_8/v80.go similarity index 100% rename from models/migrations/v1_8/v80.go rename to models/gitea_migrations/v1_8/v80.go diff --git a/models/migrations/v1_8/v81.go b/models/gitea_migrations/v1_8/v81.go similarity index 100% rename from models/migrations/v1_8/v81.go rename to models/gitea_migrations/v1_8/v81.go diff --git a/models/migrations/v1_9/v82.go b/models/gitea_migrations/v1_9/v82.go similarity index 100% rename from models/migrations/v1_9/v82.go rename to models/gitea_migrations/v1_9/v82.go diff --git a/models/migrations/v1_9/v83.go b/models/gitea_migrations/v1_9/v83.go similarity index 100% rename from models/migrations/v1_9/v83.go rename to models/gitea_migrations/v1_9/v83.go diff --git a/models/migrations/v1_9/v84.go b/models/gitea_migrations/v1_9/v84.go similarity index 100% rename from models/migrations/v1_9/v84.go rename to models/gitea_migrations/v1_9/v84.go diff --git a/models/migrations/v1_9/v85.go b/models/gitea_migrations/v1_9/v85.go similarity index 98% rename from models/migrations/v1_9/v85.go rename to models/gitea_migrations/v1_9/v85.go index 9d5adc82dd..c54a006f4c 100644 --- a/models/migrations/v1_9/v85.go +++ b/models/gitea_migrations/v1_9/v85.go @@ -6,7 +6,7 @@ package v1_9 import ( "fmt" - "forgejo.org/models/migrations/base" + "forgejo.org/models/gitea_migrations/base" "forgejo.org/modules/log" "forgejo.org/modules/timeutil" "forgejo.org/modules/util" diff --git a/models/migrations/v1_9/v86.go b/models/gitea_migrations/v1_9/v86.go similarity index 100% rename from models/migrations/v1_9/v86.go rename to models/gitea_migrations/v1_9/v86.go diff --git a/models/migrations/v1_9/v87.go b/models/gitea_migrations/v1_9/v87.go similarity index 100% rename from models/migrations/v1_9/v87.go rename to models/gitea_migrations/v1_9/v87.go diff --git a/models/issues/issue.go b/models/issues/issue.go index 14848e4c98..b1966ea50f 100644 --- a/models/issues/issue.go +++ b/models/issues/issue.go @@ -116,7 +116,7 @@ type Issue struct { DeadlineUnix timeutil.TimeStamp `xorm:"INDEX"` - Created timeutil.TimeStampNano + Created timeutil.TimeStampNano // more precise Created, but may not be populated for older issues CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` diff --git a/models/perm/access/access.go b/models/perm/access/access.go index 87ee600a15..54526d0f5c 100644 --- a/models/perm/access/access.go +++ b/models/perm/access/access.go @@ -22,8 +22,8 @@ import ( // repository, the members of the owners team are in this table. type Access struct { ID int64 `xorm:"pk autoincr"` - UserID int64 `xorm:"UNIQUE(s)"` - RepoID int64 `xorm:"UNIQUE(s)"` + UserID int64 `xorm:"UNIQUE(s) REFERENCES(user, id)"` + RepoID int64 `xorm:"UNIQUE(s) REFERENCES(repository, id)"` Mode perm.AccessMode } diff --git a/modules/avatar/avatar.go b/modules/avatar/avatar.go index 33af60a3b8..5ab872f953 100644 --- a/modules/avatar/avatar.go +++ b/modules/avatar/avatar.go @@ -10,6 +10,7 @@ import ( "image" "image/color" "image/png" + "io" _ "image/gif" // for processing gif images _ "image/jpeg" // for processing jpeg images @@ -17,6 +18,7 @@ import ( "forgejo.org/modules/avatar/identicon" "forgejo.org/modules/setting" + exif_terminator "code.superseriousbusiness.org/exif-terminator" "golang.org/x/image/draw" _ "golang.org/x/image/webp" // for processing webp images @@ -66,15 +68,29 @@ func processAvatarImage(data []byte, maxOriginSize int64) ([]byte, error) { return nil, fmt.Errorf("image height is too large: %d > %d", imgCfg.Height, setting.Avatar.MaxHeight) } + var cleanedBytes []byte + if imgType != "gif" { // "gif" is the only imgType supported above, but not supported by exif_terminator + cleanedData, err := exif_terminator.Terminate(bytes.NewReader(data), imgType) + if err != nil { + return nil, fmt.Errorf("error cleaning exif data: %w", err) + } + cleanedBytes, err = io.ReadAll(cleanedData) + if err != nil { + return nil, fmt.Errorf("error reading cleaned data: %w", err) + } + } else { // gif + cleanedBytes = data + } + // If the origin is small enough, just use it, then APNG could be supported, // otherwise, if the image is processed later, APNG loses animation. // And one more thing, webp is not fully supported, for animated webp, image.DecodeConfig works but Decode fails. // So for animated webp, if the uploaded file is smaller than maxOriginSize, it will be used, if it's larger, there will be an error. if len(data) < int(maxOriginSize) { - return data, nil + return cleanedBytes, nil } - img, _, err := image.Decode(bytes.NewReader(data)) + img, _, err := image.Decode(bytes.NewReader(cleanedBytes)) if err != nil { return nil, fmt.Errorf("image.Decode: %w", err) } @@ -94,7 +110,7 @@ func processAvatarImage(data []byte, maxOriginSize int64) ([]byte, error) { // usually the png compression is not good enough, use the original image (no cropping/resizing) if the origin is smaller if len(data) <= len(resized) { - return data, nil + return cleanedBytes, nil } return resized, nil diff --git a/modules/avatar/avatar_test.go b/modules/avatar/avatar_test.go index 5c21ad5824..7a395c49cc 100644 --- a/modules/avatar/avatar_test.go +++ b/modules/avatar/avatar_test.go @@ -11,7 +11,10 @@ import ( "testing" "forgejo.org/modules/setting" + "forgejo.org/modules/test" + jpegstructure "code.superseriousbusiness.org/go-jpeg-image-structure/v2" + "github.com/dsoprea/go-exif/v3" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -30,8 +33,8 @@ func Test_RandomImage(t *testing.T) { } func Test_ProcessAvatarPNG(t *testing.T) { - setting.Avatar.MaxWidth = 4096 - setting.Avatar.MaxHeight = 4096 + defer test.MockVariableValue(&setting.Avatar.MaxWidth, 4096)() + defer test.MockVariableValue(&setting.Avatar.MaxHeight, 4096)() data, err := os.ReadFile("testdata/avatar.png") require.NoError(t, err) @@ -41,8 +44,8 @@ func Test_ProcessAvatarPNG(t *testing.T) { } func Test_ProcessAvatarJPEG(t *testing.T) { - setting.Avatar.MaxWidth = 4096 - setting.Avatar.MaxHeight = 4096 + defer test.MockVariableValue(&setting.Avatar.MaxWidth, 4096)() + defer test.MockVariableValue(&setting.Avatar.MaxHeight, 4096)() data, err := os.ReadFile("testdata/avatar.jpeg") require.NoError(t, err) @@ -51,17 +54,28 @@ func Test_ProcessAvatarJPEG(t *testing.T) { require.NoError(t, err) } +func Test_ProcessAvatarGIF(t *testing.T) { + defer test.MockVariableValue(&setting.Avatar.MaxWidth, 4096)() + defer test.MockVariableValue(&setting.Avatar.MaxHeight, 4096)() + + data, err := os.ReadFile("testdata/avatar.gif") + require.NoError(t, err) + + _, err = processAvatarImage(data, 262144) + require.NoError(t, err) +} + func Test_ProcessAvatarInvalidData(t *testing.T) { - setting.Avatar.MaxWidth = 5 - setting.Avatar.MaxHeight = 5 + defer test.MockVariableValue(&setting.Avatar.MaxWidth, 5)() + defer test.MockVariableValue(&setting.Avatar.MaxHeight, 5)() _, err := processAvatarImage([]byte{}, 12800) assert.EqualError(t, err, "image.DecodeConfig: image: unknown format") } func Test_ProcessAvatarInvalidImageSize(t *testing.T) { - setting.Avatar.MaxWidth = 5 - setting.Avatar.MaxHeight = 5 + defer test.MockVariableValue(&setting.Avatar.MaxWidth, 5)() + defer test.MockVariableValue(&setting.Avatar.MaxHeight, 5)() data, err := os.ReadFile("testdata/avatar.png") require.NoError(t, err) @@ -71,8 +85,8 @@ func Test_ProcessAvatarInvalidImageSize(t *testing.T) { } func Test_ProcessAvatarImage(t *testing.T) { - setting.Avatar.MaxWidth = 4096 - setting.Avatar.MaxHeight = 4096 + defer test.MockVariableValue(&setting.Avatar.MaxWidth, 4096)() + defer test.MockVariableValue(&setting.Avatar.MaxHeight, 4096)() scaledSize := DefaultAvatarSize * setting.Avatar.RenderedSizeFactor newImgData := func(size int, optHeight ...int) []byte { @@ -135,3 +149,40 @@ func Test_ProcessAvatarImage(t *testing.T) { _, err = processAvatarImage(origin, 262144) require.ErrorContains(t, err, "image width is too large: 10 > 5") } + +func safeExifJpeg(t *testing.T, jpeg []byte) { + t.Helper() + + parser := jpegstructure.NewJpegMediaParser() + mediaContext, err := parser.ParseBytes(jpeg) + require.NoError(t, err) + + sl := mediaContext.(*jpegstructure.SegmentList) + + rootIfd, _, err := sl.Exif() + require.NoError(t, err) + err = rootIfd.EnumerateTagsRecursively(func(ifd *exif.Ifd, ite *exif.IfdTagEntry) error { + assert.Equal(t, "Orientation", ite.TagName(), "only Orientation EXIF tag expected") + return nil + }) + require.NoError(t, err) +} + +func Test_ProcessAvatarExif(t *testing.T) { + t.Run("greater than max origin size", func(t *testing.T) { + data, err := os.ReadFile("testdata/exif.jpg") + require.NoError(t, err) + + processedData, err := processAvatarImage(data, 12800) + require.NoError(t, err) + safeExifJpeg(t, processedData) + }) + t.Run("smaller than max origin size", func(t *testing.T) { + data, err := os.ReadFile("testdata/exif.jpg") + require.NoError(t, err) + + processedData, err := processAvatarImage(data, 128000) + require.NoError(t, err) + safeExifJpeg(t, processedData) + }) +} diff --git a/modules/avatar/testdata/avatar.gif b/modules/avatar/testdata/avatar.gif new file mode 100644 index 0000000000..a70fbacd25 Binary files /dev/null and b/modules/avatar/testdata/avatar.gif differ diff --git a/modules/avatar/testdata/exif.jpg b/modules/avatar/testdata/exif.jpg new file mode 100644 index 0000000000..7e71d9b8f4 Binary files /dev/null and b/modules/avatar/testdata/exif.jpg differ diff --git a/modules/container/set.go b/modules/container/set.go index d3719dc552..6535d1e4bd 100644 --- a/modules/container/set.go +++ b/modules/container/set.go @@ -79,3 +79,22 @@ func (s Set[T]) Seq() iter.Seq[T] { func (s Set[T]) Clone() Set[T] { return maps.Clone(s) } + +// Computes the elements that are in this set, that aren't in the other set. +func (s Set[T]) Difference(other Set[T]) Set[T] { + result := make(Set[T]) + for key := range s { + if !other.Contains(key) { + result.Add(key) + } + } + return result +} + +func (s Set[T]) Slice() []T { + retval := make([]T, 0, len(s)) + for key := range s { + retval = append(retval, key) + } + return retval +} diff --git a/modules/git/commit_reader.go b/modules/git/commit_reader.go index ec8989f5a7..37b0c8c606 100644 --- a/modules/git/commit_reader.go +++ b/modules/git/commit_reader.go @@ -24,6 +24,7 @@ func CommitFromReader(gitRepo *Repository, objectID ObjectID, reader io.Reader) payloadSB := new(strings.Builder) signatureSB := new(strings.Builder) messageSB := new(strings.Builder) + firstLine := true message := false pgpsig := false @@ -83,21 +84,25 @@ readLoop: commit.Committer = &Signature{} commit.Committer.Decode(data) _, _ = 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. _, _ = signatureSB.Write(data) _ = signatureSB.WriteByte('\n') pgpsig = true + default: + // If the first line is not any of the known headers, then it is probably the prefix added when git cat-file is called with --batch, and that is not part of the payload + if !firstLine { + // Every subsequent header field is added to the payload + _, _ = payloadSB.Write(line) + } } } else { _, _ = messageSB.Write(line) _, _ = payloadSB.Write(line) } + + firstLine = false } commit.CommitMessage = messageSB.String() commit.Signature = &ObjectSignature{ diff --git a/modules/git/commit_test.go b/modules/git/commit_test.go index ee57a735e6..cd6b17d0d7 100644 --- a/modules/git/commit_test.go +++ b/modules/git/commit_test.go @@ -239,6 +239,77 @@ January where the year starts on a Monday :)`, commitFromReader.Signature.Payloa assert.Equal(t, "Nicole Patricia Mazzuca ", commitFromReader.Author.String()) } +func TestGitbutlerCustomHeaderFields(t *testing.T) { + // example from: https://github.com/go-gitea/gitea/issues/34529#issuecomment-2908481092 + commitString := `tree a29321bf9e3ec433ed9e47b1cbbac6906c71fc60 +parent c0d83043ade7fa3ca10659608799477e9daa670b +author Sebastian Thiel 1747920681 +0200 +committer Sebastian Thiel 1748010747 +0200 +gitbutler-headers-version 2 +gitbutler-change-id 1063f7ea-d841-43b3-903a-01747681c40d +gpgsig -----BEGIN PGP SIGNATURE----- + + iQIzBAABCAAdFiEE6vnM/NCHZAjyl8YKnLXueJXoJosFAmgwhvsACgkQnLXueJXo + JovXUxAAq0WKJILCUAxyhwh5tRdxJTB2NjiCLf+ggLfjyrWPtMWPi/YUt7iGPB2H + Wbv9U7l5t+54fPX8TQtBKZ79YaDMfYdjlfDSijmPruf8/MXB4G0rAaIajtCr0usZ + kJDOgmmYS7bVMybDe6guwFZappiuSS2dCEYgeJun+q7Y6IYsfvdAluJmGubQIkPT + rrEffqoQz3URmDYnAKW3sTRUVwCkYIJDxpl/W0Rvc0jmELdkHu7JYX7XvZBYSUDq + FWgzCPjyErtkKk8AqoeWtTCpL+9ozzNIXNRKjGCOL2LG4H/uuNFdM46HB+KW/7+B + wMGcpZk8T/zN9Cf348M+y+o09QX1OWavDS6LgvWJaDtG/swgxV96KKR5lEtdd1IU + JHuXfPUfGp4r378FIrbPK+Thu5bn9Yq8qGvdZOpTqDxHPU9/o9wLpJghcWJZ5O3X + MpK4HdN+bME2zgBd08QsOjANogbJIz9MVaMGRFlCO5iOiz2DxG+v2KkO8IRwGXaO + OKKQ7BD04fS2wFma862BaTtB9M9f9UTWV4e2mgRpSDJWTQKrj+HkJ63gAFQYFnfp + ppgqZLkmzH1Ta2U56JSMMfOoKVFgjuxRx1d+tzdC+TpQyo06NI1KkNMepK1rhFBW + p8hej6n/7Bl9LL/W+DKsNqW9jQbTYu66JqKs3Kg7xga6w/ss0iw= + =VG6I + -----END PGP SIGNATURE----- + +asdf +asdf +asdf +` + + 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----- + +iQIzBAABCAAdFiEE6vnM/NCHZAjyl8YKnLXueJXoJosFAmgwhvsACgkQnLXueJXo +JovXUxAAq0WKJILCUAxyhwh5tRdxJTB2NjiCLf+ggLfjyrWPtMWPi/YUt7iGPB2H +Wbv9U7l5t+54fPX8TQtBKZ79YaDMfYdjlfDSijmPruf8/MXB4G0rAaIajtCr0usZ +kJDOgmmYS7bVMybDe6guwFZappiuSS2dCEYgeJun+q7Y6IYsfvdAluJmGubQIkPT +rrEffqoQz3URmDYnAKW3sTRUVwCkYIJDxpl/W0Rvc0jmELdkHu7JYX7XvZBYSUDq +FWgzCPjyErtkKk8AqoeWtTCpL+9ozzNIXNRKjGCOL2LG4H/uuNFdM46HB+KW/7+B +wMGcpZk8T/zN9Cf348M+y+o09QX1OWavDS6LgvWJaDtG/swgxV96KKR5lEtdd1IU +JHuXfPUfGp4r378FIrbPK+Thu5bn9Yq8qGvdZOpTqDxHPU9/o9wLpJghcWJZ5O3X +MpK4HdN+bME2zgBd08QsOjANogbJIz9MVaMGRFlCO5iOiz2DxG+v2KkO8IRwGXaO +OKKQ7BD04fS2wFma862BaTtB9M9f9UTWV4e2mgRpSDJWTQKrj+HkJ63gAFQYFnfp +ppgqZLkmzH1Ta2U56JSMMfOoKVFgjuxRx1d+tzdC+TpQyo06NI1KkNMepK1rhFBW +p8hej6n/7Bl9LL/W+DKsNqW9jQbTYu66JqKs3Kg7xga6w/ss0iw= +=VG6I +-----END PGP SIGNATURE----- +`, commitFromReader.Signature.Signature) + assert.Equal(t, `tree a29321bf9e3ec433ed9e47b1cbbac6906c71fc60 +parent c0d83043ade7fa3ca10659608799477e9daa670b +author Sebastian Thiel 1747920681 +0200 +committer Sebastian Thiel 1748010747 +0200 +gitbutler-headers-version 2 +gitbutler-change-id 1063f7ea-d841-43b3-903a-01747681c40d + +asdf +asdf +asdf +`, commitFromReader.Signature.Payload) + assert.Equal(t, "Sebastian Thiel ", commitFromReader.Author.String()) +} + func TestHasPreviousCommit(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") diff --git a/modules/git/repo_compare.go b/modules/git/repo_compare.go index 94f1911c4a..98a1930ac2 100644 --- a/modules/git/repo_compare.go +++ b/modules/git/repo_compare.go @@ -30,6 +30,12 @@ type CompareInfo struct { NumFiles int } +// GetMergeBaseSimple returns the merge base of base and head. +func (repo *Repository) GetMergeBaseSimple(base, head string) (string, error) { + stdout, _, err := NewCommand(repo.Ctx, "merge-base").AddDashesAndList(base, head).RunStdString(&RunOpts{Dir: repo.Path}) + return strings.TrimSpace(stdout), err +} + // GetMergeBase checks and returns merge base of two branches and the reference used as base. func (repo *Repository) GetMergeBase(tmpRemote, base, head string) (string, string, error) { if tmpRemote == "" { @@ -174,16 +180,36 @@ func (repo *Repository) GetDiffNumChangedFiles(base, head string, directComparis return w.numLines, nil } -// GetDiffShortStat counts number of changed files, number of additions and deletions -func (repo *Repository) GetDiffShortStat(base, head string) (numFiles, totalAdditions, totalDeletions int, err error) { - numFiles, totalAdditions, totalDeletions, err = GetDiffShortStat(repo.Ctx, repo.Path, nil, base+"..."+head) - if err != nil && strings.Contains(err.Error(), "no merge base") { - return GetDiffShortStat(repo.Ctx, repo.Path, nil, base, head) +var ( + ErrNoMergebaseFound = errors.New("no merge base found") + ErrMultipleMergebasesFound = errors.New("multiple merge bases found") +) + +// GetShortStat returns the number of changed files, additions and deletions. If +// `useMergebase` is specified then the merge base between `base` and `head` is +// used to compare against `head`. +func (repo *Repository) GetShortStat(base, head string, useMergebase bool) (numFiles, totalAdditions, totalDeletions int, err error) { + cmd := NewCommand(repo.Ctx, "diff-tree", "--shortstat") + if useMergebase { + cmd = cmd.AddArguments("--merge-base") } - return numFiles, totalAdditions, totalDeletions, err + cmd.AddDynamicArguments(base, head) + + stdout, stderr, err := cmd.RunStdString(&RunOpts{Dir: repo.Path}) + if err != nil { + switch stderr { + case "fatal: no merge base found\n": + return 0, 0, 0, ErrNoMergebaseFound + case "fatal: multiple merge bases found\n": + return 0, 0, 0, ErrMultipleMergebasesFound + } + return 0, 0, 0, err + } + + return parseDiffStat(stdout) } -// GetCommitStat returns the number of files, total additions and total deletions the commit has. +// GetCommitShortStat returns the number of files, total additions and total deletions the commit has. func (repo *Repository) GetCommitShortStat(commitID string) (numFiles, totalAdditions, totalDeletions int, err error) { cmd := NewCommand(repo.Ctx, "diff-tree", "--shortstat", "--no-commit-id", "--root").AddDynamicArguments(commitID) stdout, _, err := cmd.RunStdString(&RunOpts{Dir: repo.Path}) @@ -194,13 +220,13 @@ func (repo *Repository) GetCommitShortStat(commitID string) (numFiles, totalAddi return parseDiffStat(stdout) } -// GetDiffShortStat counts number of changed files, number of additions and deletions -func GetDiffShortStat(ctx context.Context, repoPath string, trustedArgs TrustedCmdArgs, dynamicArgs ...string) (numFiles, totalAdditions, totalDeletions int, err error) { - // Now if we call: - // $ git diff --shortstat 1ebb35b98889ff77299f24d82da426b434b0cca0...788b8b1440462d477f45b0088875 - // we get: - // " 9902 files changed, 2034198 insertions(+), 298800 deletions(-)\n" - cmd := NewCommand(ctx, "diff", "--shortstat").AddArguments(trustedArgs...).AddDynamicArguments(dynamicArgs...) +// GetIndexShortStat returns the number of files, total additions and total +// deletions the commit has. +// +// NOTE: It uses `git-diff-index`, should only be used when working with +// temporary repository. When working on bare repositories use `GetCommitShortStat`. +func GetIndexShortStat(ctx context.Context, repoPath, commitID string) (numFiles, totalAdditions, totalDeletions int, err error) { + cmd := NewCommand(ctx, "diff-index", "--cached", "--shortstat").AddDynamicArguments(commitID) stdout, _, err := cmd.RunStdString(&RunOpts{Dir: repoPath}) if err != nil { return 0, 0, 0, err diff --git a/modules/git/repo_compare_test.go b/modules/git/repo_compare_test.go index b1ebdf6177..fcdc256112 100644 --- a/modules/git/repo_compare_test.go +++ b/modules/git/repo_compare_test.go @@ -243,3 +243,87 @@ func TestGetCommitShortStat(t *testing.T) { assert.Equal(t, 0, totalDeletions) }) } + +func TestGetShortStat(t *testing.T) { + // https://github.com/git/git/blob/60f3f52f17cceefa5299709b189ce6fe2d181e7b/t/t4068-diff-symmetric-merge-base.sh#L10-L23 + repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "symmetric_repo")) + require.NoError(t, err) + defer repo.Close() + + t.Run("Normal", func(t *testing.T) { + t.Run("Via merge base", func(t *testing.T) { + numFiles, totalAdditions, totalDeletions, err := repo.GetShortStat("br2", "main", true) + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Equal(t, 1, totalAdditions) + assert.Zero(t, totalDeletions) + + numFiles, totalAdditions, totalDeletions, err = repo.GetShortStat("main", "br2", true) + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Equal(t, 1, totalAdditions) + assert.Zero(t, totalDeletions) + }) + + t.Run("Direct compare", func(t *testing.T) { + numFiles, totalAdditions, totalDeletions, err := repo.GetShortStat("main", "br2", false) + require.NoError(t, err) + assert.Equal(t, 2, numFiles) + assert.Equal(t, 1, totalAdditions) + assert.Equal(t, 1, totalDeletions) + + numFiles, totalAdditions, totalDeletions, err = repo.GetShortStat("main", "br3", false) + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Equal(t, 1, totalAdditions) + assert.Zero(t, totalDeletions) + + numFiles, totalAdditions, totalDeletions, err = repo.GetShortStat("br3", "main", false) + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Zero(t, totalAdditions) + assert.Equal(t, 1, totalDeletions) + }) + }) + + t.Run("No merge base", func(t *testing.T) { + numFiles, totalAdditions, totalDeletions, err := repo.GetShortStat("main", "br3", true) + require.ErrorIs(t, err, ErrNoMergebaseFound) + assert.Zero(t, numFiles) + assert.Zero(t, totalAdditions) + assert.Zero(t, totalDeletions) + }) + + t.Run("Multiple merge base", func(t *testing.T) { + numFiles, totalAdditions, totalDeletions, err := repo.GetShortStat("main", "br1", true) + require.ErrorIs(t, err, ErrMultipleMergebasesFound) + assert.Zero(t, numFiles) + assert.Zero(t, totalAdditions) + assert.Zero(t, totalDeletions) + }) +} + +func TestGetMergeBaseSimple(t *testing.T) { + repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "symmetric_repo")) + require.NoError(t, err) + + defer repo.Close() + + t.Run("Normal", func(t *testing.T) { + mergebase, err := repo.GetMergeBaseSimple("main", "br2") + require.NoError(t, err) + assert.Equal(t, "9d36f18c8ca14ad28c4751afd14f3e3146a785dc", mergebase) + }) + + t.Run("No mergebase", func(t *testing.T) { + mergebase, err := repo.GetMergeBaseSimple("main", "br3") + require.ErrorContains(t, err, "exit status 1") + assert.Empty(t, mergebase) + }) + + t.Run("Multiple mergebase", func(t *testing.T) { + mergebase, err := repo.GetMergeBaseSimple("main", "br1") + require.NoError(t, err) + assert.Equal(t, "9d36f18c8ca14ad28c4751afd14f3e3146a785dc", mergebase) + }) +} diff --git a/modules/git/tests/repos/symmetric_repo/HEAD b/modules/git/tests/repos/symmetric_repo/HEAD new file mode 100644 index 0000000000..992854f9fb --- /dev/null +++ b/modules/git/tests/repos/symmetric_repo/HEAD @@ -0,0 +1 @@ +ref: refs/heads/br3 diff --git a/modules/git/tests/repos/symmetric_repo/config b/modules/git/tests/repos/symmetric_repo/config new file mode 100644 index 0000000000..07d359d07c --- /dev/null +++ b/modules/git/tests/repos/symmetric_repo/config @@ -0,0 +1,4 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true diff --git a/modules/git/tests/repos/symmetric_repo/objects/01/fc2bb01605691ba1f40694c1da70501583a085 b/modules/git/tests/repos/symmetric_repo/objects/01/fc2bb01605691ba1f40694c1da70501583a085 new file mode 100644 index 0000000000..914d958d71 Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/01/fc2bb01605691ba1f40694c1da70501583a085 differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/02/84078471ec566623807297baf4450382542dcb b/modules/git/tests/repos/symmetric_repo/objects/02/84078471ec566623807297baf4450382542dcb new file mode 100644 index 0000000000..061fc8feec Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/02/84078471ec566623807297baf4450382542dcb differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/19/33da329284aca10dab8dc2fdd54213acd39be5 b/modules/git/tests/repos/symmetric_repo/objects/19/33da329284aca10dab8dc2fdd54213acd39be5 new file mode 100644 index 0000000000..7abecb8b4e Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/19/33da329284aca10dab8dc2fdd54213acd39be5 differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/3f/10b1d474ee0a63d008be715494586ccbbbc9da b/modules/git/tests/repos/symmetric_repo/objects/3f/10b1d474ee0a63d008be715494586ccbbbc9da new file mode 100644 index 0000000000..b54a2a79d7 Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/3f/10b1d474ee0a63d008be715494586ccbbbc9da differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/3f/151445f4d22fec48009aa692142c96bce6dcf6 b/modules/git/tests/repos/symmetric_repo/objects/3f/151445f4d22fec48009aa692142c96bce6dcf6 new file mode 100644 index 0000000000..82c5d29824 Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/3f/151445f4d22fec48009aa692142c96bce6dcf6 differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/modules/git/tests/repos/symmetric_repo/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 new file mode 100644 index 0000000000..adf64119a3 Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/54/93447336137e6fc28e3be3067f7049273c6909 b/modules/git/tests/repos/symmetric_repo/objects/54/93447336137e6fc28e3be3067f7049273c6909 new file mode 100644 index 0000000000..30092e4f7b Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/54/93447336137e6fc28e3be3067f7049273c6909 differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/61/780798228d17af2d34fce4cfbdf35556832472 b/modules/git/tests/repos/symmetric_repo/objects/61/780798228d17af2d34fce4cfbdf35556832472 new file mode 100644 index 0000000000..586bf17a49 Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/61/780798228d17af2d34fce4cfbdf35556832472 differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/6a/69f92020f5df77af6e8813ff1232493383b708 b/modules/git/tests/repos/symmetric_repo/objects/6a/69f92020f5df77af6e8813ff1232493383b708 new file mode 100644 index 0000000000..77148f56f4 Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/6a/69f92020f5df77af6e8813ff1232493383b708 differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/6b/e660545b31f61a82a87d2b1915f0b88bb9f16f b/modules/git/tests/repos/symmetric_repo/objects/6b/e660545b31f61a82a87d2b1915f0b88bb9f16f new file mode 100644 index 0000000000..c8bc9c3d9e Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/6b/e660545b31f61a82a87d2b1915f0b88bb9f16f differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/71/3fc38bac217f3909a1ca43479dec4f3f6e039e b/modules/git/tests/repos/symmetric_repo/objects/71/3fc38bac217f3909a1ca43479dec4f3f6e039e new file mode 100644 index 0000000000..fde71ec26c Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/71/3fc38bac217f3909a1ca43479dec4f3f6e039e differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/83/966f2fad7dfb1c567ca63bb68e9a7d38b4afc6 b/modules/git/tests/repos/symmetric_repo/objects/83/966f2fad7dfb1c567ca63bb68e9a7d38b4afc6 new file mode 100644 index 0000000000..50d57fceec Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/83/966f2fad7dfb1c567ca63bb68e9a7d38b4afc6 differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/9d/36f18c8ca14ad28c4751afd14f3e3146a785dc b/modules/git/tests/repos/symmetric_repo/objects/9d/36f18c8ca14ad28c4751afd14f3e3146a785dc new file mode 100644 index 0000000000..d1ecb2995f Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/9d/36f18c8ca14ad28c4751afd14f3e3146a785dc differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/bf/91e6a4737da117217f8b32276998b10ee55f65 b/modules/git/tests/repos/symmetric_repo/objects/bf/91e6a4737da117217f8b32276998b10ee55f65 new file mode 100644 index 0000000000..ad3f6a1f9b Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/bf/91e6a4737da117217f8b32276998b10ee55f65 differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/d6/dfac318c3dcd5f05554472666d7bb6dfd9e8db b/modules/git/tests/repos/symmetric_repo/objects/d6/dfac318c3dcd5f05554472666d7bb6dfd9e8db new file mode 100644 index 0000000000..75ea7eaed6 Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/d6/dfac318c3dcd5f05554472666d7bb6dfd9e8db differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/e4/2ba3e77f66f623836b47df796932f7e5604aec b/modules/git/tests/repos/symmetric_repo/objects/e4/2ba3e77f66f623836b47df796932f7e5604aec new file mode 100644 index 0000000000..dc832f465c Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/e4/2ba3e77f66f623836b47df796932f7e5604aec differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/f2/ad6c76f0115a6ba5b00456a849810e7ec0af20 b/modules/git/tests/repos/symmetric_repo/objects/f2/ad6c76f0115a6ba5b00456a849810e7ec0af20 new file mode 100644 index 0000000000..a36463115d Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/f2/ad6c76f0115a6ba5b00456a849810e7ec0af20 differ diff --git a/modules/git/tests/repos/symmetric_repo/objects/f4/e316302084c597f1678ff1db625b28f68194ae b/modules/git/tests/repos/symmetric_repo/objects/f4/e316302084c597f1678ff1db625b28f68194ae new file mode 100644 index 0000000000..2133e56d5c Binary files /dev/null and b/modules/git/tests/repos/symmetric_repo/objects/f4/e316302084c597f1678ff1db625b28f68194ae differ diff --git a/modules/git/tests/repos/symmetric_repo/packed-refs b/modules/git/tests/repos/symmetric_repo/packed-refs new file mode 100644 index 0000000000..0e61c448af --- /dev/null +++ b/modules/git/tests/repos/symmetric_repo/packed-refs @@ -0,0 +1,8 @@ +# pack-refs with: peeled fully-peeled sorted +01fc2bb01605691ba1f40694c1da70501583a085 refs/heads/br1 +5493447336137e6fc28e3be3067f7049273c6909 refs/heads/br2 +3f10b1d474ee0a63d008be715494586ccbbbc9da refs/heads/br3 +83966f2fad7dfb1c567ca63bb68e9a7d38b4afc6 refs/heads/main +bf91e6a4737da117217f8b32276998b10ee55f65 refs/tags/commit-C +^9d36f18c8ca14ad28c4751afd14f3e3146a785dc +0284078471ec566623807297baf4450382542dcb refs/tags/commit-D diff --git a/modules/git/tests/repos/symmetric_repo/refs/heads/.gitkeep b/modules/git/tests/repos/symmetric_repo/refs/heads/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/modules/git/tests/repos/symmetric_repo/refs/tags/.gitkeep b/modules/git/tests/repos/symmetric_repo/refs/tags/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/modules/git/url/url_test.go b/modules/git/url/url_test.go index 54655633bf..68ad8bd7c5 100644 --- a/modules/git/url/url_test.go +++ b/modules/git/url/url_test.go @@ -29,12 +29,12 @@ func TestParseGitURLs(t *testing.T) { }, }, { - kase: "git@[fe80:14fc:cec5:c174:d88%2510]:go-gitea/gitea.git", + kase: "git@[fe80::14fc:cec5:c174:d88%2510]:go-gitea/gitea.git", expected: &GitURL{ URL: &url.URL{ Scheme: "ssh", User: url.User("git"), - Host: "[fe80:14fc:cec5:c174:d88%10]", + Host: "[fe80::14fc:cec5:c174:d88%10]", Path: "go-gitea/gitea.git", }, extraMark: 1, @@ -132,11 +132,11 @@ func TestParseGitURLs(t *testing.T) { }, }, { - kase: "https://[fe80:14fc:cec5:c174:d88%2510]:20/go-gitea/gitea.git", + kase: "https://[fe80::14fc:cec5:c174:d88%2510]:20/go-gitea/gitea.git", expected: &GitURL{ URL: &url.URL{ Scheme: "https", - Host: "[fe80:14fc:cec5:c174:d88%10]:20", + Host: "[fe80::14fc:cec5:c174:d88%10]:20", Path: "/go-gitea/gitea.git", }, extraMark: 0, diff --git a/modules/markup/html.go b/modules/markup/html.go index c45edad44f..2fe0caa5b6 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -1254,7 +1254,7 @@ func filePreviewPatternProcessor(ctx *RenderContext, node *html.Node) { // Specialized version of replaceContent, so the parent paragraph element is not destroyed from our div before := node.Data[:(preview.start - offset)] after := node.Data[(preview.end - offset):] - afterNode := &html.Node{ + afterTextNode := &html.Node{ Type: html.TextNode, Data: after, } @@ -1263,22 +1263,20 @@ func filePreviewPatternProcessor(ctx *RenderContext, node *html.Node) { case "div", "li", "td", "th", "details": nextSibling := node.NextSibling node.Parent.InsertBefore(previewNode, nextSibling) - node.Parent.InsertBefore(afterNode, nextSibling) + node.Parent.InsertBefore(afterTextNode, nextSibling) case "p", "span", "em", "strong": - nextSibling := node.Parent.NextSibling - node.Parent.Parent.InsertBefore(previewNode, nextSibling) - afterPNode := &html.Node{ + nextParentSibling := node.Parent.NextSibling + node.Parent.Parent.InsertBefore(previewNode, nextParentSibling) + afterNode := &html.Node{ Type: html.ElementNode, Data: node.Parent.Data, Attr: node.Parent.Attr, } - afterPNode.AppendChild(afterNode) - node.Parent.Parent.InsertBefore(afterPNode, nextSibling) - siblingNode := node.NextSibling - if siblingNode != nil { - node.NextSibling = nil - siblingNode.PrevSibling = nil - afterPNode.AppendChild(siblingNode) + afterNode.AppendChild(afterTextNode) + node.Parent.Parent.InsertBefore(afterNode, nextParentSibling) + for sibling := node.NextSibling; sibling != nil; sibling = node.NextSibling { + sibling.Parent.RemoveChild(sibling) + afterNode.AppendChild(sibling) } default: matched = false @@ -1286,7 +1284,7 @@ func filePreviewPatternProcessor(ctx *RenderContext, node *html.Node) { if matched { offset = preview.end node.Data = before - node = afterNode + node = afterTextNode } } node = node.NextSibling diff --git a/modules/markup/html_test.go b/modules/markup/html_test.go index 70a5b4324b..c7c53e2678 100644 --- a/modules/markup/html_test.go +++ b/modules/markup/html_test.go @@ -1298,4 +1298,20 @@ func TestRender_FilePreview(t *testing.T) { localMetas, ) }) + + t.Run("file previews followed by new line", func(t *testing.T) { + testRender( + commitFileURLFirstLine+"\nand\n"+commitFileURLFirstLine, + "

"+filePreviewBox+"


\nand
\n

"+filePreviewBox+"

", + localMetas, + ) + }) + + t.Run("file previews followed by new line in div", func(t *testing.T) { + testRender( + "
"+commitFileURLFirstLine+"\nand\n"+commitFileURLFirstLine+"
", + "
"+filePreviewBox+"\nand\n"+filePreviewBox+"
", + localMetas, + ) + }) } diff --git a/modules/markup/renderer.go b/modules/markup/renderer.go index ceaf435684..05dd512815 100644 --- a/modules/markup/renderer.go +++ b/modules/markup/renderer.go @@ -326,7 +326,7 @@ func render(ctx *RenderContext, renderer Renderer, input io.Reader, output io.Wr if r, ok := renderer.(ExternalRenderer); ok && r.DisplayInIFrame() { // Append a short script to the iframe's contents, which will communicate the scroll height of the embedded document via postMessage, either once loaded (in case the containing page loads first) in response to a postMessage from external.js, in case the iframe loads first // We use '*' as a target origin for postMessage, because can be certain we are embedded on the same domain, due to X-Frame-Options configured elsewhere. (Plus, the offsetHeight of an embedded document is likely not sensitive data anyway.) - _, _ = pw.Write([]byte("")) + _, _ = pw.Write([]byte("")) } _ = pw.Close() diff --git a/modules/setting/indexer_test.go b/modules/setting/indexer_test.go index 8f0437be8a..498f8752a2 100644 --- a/modules/setting/indexer_test.go +++ b/modules/setting/indexer_test.go @@ -65,7 +65,7 @@ func checkGlobMatch(t *testing.T, globstr string, list []indexerMatchList) { } } if !found { - assert.Equal(t, m.position, -1, "Test string `%s` doesn't match `%s` anywhere; expected @%d", m.value, globstr, m.position) + assert.Equal(t, -1, m.position, "Test string `%s` doesn't match `%s` anywhere; expected @%d", m.value, globstr, m.position) } } } diff --git a/modules/structs/admin_user.go b/modules/structs/admin_user.go index 8a4d066d72..a7bd5643e9 100644 --- a/modules/structs/admin_user.go +++ b/modules/structs/admin_user.go @@ -50,4 +50,5 @@ type EditUserOption struct { AllowCreateOrganization *bool `json:"allow_create_organization"` Restricted *bool `json:"restricted"` Visibility string `json:"visibility" binding:"In(,public,limited,private)"` + HideEmail *bool `json:"hide_email"` } diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index 6c3a451cc7..ecde784a7f 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -1366,8 +1366,6 @@ issues.review.comment = рецензира %s branch.deleted_by = Изтрит от %s branch.restore = Възстановяване на клона „%s“ archive.title_date = Това хранилище е архивирано на %s. Можете да преглеждате файлове и да го клонирате, но не можете да правите промени в състоянието му, като изтласкване и създаване на нови задачи, заявки за сливане или коментари. -release.download_count_one = %s изтегляне -release.download_count_few = %s изтегляния branch.restore_success = Клонът „%s“ е възстановен. tag.create_tag_from = Създаване на нов маркер от „%s“ branch.create_new_branch = Създаване на клон от клон: diff --git a/options/locale/locale_ca.ini b/options/locale/locale_ca.ini index de6d692410..b4d2d3895c 100644 --- a/options/locale/locale_ca.ini +++ b/options/locale/locale_ca.ini @@ -484,13 +484,13 @@ team_invite.subject = %[1]s us convida a unir-vos a l'organització %[2]s release.title = Títol: %s release.downloads = Baixades: release.download.zip = Codi font (ZIP) -repo.transfer.subject_to_you = %s us vol transferir el repositori "%s" +repo.transfer.subject_to_you = %s us vol transferir el repositori «%s» repo.collaborator.added.subject = %s us ha afegit a %s com a col·laborador repo.collaborator.added.text = Us han afegit com a col·laborador al repositori: issue_assigned.issue = @%[1]s us ha assignat l'incidència %[2]s del repositori %[3]s. issue.x_mentioned_you = @%s us ha mencionat: issue.action.new = @%[1]s ha creat #%[2]d. -repo.transfer.subject_to = %s vol transferir el repositori "%s" a %s +repo.transfer.subject_to = %s vol transferir el repositori «%s» a %s repo.transfer.to_you = tu register_notify.text_3 = Si algú altre us ha fet aquest compte, necessitareu configurar la vostra contrasenya abans. password_change.subject = S'ha canviat la vostra contrasenya @@ -507,6 +507,24 @@ issue.action.reopen = @%[1]s ha reobert #%[2]s. issue.action.approve = @%[1]s ha aprovat aquesta sol·licitud d'extracció. issue.action.reject = @%[1]s ha sol·licitat canvis en aquesta sol·licitud d'extracció. register_notify.text_2 = Podeu iniciar sessió al vostre compte fent servir el vostre nom d'usuari: %s +register_notify.text_1 = aquest és el vostre correu electrònic de confirmació pel registre de %s! +password_change.text_1 = S'acaba de canviar la contrasenya pel vostre compte. +issue.action.review = @%[1]s ha deixat un comentari a la vostra sol·licitud d'extracció. +issue.action.review_dismissed = @%[1]s ha rebutjat l'última revisió de %[2]s per aquesta sol·licitud d'extracció. +primary_mail_change.text_1 = S'ha canviat la vostra adreça de correu electrònic principal a %[1]s. Això vol dir que aquesta adreça de correu electrònic no rebrà més notificacions de correu pel vostre compte. +totp_disabled.text_1 = S'han desactivat les contrasenyes d'un sol ús basades en el temps (TOTP) pel vostre compte. +totp_disabled.no_2fa = Ja no hi ha altres mètodes d'autenticació de doble factor configurats, per la qual cosa ja no és necessari iniciar sessió al vostre compte mitjançat autenticació de doble factor. +removed_security_key.no_2fa = Ja no hi ha altres mètodes d'autenticació de doble factor configurats, per la qual cosa ja no és necessari iniciar sessió al vostre compte mitjançat autenticació de doble factor. +reset_password = Recupereu el vostre compte +reset_password.text = Si heu sigut vós, cliqueu el següent enllaç per recuperar el vostre compte abans de %s: +totp_enrolled.text_1.has_webauthn = Heu habilitat el TOTP per al vostre compte. Això vol dir que, per a totes les futures connexions al vostre compte, podreu utilitzar el TOTP com a mètode d'autenticació en dos passos (2FA) o bé utilitzar qualsevol de les vostres claus de seguretat. +issue.action.force_push = %[1]s ha realitzat un «force push» de %[2]s des de %[3]s fins a %[4]s. +issue.action.ready_for_review = @%[1]s ha marcat aquesta «pull request» com a preparada per a la revisió. +issue.in_tree_path = A %s: +issue.action.push_1 = @%[1]s ha pujat $[3]d commit a %[2]s +issue.action.push_n = @%[1]s ha pujat $[3]d commits a %[2]s +release.note = Nota: +release.new.text = @%[1]s ha publicat %[2]s a %[3]s [modal] yes = Sí @@ -579,6 +597,18 @@ require_error = ` no pot estar buit.` min_size_error = ` ha de contenir %s caràcters com a mínim.` max_size_error = ` ha de contenir %s caràcters com a màxim.` email_domain_is_not_allowed = El domini de l'adreça de correu electrònic %s de l'usuari entra en conflicte amb EMAIL_DOMAIN_ALLOWLIST o EMAIL_DOMAIN_BLOCKLIST. Assegureu-vos d'haver introduït l'adreça de correu electrònic correctament. +Website = Lloc web +Location = Ubicació +AdminEmail = Correu electrònic de l'administrador +AccessToken = Testimoni d'accés +alpha_dash_error = ` hauria de contenir només caràcters alfanumèrics, guions ("-") i barres baixes ("_").` +alpha_dash_dot_error = ` hauria de contenir només caràcters alfanumèrics, guions ("-"), barres baixes ("_") i punts (".").` +regex_pattern_error = ` el patró d'expressió regular no és vàlid: %s.` +required_prefix = L'entrada ha de començar amb "%s" +CommitSummary = Resum del commit +CommitMessage = Missatge del commit +CommitChoice = Selecció de commit +TreeName = Camí del fitxer [settings] pronouns = Pronoms @@ -738,6 +768,105 @@ generate_token_success = S'ha generat el vostre nou testimoni. Copieu-lo ara, ja generate_token_name_duplicate = Ja s'ha usat %s com a nom d'aplicació. Si us plau, useu-ne un de nou. delete_token = Eliminar access_token_deletion = +delete_email = Eliminar +biography_placeholder = Explica una mica sobre tu als altres! (Compatible amb Markdown) +add_new_email = Afegir una adreça de correu electrònic +add_new_openid = Afegir una nova URI d'OpenID +add_email = Afegir una adreça de correu electrònic +add_openid = Afegir una URI d'OpenID +keep_email_private = Oculta l'adreça de correu electrònic +delete_key = Eliminar +added_on = Afegit el %s +last_used = Usat per últim cop el +can_read_info = Llegir +can_write_info = Escriure +hide_openid = Ocultar del perfil +show_openid = Mostrar al perfil +ssh_disabled = SSH està deshabilitat +access_token_deletion_desc = Eliminar un testimoni revocarà l'accés al vostre compte de les aplicacions que l'estiguin fent servir. Aquesta acció no es pot desfer. Voleu continuar? +delete_token_success = S'ha eliminat el testimoni. Les aplicacions que l'estiguin fent servir ja no tenen accés al vostre compte. +regenerate_token = Regenerar +access_token_regeneration = Regenerar un testimoni d'accés +access_token_regeneration_desc = Regenerar un testimoni revocarà l'accés al vostre compte de les aplicacions que l'estiguin fent servir. Aquesta acció no es pot desfer. Voleu continuar? +regenerate_token_success = S'ha regenerat el testimoni. Les aplicacions que el fan servir ja no tenen accés al vostre compte i s'han actualitzar al nou testimoni. +permissions_public_only = Només públic +permissions_access_all = Tot (públic, privat i limitat) +select_permissions = Selecció de permisos +permission_no_access = Sense accés +permission_read = Lectura +permission_write = Lectura i escriptura +at_least_one_permission = Heu de seleccionar un permís com a mínim per crear un testimoni +permissions_list = Permisos: +remove_oauth2_application = Eliminar aplicació OAuth2 +edit_oauth2_application = Modificar aplicació OAuth2 +manage_oauth2_applications = Gestionar aplicacions OAuth2 +remove_oauth2_application_success = S'ha eliminat l'aplicació. +create_oauth2_application = Crear una nova aplicació OAuth2 +create_oauth2_application_button = Crear aplicació +create_oauth2_application_success = Heu creat amb èxit una nova aplicació OAuth2. +update_oauth2_application_success = Heu actualitzat amb èxit l'aplicació OAuth2. +oauth2_application_name = Nom de l'aplicació +oauth2_redirect_uris = URIs de redirecció. Si us plau, poseu cada URI en una línia nova. +save_application = Guardar +oauth2_client_id = ID del client +oauth2_client_secret = Secret del client +oauth2_regenerate_secret = Regenerar secret +oauth2_regenerate_secret_hint = Heu perdut el vostre secret? +oauth2_application_edit = Modificar +authorized_oauth2_applications = Aplicacions OAuth2 autoritzades +authorized_oauth2_applications_description = Heu permès accés al vostre compte personal de Forgejo a aquestes aplicacions de tercers. Si us plau, revoqueu l'accés de les aplicacions que ja no feu servir. +revoke_key = Revocar +revoke_oauth2_grant = Revocar l'accés +revoke_oauth2_grant_description = Revocar l'accés d'aquesta aplicació de tercers impedirà que accedeixi a la vostra informació. N'esteu segurs? +revoke_oauth2_grant_success = L'accés s'ha revocat amb èxit. +twofa_desc = Per protegir el vostre compte del robatori de contrasenyes, podeu fer servir un telèfon intel·ligent o un altre dispositiu per rebre contrasenyes d'un sol ús basades en el temps ("TOTP"). +twofa_recovery_tip = Si perdeu el vostre dispositiu, podreu fer servir una clau de recuperació d'un sol ús per recuperar l'accés al vostre compte. +twofa_disable = Desactivar l'autenticació de doble factor +twofa_scratch_token_regenerate = Regenerar la clau de recuperació d'un sol ús +twofa_scratch_token_regenerated = La vostra clau de recuperació d'un sol ús ara és %s. Emmagatzemeu-la en un lloc segur, ja que no es tornarà a mostrar. +twofa_disable_note = L'autenticació de doble factor es pot desactivar si és necessari. +twofa_disable_desc = Desactivar l'autenticació de doble factor farà que el vostre compte sigui menys segur. Voleu continuar? +regenerate_scratch_token_desc = Si heu perdur la vostra clau de recuperació o ja l'heu fet servir per iniciar sessió, la podeu reiniciar aquí. +twofa_disabled = S'ha desactivat l'autenticació de doble factor. +scan_this_image = Escanegeu aquesta imatge amb la vostra aplicació d'autenticació: +or_enter_secret = O introduïu el secret: %s +then_enter_passcode = I introduïu el codi d'accés que es mostra a l'aplicació: +passcode_invalid = El codi d'accés és incorrecte. Intenteu-ho de nou. +twofa_failed_get_secret = No s'ha pogut obtenir el secret. +webauthn_desc = Les claus de seguretat són dispositius que contenen claus criptogràfiques. Es poden fer servir per l'autenticació de doble factor. Les claus de seguretat han de ser compatibles amb l'estàndard WebAuthn Authenticator. +webauthn_register_key = Afegir una clau de seguretat +webauthn_nickname = Sobrenom +webauthn_delete_key_desc = Si elimineu una clau de seguretat no la podreu fer servir per iniciar sessió. Voleu continuar? +webauthn_key_loss_warning = Si perdeu les vostres claus de seguretat, perdreu també l'accés al vostre compte. +manage_account_links = Comptes vinculats +manage_account_links_desc = Aquests comptes externs estan vinculats al vostre compte de Forgejo. +link_account = Vincular un compte +remove_account_link_desc = Eliminar un compte vinculat revocarà el seu accés al vostre compte de Forgejo. Voleu continuar? +remove_account_link_success = S'ha eliminat el compte vinculat. +orgs_none = No sou membres de cap organització. +repos_none = No sou propietaris de cap repositori. +blocked_users_none = No hi ha cap usuari bloquejat. +delete_account = Eliminar el vostre compte +delete_prompt = Aquest acció eliminarà permanentment el vostre compte. Aquesta acció no es pot desfer. +confirm_delete_account = Confirmar l'eliminació +delete_account_title = Eliminar el compte d'usuari +delete_account_desc = Esteu segurs de voler eliminar permanentment aquest compte d'usuari? +email_notifications.enable = Activar les notificacions per correu electrònic +email_notifications.disable = Desactivar les notificacions per correu electrònic +visibility.public_tooltip = Visible per a tothom +visibility.limited_tooltip = Visible només pels usuaris que hagin iniciat sessió +visibility.private_tooltip = Visible només pels membres de les organitzacions a les quals us hàgiu unit +user_unblock_success = S'ha desbloquejat l'usuari amb èxit. +user_block_success = S'ha bloquejat l'usuari amb èxit. +quota.sizes.repos.all = Repositoris +quota.sizes.repos.public = Repositoris públics +quota.sizes.repos.private = Repositoris privats +quota.sizes.git.all = Contingut de Git +quota.sizes.git.lfs = Git LFS +quota.sizes.assets.attachments.all = Fitxers adjunts +quota.sizes.assets.attachments.issues = Fitxers adjunts a incidències +quota.sizes.assets.artifacts = Artefactes +quota.sizes.assets.packages.all = Paquets [repo] settings.basic_settings = Configuració bàsica @@ -951,4 +1080,6 @@ public_activity.visibility_hint.self_public = La vostra activitat és visible pe public_activity.visibility_hint.admin_public = Aquesta activitat és visible per tothom, però com a administrador també podeu veure interaccions en espais privats. public_activity.visibility_hint.self_private = La vostra activitat és visible només per vós i pels administradors de la instància. Configurar. public_activity.visibility_hint.admin_private = Aquesta activitat és visible per vós perquè sou un administrador, però l'usuari vol que romangui privada. -public_activity.visibility_hint.self_private_profile = La vostra activitat és visible només per vós i pels administradors de la instància perquè el vostre perfil és privat. Configurar. \ No newline at end of file +public_activity.visibility_hint.self_private_profile = La vostra activitat és visible només per vós i pels administradors de la instància perquè el vostre perfil és privat. Configurar. +change_avatar = Canvieu el vostre avatar… +joined_on = S'ha unit el %s \ No newline at end of file diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index fce1e25f06..5021549a37 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -2663,8 +2663,6 @@ settings.enforce_on_admins_desc = Správci repozitáře nemohou obejít toto pra issues.num_participants_one = %d účastník size_format = %[1]s: %[2]s, %[3]s: %[4]s issues.archived_label_description = (Archivován) %s -release.download_count_one = %s stažení -release.download_count_few = %s stažení release.system_generated = Tato příloha byla automaticky vygenerována. settings.add_webhook.invalid_path = Cesta nesmí obsahovat část, která je „.“ nebo „..“ nebo prázdný řetězec. Nesmí začínat ani končit lomítkem. settings.web_hook_name_sourcehut_builds = Sestavení SourceHut diff --git a/options/locale/locale_da.ini b/options/locale/locale_da.ini index 38175adf3f..aa68be4f2a 100644 --- a/options/locale/locale_da.ini +++ b/options/locale/locale_da.ini @@ -2664,8 +2664,6 @@ diff.file_suppressed_line_too_long = Filforskellen er undertrykt, fordi en eller diff.review = Afslut gennemgangen diff.review.header = Send anmeldelse diff.review.placeholder = Gennemgå kommentar -release.download_count_one = %s download -release.download_count_few = %s downloads topic.format_prompt = Emner skal starte med et bogstav eller tal, kan indeholde bindestreger ("-") og prikker ("."), kan være op til 35 tegn lange. Bogstaver skal være små. branch.warning_rename_default_branch = Du omdøber standardgrenen. topic.done = Færdig diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 9b29b8d63f..091bfbc273 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -793,7 +793,7 @@ add_email_success=Die neue E-Mail-Addresse wurde hinzugefügt. email_preference_set_success=E-Mail-Einstellungen wurden erfolgreich aktualisiert. add_openid_success=Die neue OpenID-Adresse wurde hinzugefügt. keep_email_private=E-Mail-Adresse verbergen -keep_email_private_popup=Deine Mailadresse wird nicht in deinem Profil angezeigt und wird nicht der Standard für Commits über das Webinterface sein, wie zum Beispiel Dateiuploads, Bearbeitungen, und Merge-Commits. Stattdessen kann eine besondere Adresse %s benutzt werden, um Commits mit deinem Account zu verbinden. Diese Option wirkt sich nicht auf bestehende Commits aus. +keep_email_private_popup=Die E-Mail-Adresse wird nicht im Profil angezeigt und wird nicht der Standard für Commits über das Webinterface sein, wie zum Beispiel Dateiuploads, Bearbeitungen, und Merge-Commits. Stattdessen kann eine besondere Adresse %s benutzt werden, um Commits mit dem Benutzeraccount zu verbinden. Diese Option wirkt sich nicht auf bestehende Commits aus. openid_desc=Mit OpenID kannst du dich über einen Drittanbieter authentifizieren. manage_ssh_keys=SSH-Schlüssel verwalten @@ -1653,8 +1653,8 @@ issues.add_time=Zeit manuell hinzufügen issues.del_time=Diese Zeiterfassung löschen issues.add_time_short=Zeit hinzufügen issues.add_time_cancel=Abbrechen -issues.add_time_history=`hat %s den Zeitaufwand hinzugefügt` -issues.del_time_history=`hat %s den Zeitaufwand gelöscht` +issues.add_time_history=`hat den Zeitaufwand von %s hinzugefügt` +issues.del_time_history=`hat den Zeitaufwand von %s gelöscht` issues.add_time_hours=Stunden issues.add_time_minutes=Minuten issues.add_time_sum_to_small=Es wurde keine Zeit eingegeben. @@ -2664,8 +2664,6 @@ settings.enforce_on_admins = Erzwinge diese Regel für alle Repositoryadministra settings.event_pull_request_enforcement = Erzwingung size_format = %[1]s: %[2]s, %[3]s: %[4]s issues.archived_label_description = (Archiviert) %s -release.download_count_one = %s Download -release.download_count_few = %s Downloads release.system_generated = Dieser Anhang wurde automatisch generiert. settings.add_webhook.invalid_path = Der Pfad darf kein „.“ oder „..“ enhalten und darf auch nicht leer sein. Er darf auch nicht mit einem Schrägstrich anfangen oder enden. settings.sourcehut_builds.manifest_path = Build-Manifest-Pfad diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index bf896abb15..696fe04541 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -2655,8 +2655,6 @@ size_format = %[1]s: %[2]s, %[3]s: %[4]s issues.archived_label_description = (Αρχειοθετημένη) %s vendored = Εξωτερικό open_with_editor = Άνοιγμα με %s -release.download_count_one = %s λήψη -release.download_count_few = %s λήψεις release.system_generated = Αυτό το αρχείο παράγεται αυτόματα. pulls.ready_for_review = Έτοιμο για αξιολόγηση; settings.rename_branch_failed_protected = Δεν είναι δυνατή η μετονομασία του κλάδου %s, επειδή είναι προστατευόμενος. diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 06833fac71..b28e8ed967 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -845,7 +845,7 @@ add_email_success = The new email address has been added. email_preference_set_success = Email preference has been set successfully. add_openid_success = The new OpenID address has been added. keep_email_private = Hide email address -keep_email_private_popup = Your email address will not be shown on your profile and will not be the default for commits made via the web interface, like file uploads, edits, and merge commits. Instead, a special address %s can be used to link commits to your account. This option will not affect existing commits. +keep_email_private_popup = Email address will not be shown on the profile page and will not be the default for commits made via the web interface, like file uploads, edits, and merge commits. Instead, a special address %s can be used to link commits to the user account. This option will not affect existing commits. keep_pronouns_private = Only show pronouns to authenticated users keep_pronouns_private.description = This will hide your pronouns from visitors that are not logged in. openid_desc = OpenID lets you delegate authentication to an external provider. @@ -2725,8 +2725,6 @@ release.tag_name_already_exist = A release with this tag name already exists. release.tag_name_invalid = The tag name is not valid. release.tag_name_protected = The tag name is protected. release.downloads = Downloads -release.download_count_one = %s download -release.download_count_few = %s downloads release.add_tag_msg = Use the title and content of release as tag message. release.hide_archive_links = Hide automatically generated archives release.hide_archive_links_helper = Hide automatically generated source code archives for this release. For example, if you are uploading your own. diff --git a/options/locale/locale_eo.ini b/options/locale/locale_eo.ini index df40c8eb93..4d81f85b4a 100644 --- a/options/locale/locale_eo.ini +++ b/options/locale/locale_eo.ini @@ -98,7 +98,7 @@ ok = Bone download_logs = Elsuti protokolojn unknown = Nekonata issues = Eraroj -error404 = Aŭ tiu ĉi paĝo ne ekzistas, estis forigitavi ne rajtas vidi ĝin. +error404 = Aŭ tiu ĉi paĝo ne ekzistas, estas forigitavi ne rajtas vidi ĝin. retry = Reprovi activities = Aktivecoj confirm_delete_selected = Konfirmi forigon de ĉiu elektito? @@ -141,10 +141,11 @@ new_migrate.link = Novan migrigon new_org.link = Novan organizaĵon error413 = Vi plenkonsumis vian kvoton. twofa_scratch = Sukuranta kodo por duobla aŭtentikigo +copy_path = Kopii dosiervojon [editor] buttons.list.ordered.tooltip = Aldoni nombran liston -buttons.bold.tooltip = Aldoni grasan tekston +buttons.bold.tooltip = Aldoni grasan tekston (Ctrl+B / ⌘B) buttons.quote.tooltip = Citi tekston buttons.code.tooltip = Aldoni kodtekston buttons.list.unordered.tooltip = Aldoni punktan liston @@ -154,7 +155,7 @@ buttons.ref.tooltip = Citi eraron aŭ tirpeton buttons.list.task.tooltip = Aldoni liston de taskoj buttons.enable_monospace_font = Ŝalti egallarĝan signoformaron buttons.mention.tooltip = Mencii uzanton aŭ grupon -buttons.italic.tooltip = Aldoni oblikvan tekston +buttons.italic.tooltip = Aldoni oblikvan tekston (Ctrl+I / ⌘I) buttons.link.tooltip = Aldoni ligilon buttons.disable_monospace_font = Malsalti egallarĝan signoformaron buttons.indent.tooltip = Krommarĝeni erojn je unu nivelo @@ -166,6 +167,9 @@ table_modal.placeholder.content = Enhavo table_modal.label.rows = Horizontaloj table_modal.label.columns = Vertikaloj link_modal.description = Priskribo +link_modal.header = Aldoni ligilon +link_modal.url = Url +link_modal.paste_reminder = Aludo: kun URL en via tondujo, vi povas alglui senpere al la redaktilo por krei ligilon. [aria] navbar = Esplora breto @@ -202,6 +206,7 @@ install_desc = Simple aŭ Forgejon! Aliĝu kaj helpu nin plibonigi la projekton. Ne timu kontribui! +platform_desc = Forgejo estas konfirmita ruli sur liberaj operaciumoj kiel Linukso kaj FreeBSD, kaj malsamaj arkitekturprocesoroj. Elektu tion, kion vi preferas. [install] title = Komenca agordado @@ -311,7 +316,7 @@ enable_update_checker = Aktivigi novversian kontrolanton password_algorithm = Pasvorthaketiga algoritmo env_config_keys = Mediagordoj invalid_password_algorithm = Malvalida pasvorthakeita algoritmo -password_algorithm_helper = Agordas la pasvorthaketigan algoritmon. Algoritmoj havas malsamajn postulojn kaj efikecojn. La algoritmo argon2 sufiĉe sekuras, sed postulas multan memoron kaj eble ne taŭgas por nepotencaj serviloj. +password_algorithm_helper = Agordu la pasvorthaketigan algoritmon. Algoritmoj havas malsamajn postulojn kaj efikecojn. La algoritmo argon2 sufiĉe sekuras, sed postulas multan memoron kaj eble ne taŭgas por nepotencaj serviloj. internal_token_failed = Malsukcesis krei internan ĵetonon: %v smtp_from_invalid = La «Sendu retleterojn kiel» adreso malvalidas allow_only_external_registration = Permesi registriĝon nur per fremdaj servoj @@ -398,7 +403,7 @@ openid_register_title = Krei novan konton email_domain_blacklisted = Vi ne povas registriĝi per via retpoŝtadreso. verify = Konfirmi oauth_signup_submit = Finfari konton -prohibit_login_desc = Via konto estas suspendita kaj ne povas interagi kun la instanco. Bonvolu kontakti vian retejestron por regajni aliron. +prohibit_login_desc = Via konto estas suspendita kaj ne povas interagi kun la instanco. Bonvolu kontakti la retejestron por regajni aliron. openid_connect_desc = La elektita OpenID URI estas nekonata. Ligu ĝin al nova konto ĉi tie. oauth.signin.error = Eraris traktante aprobpeton. Se plu eraros, bonvolu kunparoli la retejestron. invalid_code = Via konfirmkodo malvalidas aŭ eksdatiĝis. @@ -428,7 +433,7 @@ hint_login = Ĉu vi jam havas konton? Salutu nun! hint_register = Ĉu vi bezonas konton? Reĝistriĝi nun. sign_up_button = Reĝistriĝi nun. sign_in_openid = Daŭrigi kun OpenID -back_to_sign_in = Reen en la saluton +back_to_sign_in = Reen en la ensaluton use_onetime_code = Uzi unufojan kodon [mail] @@ -484,13 +489,19 @@ password_change.text_1 = La pasvorto de via konto ĵus ŝanĝiĝis. primary_mail_change.subject = Via ĉefa retpoŝtadreso ŝanĝiĝis totp_disabled.text_1 = La tempobazita unufoja pasvorto (TOTP) en via konto ĵus malaktiviĝis. admin.new_user.text = Bonvolu klaki ĉi tie por konduki ĉi tiun uzanton el la administranta agordilo. -removed_security_key.subject = Sekureca ŝlosilo estas forigita +removed_security_key.subject = Sekurŝlosilo estas forigita removed_security_key.text_1 = La sekureca ŝlosilo "%[1]s" ĵus estas forigita de via konton. totp_enrolled.text_1.has_webauthn = Vi ĵus aktivigis TOTP-n por via konto. Tio volas diri ke por ĉiuj venontaj salutoj al via konto, vi povus uzi TOTP-n kiel 2FA metodo aŭ ajnan sekurecan ŝlosilon. totp_enrolled.text_1.no_webauthn = Vi ĵus aktivigis TOTP-n por via konto. Tio volas diri ke por ĉiuj venontaj salutoj al via konto, vi devos uzi TOTP-n kiel 2FA metodo. removed_security_key.no_2fa = Ne estas aliaj 2FA agorditaj metodoj, tio estas ke ne plus necesas uzi 2FA-n por saluti. totp_disabled.no_2fa = Ne estas plu aliaj 2FA agorditaj metodoj, tio estas ke ne plus necesas uzi 2FA-n por saluti. account_security_caution.text_1 = Se tio estis vi, vi povas sekure ignori ĉi tiun retmesaĝon. +account_security_caution.text_2 = Se ne estis vi, via konto estas kompromitata. Bonvolu kontakti la administrantojn de la retpaĝaro. +issue_assigned.pull = @%[1]s asignis al vi la tirpeton %[2]s en la deponejo %[3]s. +issue.action.review_dismissed = @%[1]s maldungis la lastan revizion de %[2]s por ĉi tiu tirpeto. +repo.transfer.subject_to_you = %s volas reposedigi la deponejon "%s" al vi +totp_enrolled.subject = Vi aktivigis TOTP-n kiel 2FA metodo +issue_assigned.issue = @%[1]s asignis al vi ĉi tiun eraron %[2]s en la deponejo %[3]s. [form] TeamName = Gruponomo @@ -559,6 +570,15 @@ password_not_match = La pasvortoj ne samas. last_org_owner = Vi ne povas forigi la lastan uzanton de la «posendantoj» grupo. Organizaĵo bezonas almenaŭ unu posedanton. still_has_org = "Via konto anas de almenaŭ unu organizaĵoj, forlasu ilin unue." invalid_ssh_key = Ne povis konfirmi vian SSH-ŝlosilon: %s +FullName = Plena nomo +Description = Priskribo +Pronouns = Pronomoj +Biography = Biografio +Website = Retpaĝaro +Location = Kieo +To = Branĉonomo +AccessToken = Atingoĵetono +required_prefix = La enigaĵo devas komenciĝi per "%s" [modal] confirm = Konfirmi @@ -727,6 +747,90 @@ permissions_list = Permesoj: permission_write = Lega kaj Skriba key_content = Enhavo key_signature_gpg_placeholder = Komenciĝas per «-----BEGIN PGP SIGNATURE-----» +storage_overview = Stokada superrigardo +quota = Kvoto +pronouns = Pronomoj +pronouns_unspecified = Nespecifitaj +change_username_redirect_prompt.with_cooldown.one = La malnova uzantnomo disponeblos al ĉiuj post atendoperiodo de %[1]d tago. Vi povas ankoraŭ reakiri la malnovan uzantnomon dum ĉi tiu periodo. +change_username_redirect_prompt.with_cooldown.few = La malnova uzantnomo disponeblos al ĉiuj post atendoperiodo de %[1]d tagoj. Vi povas ankoraŭ reakiri la malnovan uzantnomon dum ĉi tiu periodo. +language.title = Defaŭlta lingvo +language.description = Ĉi tiu lingvo estos konservota en via konto kaj estos uzota kiel defaŭlta post kiam vi ensalutos. +language.localization_project = Helpu nin traduki Forgejo-n en via lingvo! Lerni plu. +hints = Sugestoj +update_hints = Ĝisdatigi la sugestojn +update_hints_success = La sugestoj ĝisdatiĝis. +hidden_comment_types.ref_tooltip = Komentoj, kie ĉi tiu eraro estas referencita de alia eraro/enmeto/… +comment_type_group_reference = Referenco +comment_type_group_milestone = Celo +comment_type_group_assignee = Asignito +comment_type_group_lock = Rigli staton +comment_type_group_review_request = Revizia peto +comment_type_group_issue_ref = Referenco de la eraro +keep_activity_private = Kaŝi la aktivecon de la profilpaĝo +keep_activity_private.description = Via publika aktiveco nur videblos al vi kaj la instancaj administrantoj. +enable_custom_avatar = Uzi propran profilbildon +change_password = Ŝanĝi pasvorton +keep_pronouns_private = Montri pronomojn nur al la aŭtentikigitaj uzantoj +keep_pronouns_private.description = Tio maskos viajn pronomojn kontraŭ neaŭtentikigitaj vizitantoj. +add_new_principal = +gpg_token_required = Vi devas disponigi signaturon por la malsupran ĵetono +gpg_token = Ĵetono +gpg_token_help = Vi povas generi signaturon uzante: +ssh_token_required = Vi devas disponigi signaturon for la malsupran ĵetono +ssh_token = Ĵetono +ssh_token_help = Vi povas generi signaturon uzante: +no_activity = Neniu ĵusa aktiveco +token_state_desc = Ĉi tiu ĵetono estis uzata dum la 7 lastaj tagoj +manage_access_token = Atingoĵetonoj +generate_new_token = Generi novan ĵetonon +token_name = Ĵetono-nomo +generate_token = Generi ĵetonon +generate_token_success = Via nova ĵetono estas generita. Kopiu ĝin nun, ĉar ĝi ne estos montrata ree. +access_token_deletion = Forigi atingoĵetonon +delete_token_success = La ĵetono estas forigita. Aplikaĵoj uzantaj ĝin ne atingos plu vian konton. +regenerate_token = Regeneri +access_token_regeneration = Regeneri atingoĵetonon +at_least_one_permission = Vi devas selekti almenaŭ unu permeson por krei ĵetonon +remove_oauth2_application = Forigi OAuth2-aplikaĵon +remove_oauth2_application_success = La aplikaĵo estas forigita. +create_oauth2_application = Krei novan OAuth2-aplikaĵon +create_oauth2_application_button = Krei aplikaĵon +oauth2_application_name = Aplikaĵonomo +save_application = Konservi +oauth2_client_secret = Klienta sekreto +oauth2_client_id = Klienta ID +oauth2_regenerate_secret = Regeneri sekreton +oauth2_regenerate_secret_hint = Ĉu vi perdis vian sekreton? +oauth2_application_edit = Redakti +authorized_oauth2_applications = Permesitaj OAuth2-aplikaĵoj +create_oauth2_application_success = Vi sukcese kreis novan OAuth2 aplikaĵon. +update_oauth2_application_success = Vi sukcese ĝisdatigis la OAuth2 aplikaĵon. +visibility = Uzanta videbleco +visibility.public = Publika +visibility.public_tooltip = Videbla al ĉiuj +visibility.limited = Limigata +visibility.limited_tooltip = Videbla nur al ensalutitaj uzantoj +visibility.private = Privata +visibility.private_tooltip = Videbla nur al membroj de organizaĵoj, kiujn vi aliĝis +blocked_since = Blokata ekde %s +user_unblock_success = La uzanto sukcese estas malblokita. +user_block_success = La uzanto sukcese estas blokita. +user_block_yourself = Vi ne povas bloki vin mem. +quota.applies_to_user = La sekvantaj kvotaj reguloj aplikiĝas al via konto +quota.applies_to_org = La sekvantaj kvotaj reguloj aplikiĝas al ĉi tiu organizaĵo +quota.rule.exceeded = Superita +quota.sizes.all = Ĉio +quota.sizes.repos.all = Deponejoj +quota.sizes.repos.public = Publikaj deponejoj +quota.sizes.repos.private = Privataj deponejoj +quota.sizes.git.all = Git-enhavo +quota.sizes.git.lfs = Git LFS +quota.sizes.assets.attachments.all = Kunsendaĵoj +quota.sizes.assets.attachments.issues = Kunsendaĵoj de eraro +quota.sizes.assets.attachments.releases = Kunsendaĵoj de eldono +quota.sizes.assets.artifacts = Artfaritaĵoj +quota.sizes.assets.packages.all = Pakaĵoj +quota.sizes.wiki = Vikio [user] form.name_reserved = La uzantonomo «%s» estas protektita. @@ -754,6 +858,21 @@ followers_few = %d abonantoj block_user.detail_2 = La uzanto ne povos interagi viajn deponejojn, erarojn, kaj komentojn. block_user = Bloki uzanton change_avatar = Ŝanĝi vian profilbildon… +activity = Publika aktiveco +followers.title.one = Sekvanto +followers.title.few = Sekvantoj +following.title.one = Sekvata +following.title.few = Sekvataj +followers_one = %d sekvanto +following_one = %d sekvataj +overview = Superrigardo +disabled_public_activity = Ĉi tiu uzanto malaktivigis la publikan videblecon de sia aktiveco. +public_activity.visibility_hint.self_public = Via aktiveco videblas al ĉiuj, escepte de interagoj en privataj spacoj. Agordi. +public_activity.visibility_hint.admin_public = Ĉi tiu aktiveco videblas al ĉiuj, sed kiel administranto vi povas ankaŭ vidi interagojn en privataj spacoj. +public_activity.visibility_hint.self_private = Via aktiveco nur videblas al vi kaj la instancaj administrantoj. Agordi. +public_activity.visibility_hint.admin_private = Ĉi tiu aktiveco videblas al vi ĉar vi estas administranto, sed la uzanto volas ke ĝi restu privata. +public_activity.visibility_hint.self_private_profile = Via aktiveco nur videblas al vi kaj la instancaj administrantoj, ĉar via profilo estas privata. Agordi. +form.name_pattern_not_allowed = La ŝablono "%s" ne estas permesata en uzantnomo. [repo] @@ -802,6 +921,7 @@ activity.active_prs_count_n = %d aktivaj tirpetoj settings.archive.text = Arĥivigi la deponejon igus ĝin sole legebla. Ĝi kaŝiĝos de la labortablo. Neniu (ne eĉ vi!) povos fari enmetojn, raportojn, kaj tirpetojn. migrate_items_releases = Eldonoj commits.commits = Enmetoj +rss.must_be_on_branch = Vi devas esti en branĉo por havi RSS-fluon. [org] code = Fontkodo @@ -837,4 +957,27 @@ regexp_tooltip = Interpretas la serĉoterminoj kiel regulesprimo fuzzy = Svaga branch_kind = Serĉi disbranĉigojn… runner_kind = Serĉi rulantojn… -pull_kind = Serĉi tirpetojn… \ No newline at end of file +pull_kind = Serĉi tirpetojn… + +[markup] +filepreview.truncated = La superrigardo estas mallongigita +filepreview.line = Linio %[1]d en %[2]s +filepreview.lines = Linioj %[1]d ĝis %[2]d en %[3]s + +[actions] +variables.creation.success = La variablo "%s" estas aldonita. +variables.update.failed = Ne eblas redakti la variablon. +variables.update.success = La variablo estas redaktita. + +[projects] +deleted.display_name = Forigita projekto +type-1.display_name = Persona projekto +type-2.display_name = Deponejoprojekto + +[git.filemode] +changed_filemode = %[1]s → %[2]s +directory = Dosierujo +normal_file = Normala dosiero +executable_file = Rulebla dosiero +symbolic_link = Simbola ligilo +submodule = Submodulo \ No newline at end of file diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index 82ace32eb8..2558a7e2b2 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -2701,10 +2701,8 @@ release.hide_archive_links = Ocultar archivos generados automaticamente settings.mirror_settings.pushed_repository = Repositorio pusheado settings.rename_branch_failed_protected = No se puede renombrar la rama %a porque es un rama protegida. release.invalid_external_url = URL externa inválida: %s -release.download_count_one = %s descarga diff.git-notes.add = Añadir nota diff.git-notes.remove-header = Eliminar nota -release.download_count_few = %s descargas diff.git-notes.remove-body = Esta nota será eliminada. editor.add_tmpl.filename = nombre de fichero issues.reaction.add = Añadir reacción diff --git a/options/locale/locale_eu.ini b/options/locale/locale_eu.ini index 7df55f2761..a2dc60dfe6 100644 --- a/options/locale/locale_eu.ini +++ b/options/locale/locale_eu.ini @@ -1 +1,2 @@ [common] +home = Etxea diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 6ee223a4cc..cd66ac83d5 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -40,7 +40,7 @@ webauthn_use_twofa=Käytä kaksivaihesta todennusta puhelimestasi webauthn_error=Turva-avainta ei voitu lukea. webauthn_unsupported_browser=Selaimesi ei tällä hetkellä tue WebAuthnia. webauthn_error_unknown=Tuntematon virhe. Yritä uudelleen. -webauthn_error_insecure=WebAuthn tukee vain suojattuja yhteyksiä. Testatessa HTTP-yhteydellä voit käyttää osoitetta "localhost" tai "127.0.0.1" +webauthn_error_insecure=WebAuthn tukee vain turvallisia yhteyksiä. Testaamista varten HTTP-välityksellä voit käyttää alkuperää "localhost" tai "127.0.0.1" webauthn_error_unable_to_process=Palvelin ei pystynyt käsittelemään pyyntöä. webauthn_error_duplicated=Turva-avainta ei ole sallittu tässä pyynnössä. Varmista, ettei avainta ole jo rekisteröity. webauthn_error_empty=Sinun täytyy asettaa nimi tälle avaimelle. @@ -848,7 +848,7 @@ twofa_enroll=Ota kaksivaiheinen todennus käyttöön twofa_disabled=Kaksivaiheinen todennus on otettu pois käytöstä. scan_this_image=Skannaa tämä kuva todennussovelluksellasi: or_enter_secret=Tai kirjoita salainen avain: %s -twofa_enrolled=Tiliisi on otettu käyttöön kaksivaiheinen todennus. Ota kertakäyttöinen palautusavain (%s) talteen turvalliseen paikkaan, sillä se näytetään vain kerran! +twofa_enrolled=Tilisi on otettu mukaan onnistuneesti. Säilytä kertakäyttöistä palautusavainta (%s) turvallisessa paikassa, sillä sitä ei enää näytetä. webauthn_nickname=Nimimerkki @@ -1012,6 +1012,7 @@ ssh_principal_deletion_desc = SSH-varmenneprinsipaalin poistaminen kumoaa sen p ssh_principal_deletion_success = Prinsipaali on poistettu. principal_state_desc = Tätä prinsipaalia on käytetty viimeisen seitsemän päivän aikana regenerate_token_success = Poletti on luotu uudelleen. Sovellukset, jotka käyttivät polettia, eivät enää pääse tilillesi. Kyseiset sovellukset tulee päivittää uudella poletilla. +quota.sizes.assets.all = Resurssit [repo] owner=Omistaja @@ -1072,7 +1073,7 @@ migrate_items_pullrequests=Vetopyynnöt migrate_items_releases=Julkaisut migrate_repo=Suorita tietovaraston migraatio migrate.clone_address=Migraatio/kloonaus URL-osoitteesta -migrate.github_token_desc=Voit laittaa yhden tai useamman pääsypoletin pilkulla erotellen tähän nopeuttaaksesi migraatiota GitHubin rajapinnan tahtirajojen takia. VAROITUS: Tämän ominaisuuden väärinkäyttö voi rikkoa palveluntarjoajan ehtoja ja johtaa tilin estämiseen. +migrate.github_token_desc=Voit lisätä tähän yhden tai useamman tunnuksen pilkuilla erotettuna nopeuttaaksesi migraatiota kiertämällä GitHub API:n nopeusrajoituksen. Varoitus: Tämän ominaisuuden väärinkäyttö voi rikkoa palveluntarjoajan käytäntöä ja johtaa tiliesi sulkemiseen. migrate.permission_denied=Paikallisten tietovarastojen tuominen ei ole sallittua. migrate.failed=Migraatio epäonnistui: %v migrate.migrate_items_options=Lisäkohteiden migraatiota varten vaaditaan pääsypoletti @@ -1081,7 +1082,7 @@ migrate.migrating_failed=Migraatio lähteestä %s epäonnistui. migrate.migrating_git=Suoritetaan Git-datan migraatiota mirror_from=peili kohteelle -forked_from=forkattu lähteestä +forked_from=forkattu tietovarastosta unwatch=Lopeta tarkkailu watch=Tarkkaile unstar=Poista tähti @@ -1117,7 +1118,7 @@ file_permalink=Pysyväislinkki video_not_supported_in_browser=Selaimesi ei tue HTML5:n video-tagia. audio_not_supported_in_browser=Selaimesi ei tue HTML5:n audio-tagia. -blame=Blame +blame=Syyllistynyt download_file=Lataa tiedosto normal_view=Normaali näkymä line=rivi @@ -1180,7 +1181,7 @@ projects.open=Avaa projects.close=Sulje issues.desc=Ongelmien, tehtävien ja merkkipaalujen hallinta. -issues.filter_assignees=Suodata käyttäjiä +issues.filter_assignees=Suodata vastuuhenkilö issues.filter_milestones=Suodata merkkipaalu issues.new=Uusi ongelma issues.new.labels=Nimilaput @@ -1215,7 +1216,7 @@ issues.self_assign_at=`itse otti tämän käsittelyyn %s` issues.change_title_at=`muutti otsikon %s otsikoksi %s %s` issues.delete_branch_at=`poisti haaran %s %s` issues.filter_label=Nimilappu -issues.filter_label_exclude=`Käytä alt + napsautus/rivinvaihto poissulkeaksesi nimilappuja` +issues.filter_label_exclude=Käytä Alt + Click-näppäinyhdistelmää nimiöiden poissulkemiseksi issues.filter_label_no_select=Kaikki nimilaput issues.filter_milestone=Merkkipaalu issues.filter_project=Projekti @@ -1264,9 +1265,9 @@ issues.close_comment_issue=Kommentoi ja sulje issues.reopen_issue=Avaa uudelleen issues.reopen_comment_issue=Kommentoi ja avaa uudelleen issues.create_comment=Kommentoi -issues.closed_at=`sulki tämän ongelman %s` -issues.reopened_at=`uudelleenavasi tämän ongelman %s` -issues.commit_ref_at=`viittasi tähän ongelmaan kommitissa %s` +issues.closed_at=`sulki tämän tukipyynnön %s` +issues.reopened_at=`avasi tämän tukipyynnön uudelleen %s` +issues.commit_ref_at=`viittasi tähän tukipyyntöön sitoumuksesta %s` issues.author=Tekijä issues.role.owner=Omistaja issues.role.member=Jäsen @@ -1543,7 +1544,7 @@ settings.web_hook_name_larksuite_only =Lark Suite settings.web_hook_name_packagist=Packagist settings.deploy_keys=Toimitusavaimet settings.add_deploy_key=Lisää toimitusavain -settings.deploy_key_desc=Toimitusavaimilla on pelkkä lukuoikeus tietovarastoon. +settings.deploy_key_desc=Käyttöönottoavaimilla voi olla vain luku- tai luku-kirjoitusoikeudet tietovarastoon. settings.is_writable_info=Salli tämän toimitusavaimen työntää tietovarastoon. settings.no_deploy_keys=Toimitusavaimia ei ole käytössä vielä. settings.title=Otsikko @@ -1582,7 +1583,7 @@ settings.archive.header=Arkistoi tämä tietovarasto settings.archive.tagsettings_unavailable=Tagi-asetukset eivät ole käytettävissä arkistoiduissa tietovarastoissa. settings.lfs=LFS settings.lfs_filelist=Tähän tietovarastoon tallennetut LFS-tiedostot -settings.lfs_no_lfs_files=LFS-tiedostoja ei ole tallennettu tähän tietovarastoon. +settings.lfs_no_lfs_files=Tähän tietovarastoon ei ole tallennettu LFS-tiedostoja settings.lfs_findcommits=Etsi kommitteja settings.lfs_lfs_file_no_commits=Tälle LFS-tiedostolle ei löytynyt kommitteja settings.lfs_noattribute=Tällä polulla ei ole lukittavaa attribuuttia oletushaarassa @@ -1797,7 +1798,6 @@ wiki.cancel = Peruuta issues.dependency.remove_header = Poista riippuvuus issues.dependency.issue_remove_text = Riippuvuus poistetaan tästä ongelmasta. Jatketaanko? issues.dependency.pr_remove_text = Riippuvuus poistetaan tästä vetopyynnöstä. Jatketaanko? -release.download_count_few = %s latausta diff.data_not_available = Diff-sisältö ei ole saatavilla diff.image.side_by_side = Rinnakkain release.ahead.target = haaraan %s tämän julkaisun jälkeen @@ -1966,7 +1966,6 @@ branch.create_new_branch = Luo haara haarasta: settings.archive.error_ismirror = Et voi arkistoida peilattua tietovarastoa. branch.warning_rename_default_branch = Olet nimeämässä oletushaaran uudelleen. settings.web_hook_name_msteams = Microsoft Teams -release.download_count_one = %s lataus settings.update_hook_success = Webkoukku on päivitetty. diff.file_before = Ennen diff.file_after = Jälkeen @@ -2144,7 +2143,7 @@ issues.add_label = lisäsi nimilapun %s %s issues.due_date_added = lisäsi eräpäivän %s %s issues.review.add_review_request = pyysi katselmointia käyttäjältä %[1]s %[2]s issues.ref_pull_from = `viittasi tähän vetopyyntöön %[3]s %[1]s` -pulls.commit_ref_at = `viittasi tähän vetopyyntöön kommitista %s` +pulls.commit_ref_at = `viittasi tähän vetopyyntöön sitoumuksesta %s` issues.review.comment = katselmoi %s issues.add_labels = lisäsi nimilaput %s %s issues.review.add_review_requests = pyysi katselmointeja käyttäjiltä %[1]s %[2]s @@ -2325,9 +2324,9 @@ wiki.page_name_desc = Kirjoita tämän wikisivun nimi. Joitain erikoisnimiä ova pulls.blocked_by_changed_protected_files_1 = Tämä vetopyyntö sisältää suojatun tiedoston ja on siksi estetty: pulls.status_checks_warning = Jotkin tarkistukset raportoivat varoituksia pulls.status_checks_error = Jotkin tarkistukset raportoivat virheitä -pulls.reopened_at = `avasi uudelleen tämän vetopyynnön %s` +pulls.reopened_at = `avasi tämän vetopyynnön uudelleen %s` pulls.auto_merge_when_succeed = Yhdistä automaatisesti kun kaikki tarkistukset onnistuvat -signing.wont_sign.error = Tapahtui virhe tarkistaessa voiko kommitin allekirjoittaa. +signing.wont_sign.error = Tapahtui virhe tarkistettaessa, voiko sitoumus allekirjoittaa. signing.wont_sign.twofa = Sinulla tulee olla kaksivaiheinen todennus käytössä, jotta kommitit voi allekirjoittaa. pulls.data_broken = Tämä vetopyyntö on rikki johtuen puuttuvasta forkkitiedosta. pulls.files_conflicted = Tämä vetopyyntö sisältää muutoksia, jotka ovat ristiriidassa kohdehaaran kanssa. @@ -3047,7 +3046,7 @@ auths.attribute_username_placeholder = Jätä tyhjäksi käyttääksesi Forgejo: auths.oauth2_authURL = Valtuutuksen URL-osoite auths.new_success = Todennus "%s" on lisätty. users.still_own_repo = Tämä käyttäjä omistaa yhden tai useamman tietovaraston. Poista tai siirrä nämä tietovarastot ensin. -dashboard.cleanup_hook_task_table = Siivoa hook_task-taulu +dashboard.cleanup_hook_task_table = Siivoa koukku -_tehtävätaulukko dashboard.delete_old_actions = Poista kaikki vanhat aktiviteetit tietokannasta auths.attribute_mail = Sähköpostiosoitteen attribuutti auths.attribute_ssh_public_key = Julkisen SSH-avaimen attribuutti @@ -3115,7 +3114,7 @@ dashboard.resync_all_sshprincipals = Päivitä ".ssh/authorized_principals"-tied create_repo=loi tietovaraston %s rename_repo=asetti tietovaraston %[1]s uudeksi nimeksi %[3]s transfer_repo=siirsi tietovaraston %s käyttäjälle %s -push_tag=työnsi tagin %[3]s kohteeseen %[4]s +push_tag=työnsi tagin %[3]s tietovarastoon %[4]s delete_tag=poisti tagin %[2]s kohteesta %[3]s compare_commits_general=Vertaa kommitteja create_branch=loi haaran %[3]s tietovarastossa %[4]s @@ -3138,6 +3137,7 @@ watched_repo = aloitti tietovaraston %[2]s tarkkailun approve_pull_request = `hyväksyi %[3]s#%[2]s` starred_repo = lisäsi tähden tietovarastolle %[2]s reject_pull_request = `ehdotti muutoksia kohteeseen %[3]s#%[2]s` +publish_release = `julkaisi %[4]s tietovarastossa %[3]s` [tool] now=nyt @@ -3229,7 +3229,7 @@ helm.install = Asenna paketti komennolla: owner.settings.chef.keypair = Luo avainpari settings.delete.error = Paketin poistaminen epäonnistui. requirements = Vaatimukset -published_by_in = Julkaistu %[1]s, julkaisija %[3]s projektissa %[5]s +published_by_in = Julkaistu %[1]s, julkaisija %[3]s tietovarastossa %[5]s pypi.requires = Vaatii Pythonin alpine.install = Asenna paketti seuraavalla komennolla: debian.repository.components = Komponentit @@ -3351,6 +3351,7 @@ debian.repository = Tietovaraston tiedot conda.registry = Määritä tämä rekisteri Conda-tietovarastoksi .condarc-tiedostossa: container.labels = Nimilaput settings.link.description = Jos linkität paketin tietovarastoon, paketti listataan tietovaraston pakettilistalla. +assets = Resurssit [secrets] creation.failed = Salaisuuden lisääminen epäonnistui. @@ -3519,4 +3520,4 @@ wiki.write = Kirjoita: Luo, päivitä ja poista integroidun wikin sivuja. filepreview.truncated = Esikatselu on typistetty [translation_meta] -test = This is a test string. It is not displayed in Forgejo UI but is used for testing purposes. Feel free to enter "ok" to save time (or a fun fact of your choice) to hit that sweet 100% completion mark :) :) :) \ No newline at end of file +test = Tämä on testimerkkijono. Sitä ei näytetä Forgejo-käyttöliittymässä, mutta sitä käytetään testaustarkoituksiin. Voit vapaasti kirjoittaa "selvä" säästääksesi aikaa (tai käyttää hauskaa faktaa) ja saavuttaaksesi sen makean 100 %:n valmistumisrajan :) \ No newline at end of file diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index 4f2b9db677..8f61ead1f9 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -2528,8 +2528,6 @@ release.deletion_success = Binura na ang release. release.deletion_tag_success = Nabura na ang tag na ito. release.tag_name_already_exist = Umiiral na ang release na may pangalan ng tag na ito. release.tag_already_exist = Umiiral na ang pangalan ng tag na ito. -release.download_count_one = %s download -release.download_count_few = %s mga download release.tags_for = Mga tag para sa %s release.system_generated = Awtomatikong na-generate ang attachment na ito. release.type_attachment = Attachment diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 0c2f035d3e..bc6d086162 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -2662,8 +2662,6 @@ size_format = %[1]s : %[2]s, %[3]s : %[4]s ; %[3]s : %[4]s settings.sourcehut_builds.visibility = Visibilité du job settings.sourcehut_builds.secrets = Secrets settings.sourcehut_builds.manifest_path = Chemin du manifest de build -release.download_count_one = %s téléchargement -release.download_count_few = %s téléchargements release.system_generated = Cet attachement a été généré automatiquement. settings.enforce_on_admins_desc = Les administrateurs du dépôt ne peuvent pas passer outre cette règle. settings.web_hook_name_sourcehut_builds = Builds SourceHut diff --git a/options/locale/locale_hi.ini b/options/locale/locale_hi.ini index 37115162e7..909254103b 100644 --- a/options/locale/locale_hi.ini +++ b/options/locale/locale_hi.ini @@ -224,4 +224,99 @@ confirm_password = पासवर्ड पक्का करें admin_email = ईमेल एड्रेस config_location_hint = ये सञ्चालन के तरीके यहाँ सेव होंगे : install_btn_confirm = इनस्टॉल फॉरगेजो -test_git_failed = git कमांड टेस्ट नहीं हुई: %v \ No newline at end of file +test_git_failed = git कमांड टेस्ट नहीं हुई: %v +sqlite3_not_available = इस फॉरगेजो के वर्शन में SQLite३ नहीं है। कृपया डाउनलोड करें बाइनरी वर्शन यहाँ से %s (“gobuild” वर्शन नहीं करें)। +invalid_db_setting = ये डेटाबेस सेटिंग्स मान्य नहीं हैं %v +invalid_db_table = डेटाबेस टेबल “%s” मान्य नहीं: %v +invalid_repo_path = इस रिपॉजिटरी की मूल पथ मान्य नहीं है: %v +invalid_app_data_path = एप्प की डाटा पथ अमान्य है: %v +run_user_not_match = “यूजर को ऐसे चलाएं” उसरनाम अभी का उसरनाम नहीं है: %s -> %s +internal_token_failed = अंदरूनी टोकन बना नहीं पाए: %v +secret_key_failed = गुप्त चाभी बना नहीं पाए: %v +save_config_failed = संरूपण को सेव नहीं कर पाए: %v +enable_update_checker_helper_forgejo = ये समय-समय पर चेक करेगा फॉरगेजो वर्शन नया है की नहीं TXT DNS रिकॉर्ड से यहाँ release.forgejo.org। +invalid_admin_setting = प्रशासक अकाउंट सेटिंग अमान्य है: %v +invalid_log_root_path = लॉग का रास्ता अमान्य है: %v +no_reply_address = गुप्त ईमेल डोमेन +no_reply_address_helper = डोमेन का नाम उसेर्स के गुप्त ईमेल पते से हैं। जैसे की, जब यूजर “जोई” लॉग करेगा Git पे “जोई@noreply.example.org” अगर गुप्त ईमेल पता पड़ा है “noreply.example.org”। +password_algorithm = पासवर्ड का हैश कलन विधि (algorithm) +invalid_password_algorithm = अमान्य पासवर्ड का हैश कलन विधि (algorithm) +password_algorithm_helper = पासवर्ड हैश अल्गोरिथम सेट करें। अल्गोरिथ्म्स की अलग-अलग ज़रूरतें और मज़बूतियाँ हैं। आर्गन2 अल्गोरिथम मज़बूत है पर मेमोरी ज़्यादा लेता है और छोटे सिस्टम्स के लिए सही नहीं होता। +enable_update_checker = अपडेट चेकर चालू करें +env_config_keys = पर्यावरण संरूपण +env_config_keys_prompt = पर्यावरण वेरिएबल्स को संरूपण फाइल पर भी लागू किया जायेगा: + +[home] +uname_holder = उसरनाम या ईमेल एड्रेस +switch_dashboard_context = डैशबोर्ड का सन्दर्भ बदलें +my_repos = रेपोसिटोरिएस +my_orgs = संस्थाएं +view_home = व्यू: %s +filter = बाकी फिल्टर्स +filter_by_team_repositories = फ़िल्टर करें टीम रेपोसिट्रीज़ से +feed_of = फीड इसकी "%s" +show_archived = संग्रहीत +show_both_archived_unarchived = संग्रहीत और असंग्रहीत देखिए +show_only_archived = सिर्फ संग्रहीत देखिए +show_only_unarchived = सिर्फ असंग्रहीत देखिए +show_private = निजी +show_both_private_public = निजी और सार्वजनिक देखिए +show_only_private = सिर्फ निजी देखिए +show_only_public = सिर्फ सार्वजनिक देखिए +issues.in_your_repos = आपकी रेपोसिटोरिस में + +[explore] +repos = रेपोसिटोरिस +users = उसेर्स +stars_one = %d सितारा +stars_few = %d सितारे +forks_one = %d फोर्क +forks_few = %d फोर्कस +organizations = संस्थाएं +go_to = जाएं इधर +code = कोड +code_last_indexed_at = आखरी संस्थापित %s +relevant_repositories_tooltip = रेपोसिटोरिस जो की फोर्क्स या जिनका शीर्षक नहीं है, आइकॉन नहीं और विश्लेषण नहीं गुप्त हैं। +relevant_repositories = सिर्फ इस काम की रेपोस्टिरिस दिखाई जा रहीं हैं. बिना फ़िल्टर के रिजल्ट दिखाएं। + +[auth] +create_new_account = अकाउंट रजिस्टर करें +disable_register_prompt = रजिस्ट्रेशन खुला नहीं। कृपया साइट प्रशासक से बात करें। +disable_register_mail = ईमेल से रजिस्ट्रेशन पक्का करना बंद हैं अभी। +manual_activation_only = अपने साइट प्रशासक बात करें एक्टिवेशन पूरा करने के लिए। +remember_me = इस डिवाइस को याद रखें +forgot_password_title = पासवर्ड भूल गए +forgot_password = पासवर्ड भूल गए? +hint_login = पहले से अकाउंट है? अभी सिग्न इन करें! +hint_register = अकाउंट चाहिए? रजिस्टर करें +sign_up_button = अभी रजिस्टर करें। +sign_up_successful = अकाउंट बन गया है। स्वागत! +back_to_sign_in = sign in में फिर से जाएं +sign_in_openid = OpenID के साथ आगे बढ़ें + +[mail] +link_not_working_do_paste = क्या कड़ी चल नहीं पाई? उसे कॉपी करके URL बार में जोड़ें। +hi_user_x = नमस्ते %s, +activate_account = कृपया अपना खाता चालू करें +activate_account.text_1 = नमस्ते %[1]s, संपादित करने के लिए शुक्रिया यहां %[2]s! +activate_account.text_2 = कृपया यहां की कड़ी को क्लिक करें अपने अकाउंट को चालू करने के लिए %s: +activate_email = अपना ईमेल एड्रेस पुख्ता करें +activate_email.text = कृपया इस कड़ी को क्लिक करें अपना अकाउंट पुख्ता करने के लिए %s: +admin.new_user.subject = नया यूजर %s अभी sign up हुआ +admin.new_user.user_info = यूजर की जानकारी +admin.new_user.text = कृपया क्लिक करें यहाँ अपने यूजर को प्रशासक पैनल से चलाने के लिए। +register_notify = स्वागत है %s +register_notify.text_1 = ये आपका रजिस्टर्ड ईमेल पुख्ता करने के लिए है %s! +register_notify.text_2 = आप अपने अकाउंट में हस्ताक्षर कर सकते हैं इस उसर-नाम के साथ: %s +register_notify.text_3 = अगर किसी और ने आपका अकाउंट बनाया है, तो आपको चाहिए पासवर्ड संरक्षित करें पहले। +reset_password = अपना अकाउंट निकाल पाएं +reset_password.text = अगर ये आप थे, कृपया इस कड़ी को क्लिक करें अपने अकाउंट को फिर से चालू करने को %s: +password_change.subject = आपका पासवर्ड बदला गया +password_change.text_1 = आपके अकाउंट का पासवर्ड बदला गया है। +primary_mail_change.subject = आपका प्राथमिक ईमेल बदला गया है +primary_mail_change.text_1 = आपका प्राथमिक ईमेल बदला गया है इससे %[1]s. यानी इस ईमेल एड्रेस से आप ईमेल अधिसूचना प्राप्त नहीं कर पाएंगे। +totp_disabled.subject = टीओटीपी रोक दिया गया +totp_disabled.text_1 = समय निर्धारित एक बार के पासवर्ड (टीओटीपी) आपके अकाउंट पर रोक दिया गया। +totp_disabled.no_2fa = और कोई 2FA के तरीके संचालित नहीं हैं, यानी आपके अकाउंट पर 2FA से लॉगिन की ज़रुरत नहीं होगी। +removed_security_key.subject = सुरक्षक चाभी हटाई गई +removed_security_key.text_1 = सुरक्षक चाभी "%[1]s" अभी-अभी आपके अकाउंट से हटाई गई। \ No newline at end of file diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 8bda72c011..7874f68a8c 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -2664,8 +2664,6 @@ settings.sourcehut_builds.secrets_helper = Fornisci l'accesso ai segreti della b settings.add_webhook.invalid_path = Il percorso non deve contenere dei componenti quali ".", "..", o una stringa vuota. Non può iniziare o finire con uno slash. n_commit_one = %s commit settings.enforce_on_admins = Imponi questa regola agli amministratori del repository -release.download_count_one = %s download -release.download_count_few = %s downloads release.system_generated = Questo allegato è stato generato automaticamente. pulls.ready_for_review = Pronto alla revisione? editor.commit_id_not_matching = L'ID del commit non combacia con quello del commit che stavi modificando. Conferma le tue modifiche su un nuovo ramo, poi fondilo col ramo desiderato. diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 5481802f79..a64274c2d6 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -2603,8 +2603,6 @@ activity.navbar.code_frequency = コードの更新頻度 settings.wiki_branch_rename_failure = リポジトリ wiki のブランチ名を正規化できませんでした。 settings.ignore_stale_approvals = 古い承認を無視する open_with_editor = %s で開く -release.download_count_one = %s のダウンロード -release.download_count_few = %s のダウンロード release.system_generated = この添付ファイルは自動的に生成されます。 settings.archive.mirrors_unavailable = リポジトリがアーカイブされている場合、ミラーは利用できません。 settings.rename_branch_failed_protected = 保護されたブランチのため、ブランチ %s の名前を変更できません。 diff --git a/options/locale/locale_kab.ini b/options/locale/locale_kab.ini index fb815015bd..1425ad361f 100644 --- a/options/locale/locale_kab.ini +++ b/options/locale/locale_kab.ini @@ -43,7 +43,7 @@ captcha = CAPČA passcode = Angal n wadduf settings = Iɣewwaren your_profile = Amaɣnu -your_settings = Iɣewwaren +your_settings = Tawila activities = Irmad ok = Ih view = Wali @@ -55,6 +55,12 @@ never = Weṛǧin concept_system_global = Amatu concept_user_organization = Tuddsa filter = Imsizdeg +your_starred = S yitran +issues = Uguren +preview = Taskant +loading = Aɛebbi… +new_repo.title = Akufi amaynut +new_repo.link = Akufi amaynut [user] code = Tangalt @@ -68,9 +74,12 @@ followers.title.few = Imeḍfaṛen following.title.one = Yeṭṭafaṛ following.title.few = Yeṭṭafaṛ unfollow = Ur ṭṭafar ara +overview = Tamuɣli s umata [org] code = Tanglat +team_desc = Aglam +org_desc = Aglam [repo] release.source_code = Tangalt taɣbalut @@ -124,6 +133,82 @@ projects.description_placeholder = Aglam projects.title = Azwel projects.type.none = Ula yiwen projects.template.desc = Tamudemt +mirror_sync = yemtawa +migrate_items_issues = Uguren +star = Rnu-yas itri +branches = Tiṣeḍwa +issues = Uguren +projects.column.edit_title = Isem +projects.column.new_title = Isem +projects.column.color = Ini +projects.open = Ldi +projects.close = Mdel +issues.new.labels = Tibzimin +issues.new.projects = Isenfaren +issues.choose.open_external_link = Ldi +issues.choose.blank = Amezwer +issues.new_label_desc_placeholder = Aglam +issues.filter_label = Tabzimt +issues.filter_project = Asenfar +issues.filter_poster = Ameskar +issues.filter_type = Tawsit +issues.filter_sort = Semyizwer +issues.action_open = Ldi +issues.action_close = Mdel +issues.action_label = Tabzimt +issues.previous = Uzwir +issues.next = Uḍfir +issues.all_title = Akk +issues.draft_title = Arewway +issues.context.edit = Ẓreg +issues.context.delete = Kkes +issues.reopen_issue = Ales tulya +issues.create_comment = Awennit +issues.author = Ameskar +issues.role.owner = Bab-is +issues.role.member = Aɛeggal +issues.role.contributor = Amɛiwen +issues.edit = Ẓreg +issues.cancel = Semmet +issues.save = Sekles +issues.label_edit = Ẓreg +issues.label_delete = Kkes +issues.label.filter_sort.alphabetically = S ugemmay +issues.delete = Kkes +issues.add_time_cancel = Semmet +issues.add_time_hours = Isragen +issues.due_date_form = yyyy-mm-dd +issues.due_date_form_edit = Ẓreg +issues.dependency.cancel = Semmet +issues.content_history.options = Tixtiṛiyin +pulls.made_using_agit = AGit +milestones.open = Ldi +milestones.close = Mdel +milestones.title = Azwel +milestones.desc = Aglam +milestones.clear = Sfeḍ +milestones.cancel = Semmet +milestones.filter_sort.name = Isem +wiki = Awiki +wiki.page = Asebter +wiki.new_page = Asebter +wiki.cancel = Semmet +wiki.edit_page_button = Ẓreg +wiki.pages = Isebtar +activity = Armud +activity.navbar.contributors = Iwiziwen +activity.overview = Tamuɣli s umata +issues.label_description = Aglam +no_desc = Ur yesɛi ara aglam +projects.description = Aglam (d afrayan) +issues.label_title = Isem +issues.label_color = Ini +settings.slack_color = Ini +repo_name = Isem n ukufi +repo_size = Tiddi n ukufi +create_repo = Snulfu-d akufi +settings.confirm_delete = Kkes akufi +settings.delete = Kkes akufi-a [install] admin_password = Awal n uɛeddi @@ -134,6 +219,7 @@ user = Isem n useqdac db_schema = Azenziɣ ssl_mode = SSL path = Abrid +db_name = Isem n taffa n yisefka [admin] notices.type_1 = Akufi @@ -141,6 +227,15 @@ packages.repository = Akufi config.db_user = Isem n useqdac users.name = Isem n useqdac emails.filter_sort.name = Isem n useqdac +notices.desc = Aglam +orgs.name = Isem +repos.name = Isem +packages.name = Isem +auths.name = Isem +config.db_name = Isem +config.mailer_name = Isem +monitor.name = Isem +monitor.queue.name = Isem [search] code_kind = Nadi tangalt… @@ -159,11 +254,14 @@ table_modal.placeholder.content = Agbur table_modal.label.columns = Tigejda link_modal.url = Url link_modal.description = Aglam +table_modal.placeholder.header = Aqeṛṛu +table_modal.label.rows = Izirigen [explore] code = Tanglat repos = Ikufan users = Iseqdacen +organizations = Tuddsiwin [form] UserName = Isem n useqdac @@ -173,6 +271,8 @@ Website = Asmel web Content = Agbur Biography = Tameddurt Location = Asun +RepoName = Isem n ukufi +TeamName = Isem n terbaɛt [aria] footer.links = Iseɣwan @@ -187,6 +287,7 @@ lightweight = D afessas [home] my_repos = Ikufan show_private = Uslig +my_orgs = Tuddsiwin [auth] openid_connect_submit = Tuqqna @@ -234,4 +335,27 @@ quota.sizes.all = Akk quota.sizes.repos.all = Ikufan quota.sizes.assets.attachments.all = Imeddayen quota.sizes.assets.packages.all = Ikemmusen -quota.sizes.wiki = Wiki \ No newline at end of file +quota.sizes.wiki = Wiki +appearance = Udem +avatar = Avataṛ +orgs = Tuddsiwin +organization = Tuddsiwin +quota = Amur +location = Asun +comment_type_group_reference = Tamsisɣelt +visibility.private = Uslig +quota.rule.no_limit = War talast +quota.sizes.assets.all = Igburen + +[packages] +arch.version.description = Aglam +alpine.repository.branches = Tiṣeḍwa +alpine.repository.repositories = Ikufan +settings.link.select = Fren akufi + +[actions] +runners.description = Aglam +runners.name = Isem + +[projects] +type-2.display_name = Asenfar n ukufi \ No newline at end of file diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 12e987863a..9632ddffe6 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1921,7 +1921,7 @@ milestones.filter_sort.least_issues=Vismazāk pieteikumu signing.will_sign=Šis iesūtījums tiks parakstīts ar atslēgu "%s". signing.wont_sign.error=Atgadījās kļūda pārbaudot, vai iesūtījums var tikt parakstīts. -signing.wont_sign.nokey=Nav pieejamas atslēgas, ar ko parakstīt šo iesūtījumu. +signing.wont_sign.nokey=Šajā serverī nav 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. @@ -2360,7 +2360,7 @@ settings.protect_protected_file_patterns=Aizsargāto datņu paraugs (vairākus a settings.protect_protected_file_patterns_desc=Aizsargātās datnes nav ļauts tiešā veidā mainīt, pat ja lietotājam šajā zarā ir tiesības pievienot, labot vai izdzēst datnes. Vairākus paraugus var atdalīt ar semikolu (";"). Paraugu pieraksts ir skatāms %[2]s dokumentācijā. Piemēri: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Neaizsargāto datņu paraugs (vairākus atdala ar semikolu ";") settings.protect_unprotected_file_patterns_desc=Neaizsargātās datnes, kuras ir ļauts izmainīt tiešā veidā, apejot aizgādāšanas ierobežojumu, ja lietotājam ir rakstīšanas piekļuve. Vairāki paraugi ir atdalāmi ar semikolu (";"). Paraugu pierakstu skatīt %[2]s dokumentācijā. Piemēri: .drone.yml, /docs/**/*.txt. -settings.update_protect_branch_success=Zara aizsargāšanas kārtula "%s" tika atjaunināta. +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 @@ -2655,7 +2655,6 @@ 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 @@ -2667,7 +2666,6 @@ 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 a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini index 362d6a3cd6..fea603b0be 100644 --- a/options/locale/locale_nds.ini +++ b/options/locale/locale_nds.ini @@ -842,7 +842,7 @@ email_deletion_desc = Deese E-Mail-Adress un daarmit verbunnen Informatioon word 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 = De E-Mail-Adress word vun de Profil verbargen un is nich de Normaalweert för Kommitterens, wat över de Internett-Schnittstee maakt worden, so as Datei-Upladens, Bewarkens un Tosamenföhrens-Kommitterens. In Stee daarvun kann eene besünnere Adress %s bruukt worden, um Kommitterens mit de Brukerkonto to verbinnen. Deese Instellen ännert keene bestahn Kommitterens. ssh_helper = Bruukst du Hülp? Kiek de Inföhren an, wo du diene eegenen SSH-Slötels maakst of hülp gewohnten Probleemen of, över wat man mit SSH mennigmaal strukelt. access_token_desc = Utköört Teken-Verlöövnissen begrenzen dat Anmellen blots up de tohörig API-Padden. Lees de Dokumenteren för mehr Informatioonen. oauth2_confidential_client = Diskreeter Klient. Köör dat för Programmen ut, wat dat Geheemst diskreet behanneln, as Internett-Sieden. Köör dat nich för stedenwies Programmen ut, as Schrievdisk- un Telefoon-Programmens. @@ -2398,8 +2398,6 @@ release.tag_name_already_exist = Een Publizeren mit deesem Mark-Naam gifft dat a release.tag_name_invalid = De Mark-Naam is nich gültig. release.tag_name_protected = De Mark-Naam is schütt. release.downloads = Runnerladens -release.download_count_one = %s maal runnerladen -release.download_count_few = %s maal runnerladen release.hide_archive_links = Automatisk maakt Archiven verbargen release.releases_for = Publizerens för %s release.tags_for = Markens för %s diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index fd49f4b635..42b4b3f576 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -2659,8 +2659,6 @@ settings.enforce_on_admins = Handhaaf deze regel voor repository admins settings.event_pull_request_enforcement = Handhaving settings.enforce_on_admins_desc = Admins van deze repository kunnen deze regel niet omzeilen. issues.archived_label_description = (Gearchiveerd) %s -release.download_count_one = %s download -release.download_count_few = %s downloads release.system_generated = Deze bijlage wordt automatisch gegenereerd. settings.sourcehut_builds.secrets = Geheimen settings.web_hook_name_sourcehut_builds = SourceHut Builds diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index cfb520e965..fbc9ac4e67 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -2236,7 +2236,6 @@ settings.sourcehut_builds.secrets_helper = Uprawnij pracę do budowania sekretó 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 @@ -2630,7 +2629,6 @@ 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 diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 57a8c49a8a..8bf7ddabd5 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -992,7 +992,7 @@ pronouns_unspecified = Não especificado language.title = Idioma padrão additional_repo_units_hint = Sugira habilitar unidades de repositório adicionais additional_repo_units_hint_description = Exibir uma sugestão para "Habilitar mais" em repositórios que não possuem todas as unidades disponíveis habilitadas. -update_hints = Dicas de atualização +update_hints = Atualizar dicas 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. @@ -2620,7 +2620,6 @@ 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. -release.download_count_one = %s download settings.mirror_settings.docs.no_new_mirrors = O seu repositório está replicando alterações de ou para outro repositório. Observe que não é possível criar novas réplicas no momento. settings.mirror_settings.docs.pull_mirror_instructions = Para configurar uma réplica de outro repositório, consulte: settings.wiki_rename_branch_main_desc = Renomear o branch usado internamente pela Wiki para "%s". Esta ação é permanente e não pode ser desfeita. @@ -2632,7 +2631,6 @@ settings.trust_model.committer.desc = Uma assinatura de commit é considerada "c settings.wiki_branch_rename_success = O nome do ramo da wiki do repositório foi regularizado com sucesso. pulls.nothing_to_compare_have_tag = Os branches/etiquetas escolhidos são iguais. settings.sourcehut_builds.secrets = Segredos -release.download_count_few = %s downloads release.hide_archive_links = Ocultar arquivos gerados automaticamente 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. @@ -2997,9 +2995,9 @@ dashboard.delete_old_actions.started=A exclusão de todas as atividades antigas dashboard.update_checker=Verificador de atualização dashboard.delete_old_system_notices=Excluir todos os avisos de sistema antigos do banco de dados dashboard.gc_lfs=Coletar lixos dos meta-objetos LFS -dashboard.stop_zombie_tasks=Parar tarefas de actions zumbi -dashboard.stop_endless_tasks=Parar tarefas infinitas de actions -dashboard.cancel_abandoned_jobs=Cancelar trabalhos abandonados de actions +dashboard.stop_zombie_tasks=Parar tarefas de Actions zumbis +dashboard.stop_endless_tasks=Parar tarefas de Actions intermináveis +dashboard.cancel_abandoned_jobs=Cancelar trabalhos abandonados de Actions users.user_manage_panel=Gerenciar contas de usuário users.new_account=Criar conta de usuário @@ -3402,7 +3400,7 @@ notices.delete_success=Os avisos do sistema foram excluídos. identity_access = Identidade e acesso settings = Configurações de administrador users.bot = Robô -dashboard.start_schedule_tasks = Iniciar tarefas de actions programadas +dashboard.start_schedule_tasks = Iniciar tarefas de Actions programadas users.reserved = Reservado emails.change_email_text = Tem certeza de que deseja atualizar este endereço de e-mail? self_check = Autoverificação @@ -3813,7 +3811,7 @@ variables.id_not_exist = A variável com o ID %d não existe. variables.deletion.failed = Falha ao remover a variável. variables.creation.failed = Falha ao adicionar a variável. runs.no_results = Nenhum resultado. -variables.description = As variáveis serão passadas para certas ações e não poderão ser lidas de outra forma. +variables.description = As variáveis serão passadas para certas Actions e não poderão ser lidas de outra forma. workflow.dispatch.trigger_found = Este workflow tem um disparador de evento workflow_dispatch. workflow.dispatch.run = Executar workflow runs.no_runs = O workflow ainda não foi executado. diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 798a587eae..b34da528ea 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -2315,7 +2315,7 @@ settings.packagist_api_token=Código da API settings.packagist_package_url=URL do pacote Packagist settings.deploy_keys=Chaves de instalação settings.add_deploy_key=Adicionar chave de instalação -settings.deploy_key_desc=Chaves de instalação têm acesso para puxar do repositório apenas em modo de leitura. +settings.deploy_key_desc=Chaves de instalação podem ter acesso ao repositório apenas para leitura ou de leitura e escrita. settings.is_writable=Habilitar acesso de escrita settings.is_writable_info=Permitir a esta chave de instalação enviar para o repositório. settings.no_deploy_keys=Ainda não existem quaisquer chaves de instalação. @@ -2656,8 +2656,6 @@ wiki.cancel = Cancelar settings.wiki_rename_branch_main = Normalizar o nome do ramo do Wiki settings.enforce_on_admins = Impor esta regra nos administradores de repositórios settings.enforce_on_admins_desc = Os administradores de repositórios não podem contornar esta regra. -release.download_count_one = %s descarga -release.download_count_few = %s descargas release.system_generated = Este anexo é gerado automaticamente. pulls.ready_for_review = Pronto/a para rever? settings.units.units = Unidades diff --git a/options/locale/locale_pt.ini b/options/locale/locale_pt.ini deleted file mode 100644 index cae467f52e..0000000000 --- a/options/locale/locale_pt.ini +++ /dev/null @@ -1,31 +0,0 @@ - - - -[common] -create_new = Criar… -home = Início -dashboard = Painel -explore = Explorar -help = Ajuda -logo = Logótipo -sign_in = Entrar -sign_in_with_provider = Entrar com %s -sign_in_or = ou -sign_out = Sair -sign_up = Registar -register = Registar -powered_by = À base de %s -page = Página -template = Template -notifications = Notificações -link_account = Conectar conta -version = Versão -active_stopwatch = Cronómetro ativo -tracked_time_summary = Resumo do tempo cronometrado baseado nos filtros da lista de issues -user_profile_and_more = Perfil e definições… -signed_in_as = Conectado como -enable_javascript = Este website requer JavaScript. -toc = Índice -licenses = Licenças -return_to_forgejo = Voltar ao Forgejo -toggle_menu = Abrir/fechar menu \ No newline at end of file diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index dd302f5f8c..ee2972751e 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -2666,8 +2666,6 @@ settings.web_hook_name_sourcehut_builds = Сборки SourceHut settings.sourcehut_builds.manifest_path = Путь манифеста сборки settings.sourcehut_builds.visibility = Видимость задач settings.sourcehut_builds.secrets = Секреты -release.download_count_one = %s скачивание -release.download_count_few = %s скачиваний release.system_generated = Это вложение сгенерировано автоматически. settings.event_pull_request_enforcement = Форсирование pulls.cmd_instruction_checkout_desc = В репозитории вашего проекта перейдите на эту ветвь и протестируйте изменения. diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index bc29990465..88a19e10ac 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -182,8 +182,8 @@ buttons.quote.tooltip = Citera text buttons.code.tooltip = Lägg till kod buttons.link.tooltip = Lägg till en länk buttons.heading.tooltip = Lägg till rubrik -buttons.bold.tooltip = Lägg till fetstilt text -buttons.italic.tooltip = Lägg till kursiv text +buttons.bold.tooltip = Lägg till fetstilt text (CTRL+B / ⌘B) +buttons.italic.tooltip = Lägg till kursiv text (CTRL+I / ⌘I) 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 @@ -321,7 +321,7 @@ 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. +password_algorithm_helper = Ställ in hashalgoritmen för lösenord. Algoritmer har olika krav och styrkor. 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 @@ -650,7 +650,7 @@ activate_email=Skicka aktivering activations_pending=Väntar på aktivering delete_email=Ta Bort email_deletion=Ta bort e-postadress -email_deletion_desc=Mejladressen och relaterad information kommer tas bort från ditt konto. Git-commits med denna mejladress förblir oförändrade. Vill du fortsätta? +email_deletion_desc=Denna mejladress 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. theme_update_error=Det valda temat finns inte. @@ -822,7 +822,7 @@ license_helper_desc=En licens styr vad andra kan och inte kan göra med din kod. 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. -auto_init=Initiera utvecklingskatalog (Lägger till .gitignore, License and README) +auto_init=Initiera utvecklingskatalog create_repo=Skapa utvecklingskatalog default_branch=Standardgren default_branch_helper=Den förvalda grenen är bas-gren för pull requests och kod-commits. @@ -866,7 +866,7 @@ migrate_items_wiki=Wiki migrate_items_milestones=Milstenar migrate_items_labels=Etiketter migrate_items_issues=Ärenden -migrate_items_pullrequests=Pull Requester +migrate_items_pullrequests=Pull-förfrågningar migrate_items_merge_requests=Begäran om sammanslagning migrate_items_releases=Releaser migrate_repo=Migrera utvecklingskatalog @@ -966,7 +966,7 @@ editor.propose_file_change=Föreslå filändring editor.new_branch_name_desc=Nytt branchnamn… editor.cancel=Avbryt editor.filename_cannot_be_empty=Filnamnet kan inte vara tomt. -editor.file_changed_while_editing=Filens innehåll har ändrats sedan du påbörjade din ändring.Klicka här för att se ändringarna eller commita ändringarna igen för att skriva över dem. +editor.file_changed_while_editing=Filens innehåll har ändrats sedan du öppnade filen.Klicka här för att se ändringarna eller commita ändringarna igen för att skriva över dem. editor.commit_empty_file_header=Committa en tom fil editor.commit_empty_file_text=Filen du vill committa är tom. Vill du fortsätta? editor.no_changes_to_show=Det finns inga ändringar att visa. @@ -1062,7 +1062,7 @@ issues.remove_self_assignment=`tog bort sin tilldelning %s` issues.change_title_at='ändrade titeln från %s till %s %s' issues.delete_branch_at='tog bort grenen %s %s' issues.filter_label=Etikett -issues.filter_label_exclude=`Använd alt + klicka/enter för att exkludera etiketter` +issues.filter_label_exclude=Använd Alt + klicka/enter för att exkludera etiketter issues.filter_label_no_select=Alla etiketter issues.filter_milestone=Milsten issues.filter_project_none=Inget projekt @@ -2243,7 +2243,7 @@ team_kind = Sök team… org_kind = Sök organisationer… issue_kind = Sök ärenden… regexp_tooltip = Tolka söktermen som ett reguljärt uttryck -code_search_unavailable = Kodsökning är för närvarande inte tillgänglig. Vänligen kontakta webbplatsadministratören. +code_search_unavailable = Kodsökning är för närvarande inte tillgängligt. Vänligen kontakta webbplatsadministratören. fuzzy_tooltip = Inkludera resultat som är närliggande till söktermen no_results = Inga matchande resultat hittades. fuzzy = Ungefärlig diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index b3507015d1..7419aa2fde 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -159,7 +159,7 @@ toggle_menu = Menüyü aç-kapa new_migrate.title = Yeni göç new_migrate.link = Yeni göç copy_path = Dizini kopyala -confirm_delete_artifact = "%s" adlı öğeyi silmek istediğinizden emin misiniz? +confirm_delete_artifact = "%s" adlı öğeyi silmek istediğinize emin misiniz? [aria] navbar=Gezinti çubuğu @@ -178,8 +178,8 @@ contributions_format = {day} {month} {year} tarihinde {contributions} katkı [editor] buttons.heading.tooltip=Başlık ekle -buttons.bold.tooltip=Kalın metin ekle -buttons.italic.tooltip=Eğik metin ekle +buttons.bold.tooltip=Kalın metin ekle (Ctrl+B / ⌘B) +buttons.italic.tooltip=Eğik metin ekle (Ctrl+I / ⌘I) buttons.quote.tooltip=Metni alıntıla buttons.code.tooltip=Kod ekle buttons.link.tooltip=Bağlantı ekle @@ -228,7 +228,7 @@ platform_desc = Forgejo'nun Linux ve FreeBSD gibi özgür işletim sistemlerinde [install] install=Kurulum -title=Başlangıç Yapılandırması +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ı @@ -257,7 +257,7 @@ err_admin_name_is_invalid=Yönetici kullanıcı adı geçersiz general_title=Genel ayarlar app_name=Site Başlığı -app_name_helper=Şirket adınızı buraya girebilirsiniz. +app_name_helper=Buraya örnek adınızı girin. Her sayfada görüntülenecektir. repo_path=Depo kök dizini repo_path_helper=Tüm uzak Git depoları bu dizine kaydedilecektir. lfs_path=Git LFS kök dizini @@ -266,9 +266,9 @@ 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_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. -http_port=Forgejo HTTP Dinleme Portu +ssh_port=SSH sunucu portu +ssh_port_helper=SSH sunucusunun dinleyeceği port numarası. SSH sunucusunu devre dışı bırakmak için boş bırakın. +http_port=HTTP dinleme portu http_port_helper=Forgejo'nın web sunucusunun dinleyeceği port numarası. app_url=Forgejo Kök URL app_url_helper=HTTP(S) kopyalama URL'leri ve e-posta bildirimleri için temel adres. diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 01bd552ab6..5ad3680709 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -776,7 +776,7 @@ ssh_desc=Ці відкриті ключі SSH повʼязані з вашим principal_desc=Ці настройки SSH сертифікатів вказані у вашому обліковому записі та надають повний доступ до ваших репозиторіїв. gpg_desc=Ці відкриті ключі GPG пов'язані з вашим обліковим записом і використовуються для підтвердження комітів. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють підписувати коміти вашим особистим підписом. ssh_helper=Потрібна допомога? Дивіться гід на GitHub з генерації ключів SSH або виправлення типових неполадок SSH. -gpg_helper= Потрібна допомога? Перегляньте посібник GitHub про GPG . +gpg_helper=Потрібна допомога? Перегляньте посібник про 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=Додати принципал @@ -950,7 +950,7 @@ permissions_public_only = Тільки публічні select_permissions = Виберіть дозволи permissions_access_all = Усі (публічні, приватні й обмежені) create_oauth2_application_success = Ви успішно створили нову програму OAuth2. -keep_email_private_popup = Ваша адреса електронної пошти не буде відображатися у вашому профілі і не буде використовуватися за замовчуванням для комітів, зроблених через веб-інтерфейс, таких як завантаження файлів, редагування і об'єднання комітів. Натомість ви можете використовувати спеціальну адресу %s для прив'язки комітів до свого облікового запису. Ця опція не вплине на існуючі коміти. +keep_email_private_popup = Адреса електронної пошти не буде відображатися у вашому профілі і не буде використовуватися за замовчуванням для комітів, зроблених через веб-інтерфейс, таких як завантаження файлів, редагування і об'єднання комітів. Натомість ви можете використовувати спеціальну адресу %s для прив'язки комітів до свого облікового запису. Ця опція не вплине на існуючі коміти. blocked_since = Заблокований з %s can_not_add_email_activations_pending = Очікується активація, спробуйте ще раз за кілька хвилин, якщо хочете додати нову адресу електронної пошти. ssh_signonly = SSH наразі вимкнено, тому ці ключі використовуються лише для перевірки підпису комітів. @@ -1030,7 +1030,7 @@ ssh_token_help_ssh_agent = або, якщо ви використовуєте а [repo] owner=Власник -owner_helper=Деякі організації можуть не відображатися у випадаючому списку через максимальну кількість репозиторііїв. +owner_helper=Деякі організації можуть не відображатися у випадаючому списку через обмеження на максимальну кількість репозиторіїв. repo_name=Назва репозиторію repo_name_helper=Хороші назви репозиторіїв використовують короткі, унікальні ключові слова що легко запам'ятати. repo_size=Розмір репозиторію @@ -1039,7 +1039,7 @@ template_select=Виберіть шаблон template_helper=Зробити репозиторій шаблоном template_description=Шаблонні репозиторії дозволяють користувачам генерувати нові репозиторії із такою ж структурою директорій, файлами та додатковими налаштуваннями. visibility=Видимість -visibility_description=Тільки власник або члени організації які мають віповідні права, зможуть побачити. +visibility_description=Тільки власник або члени організації, які мають відповідні права, зможуть побачити. visibility_helper_forced=Адміністратор вашого сайту налаштував параметри: всі нові репозиторії будуть приватними. visibility_fork_helper=(Буде змінено видимість усіх форків.) clone_helper=Потрібна допомога у клонуванні? Відвідайте сторінку Допомога. @@ -1384,7 +1384,7 @@ issues.filter_assignee=Виконавець issues.filter_assginee_no_select=Всі виконавці issues.filter_assginee_no_assignee=Немає виконавця issues.filter_type=Тип -issues.filter_type.all_issues=Всі задачі +issues.filter_type.all_issues=Усі задачі issues.filter_type.assigned_to_you=Призначене вам issues.filter_type.created_by_you=Створено вами issues.filter_type.mentioning_you=Вас згадано @@ -1508,7 +1508,7 @@ 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.push_commit_1=додає %d коміт %s issues.push_commits_n=додає %d коміти(-ів) %s issues.force_push_codes=`примусово залито %[1]s з %[2]s %[8]s до %[4]s %[9]s %[6]s` @@ -1517,10 +1517,10 @@ issues.due_date_form=рррр-мм-дд issues.due_date_form_edit=Редагувати issues.due_date_form_remove=Видалити issues.due_date_not_set=Термін виконання не встановлено. -issues.due_date_added=додав(ла) дату завершення %s %s -issues.due_date_remove=видалив(ла) дату завершення %s %s +issues.due_date_added=додає термін виконання %s %s +issues.due_date_remove=видаляє термін виконання %s %s issues.due_date_overdue=Прострочено -issues.due_date_invalid=Термін дії недійсний або знаходиться за межами допустимого діапазону. Будь ласка, використовуйте формат «рррр-мм-дд». +issues.due_date_invalid=Термін виконання недійсний або знаходиться за межами допустимого діапазону. Будь ласка, використовуйте формат «рррр-мм-дд». issues.dependency.title=Залежності issues.dependency.add=Додати залежність… issues.dependency.cancel=Відмінити @@ -1631,7 +1631,7 @@ pulls.no_merge_desc=Цей запити на злиття неможливо з pulls.no_merge_helper=Увімкніть параметри злиття в налаштуваннях репозиторія або злийте запити на злиття вручну. pulls.no_merge_wip=Цей пулл-реквест не можливо об'єднати, тому-що він вже виконується. pulls.no_merge_not_ready=Цей запит не готовий до злиття, перевірте статус рецензіювання і статус перевірки. -pulls.no_merge_access=Ви не авторизовані, щоб виконати цей запит на злиття. +pulls.no_merge_access=У вас нема дозволу злити цей запит. pulls.merge_pull_request=Створити коміт зі злиттям pulls.rebase_merge_pull_request=Перебазувати, а потім виконати злиття перемотуванням pulls.rebase_merge_commit_pull_request=Перебазувати, а потім створити коміт злиття @@ -1679,7 +1679,7 @@ milestones.completeness=%d%% завершено milestones.create=Створити етап milestones.title=Заголовок milestones.desc=Опис -milestones.due_date=Дата завершення (опціонально) +milestones.due_date=Термін виконання (необов'язково) milestones.clear=Очистити milestones.invalid_due_date_format=Термін виконання має бути у форматі «рррр-мм-дд». milestones.edit=Редагувати етап @@ -2283,8 +2283,6 @@ migrate.migrating_failed.error = Міграція не вдалася: %s all_branches = Усі гілки settings.tracker_issue_style.regexp_pattern = Шаблон регулярного виразу settings.tracker_issue_style.regexp = Регулярний вираз -release.download_count_one = %s завантаження -release.download_count_few = %s завантажень release.invalid_external_url = Неправильна зовнішня URL-адреса: «%s» issues.role.collaborator_helper = Цього користувача запрошено до співпраці над репозиторієм. settings.add_collaborator_owner = Неможливо додати власника в якості співавтора. @@ -2733,6 +2731,10 @@ tree_path_not_found.commit = Шлях %[1]s не існує в коміті %[2] tree_path_not_found.tag = Шлях %[1]s не існує в тегу %[2]s tree_path_not_found.branch = Шлях %[1]s не існує в гілці %[2]s pulls.recently_pushed_new_branches = Ви надіслали зміни до гілки %[1]s %[2]s +issues.due_date_modified = змінює термін виконання з %[2]s на %[1]s %[3]s +milestones.filter_sort.earliest_due_data = Найближчий термін виконання +milestones.filter_sort.latest_due_date = Найдальший термін виконання +settings.mirror_settings.pushed_repository = Цільовий репозиторій [graphs] contributors.what = внески diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 45f8824dc0..34d992ce73 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -173,8 +173,8 @@ contributions_zero=没有贡献 less=较少 more=较多 contributions_format = {year}年{month}{day}日有{contributions} -contributions_few = 贡献 -contributions_one = 贡献 +contributions_few = 项贡献 +contributions_one = 项贡献 [editor] buttons.heading.tooltip=添加标题 @@ -328,7 +328,7 @@ default_allow_create_organization=默认情况下允许创建组织 default_allow_create_organization.description=默认允许新用户创建组织。禁用此选项时,管理员必须向新用户授予创建组织的权限。 default_enable_timetracking=默认情况下启用时间跟踪 default_enable_timetracking.description=默认允许新仓库使用时间跟踪功能。 -no_reply_address=隐藏电子邮件 +no_reply_address=隐藏的电子邮件域名 no_reply_address_helper=用于设置隐藏电子邮件地址的用户使用的电子邮件域名。例如,如果用于隐藏电子邮件地址的域名设为“noreply.example.org”,则用户名 “joe” 在 Git 中将以 “joe@noreply.example.org” 表示。 password_algorithm=密码哈希算法 invalid_password_algorithm=无效的密码哈希算法 @@ -445,8 +445,8 @@ password_pwned=此密码出现在 立即登录! back_to_sign_in = 返回登录 sign_in_openid = 继续使用 OpenID @@ -762,7 +762,7 @@ password_incorrect=当前密码不正确。 change_password_success=您的密码已更新。从现在开始请使用您的新密码登录。 password_change_disabled=非本地帐户不能通过 Forgejo 的 web 界面更改密码。 -manage_emails=管理邮箱地址 +manage_emails=管理电子邮件地址 manage_themes=默认主题 manage_openid=OpenID 地址 email_desc=您的主要电子邮件地址将用于通知、密码恢复,基于网页界面的Git操作(只要它不是设置为隐藏的)。 @@ -783,16 +783,16 @@ theme_update_error=所选主题不存在。 openid_deletion=移除 OpenID 地址 openid_deletion_desc=删除此 OpenID 地址将会阻止你使用它进行登录。你确定要继续吗? openid_deletion_success=OpenID地址已被移除。 -add_new_email=添加邮箱地址 +add_new_email=添加电子邮件地址 add_new_openid=添加新的 OpenID URI -add_email=增加电子邮件地址 +add_email=添加电子邮件地址 add_openid=添加 OpenID URI add_email_confirmation_sent=确认邮件已发送至“%s”。请检查您的收件箱并在接下来的 %s 内点击提供的链接以确认您的电子邮件地址。 add_email_success=新的电子邮件地址已添加。 email_preference_set_success=电子邮件首选项已成功设置。 add_openid_success=新的 OpenID 地址已添加。 -keep_email_private=隐藏邮箱地址 -keep_email_private_popup=您的邮件地址不会在个人资料中显示,也不会成为通过网页界面提交的默认地址,例如文件上传、编辑和合并提交。相反,可以使用特殊地址 %s 将提交链接到您的账号。此选项不会影响现有提交。 +keep_email_private=隐藏电子邮件地址 +keep_email_private_popup=电子邮件地址不会显示在个人资料页面上,且不会成为通过网页界面提交的默认地址,例如文件上传、编辑和合并提交。相反,可以使用特殊地址 %s 将提交链接到用户账号。此选项不会影响现有提交。 openid_desc=OpenID 让你可以将认证转发到外部服务。 manage_ssh_keys=管理 SSH 密钥 @@ -2664,8 +2664,6 @@ settings.sourcehut_builds.secrets = 密钥 size_format = %[1]s:%[2]s, %[3]s:%[4]s settings.add_webhook.invalid_path = 路径中不能包含“.”或“..”,也不能在开头或结尾中使用斜杠。 settings.sourcehut_builds.secrets_helper = 给予任务访问构建密钥的权限(需要 SECRETS:RO 权限) -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 @@ -3294,7 +3292,7 @@ config.enable_timetracking=启用时间跟踪 config.default_enable_timetracking=默认情况下启用时间跟踪 config.allow_dots_in_usernames = 允许用户在用户名中使用英文句号。不影响已有的帐户。 config.default_allow_only_contributors_to_track_time=仅允许成员跟踪时间 -config.no_reply_address=隐藏电子邮件域名 +config.no_reply_address=隐藏的电子邮件域名 config.default_visibility_organization=新组织的默认可见性 config.default_enable_dependencies=默认情况下启用议题依赖 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index 2f5f57996e..6e21fd6b03 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -2605,8 +2605,6 @@ settings.units.overview = 概覽 settings.federation_settings = 聯邦設定 issues.author.tooltip.issue = 這個使用者是這個問題的作者。 settings.units.add_more = 啟用更多 -release.download_count_one = %s 次下載 -release.download_count_few = %s 次下載 pulls.cmd_instruction_checkout_title = 簽出 pulls.made_using_agit = AGit branch.rename = 重新命名分支「%s」 diff --git a/options/locale_next/locale_bg.json b/options/locale_next/locale_bg.json index 87bcd36b9d..029db1b5fc 100644 --- a/options/locale_next/locale_bg.json +++ b/options/locale_next/locale_bg.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s изтегляне", + "other": "%s изтегляния" + }, "repo.pulls.merged_title_desc": { "one": "сля %[1]d подаване от %[2]s в %[3]s %[4]s", "other": "сля %[1]d подавания от %[2]s в %[3]s %[4]s" diff --git a/options/locale_next/locale_ca.json b/options/locale_next/locale_ca.json index 4d64570526..9ce7bf55bb 100644 --- a/options/locale_next/locale_ca.json +++ b/options/locale_next/locale_ca.json @@ -74,7 +74,7 @@ "keys.ssh.link": "Claus SSH", "keys.gpg.link": "Claus GPG", "admin.config.moderation_config": "Configuració de la moderació", - "admin.moderation.reports": "Informes", + "admin.moderation.reports": "Denúncies", "admin.moderation.moderation_reports": "Informes de moderació", "admin.moderation.no_open_reports": "No hi ha cap denúncia oberta.", "moderation.report_abuse": "Denunciar abús", @@ -133,7 +133,7 @@ "admin.config.global_2fa_requirement.admin": "Administradors", "settings.visibility.description": "La visibilitat del perfil afecta la capacitat dels altres per accedir als vostres repositoris no privats. Saber-ne més.", "settings.twofa_unroll_unavailable": "El vostre compte requereix l'autenticació de doble factor i no es pot desactivar.", - "settings.twofa_reenroll.description": "Torneu-vos a inscriure a l'autenticació de doble factor", + "settings.twofa_reenroll.description": "Torneu-vos a inscriure a la vostra autenticació de doble factor", "settings.must_enable_2fa": "Aquesta instància de Forgejo requereix que els usuaris habilitin l'autenticació de doble factor abans de poder accedir als seus comptes.", "error.must_enable_2fa": "Aquesta instància de Forgejo requereix que els usuaris habilitin l'autenticació de doble factor abans de poder accedir als seus comptes. Habiliteu-la a: %s", "avatar.constraints_hint": "Els avatars personalitzats no poden pesar més de %[1]s ni tenir una dimensió superior a %[2]dx%[3]d píxels", @@ -143,7 +143,41 @@ "migrate.pagure.incorrect_url": "S'ha proporcionat una URL del repositori font incorrecta", "migrate.pagure.project_url": "URL del projecte de Pagure", "migrate.pagure.project_example": "L'URL del projecte de pagure, per exemple: https://pagure.io/pagure", - "migrate.pagure.token_label": "Testimoni", - "migrate.pagure.token_body_a": "Proporcioneu un testimoni d'API de Pagure amb accés a les incidències privades per crear un repositori que contingui només les incidències privades", - "meta.last_line": "Molt estudiar anglès i vinga a fer espíquings i ràitings i tal... I què passa amb el català? Eh?! Me'l noto una mica oxidat! També és important." + "migrate.pagure.token_label": "Testimoni de l'API de Pagure", + "meta.last_line": "Molt estudiar anglès i vinga a fer espíquings i ràitings i tal... I què passa amb el català? Eh?! Me'l noto una mica oxidat! També és important.", + "pulse.n_active_issues": { + "one": "%s incidència activa", + "many": "%s incidències actives", + "other": "%s incidències actives" + }, + "pulse.n_active_prs": { + "one": "%s sol·licitud d'extracció activa", + "many": "%s sol·licituds d'extracció actives", + "other": "%s sol·licituds d'extracció actives" + }, + "user.ghost.tooltip": "Aquest usuari ha sigut eliminat, o no es pot trobar.", + "repo.pulls.maintainers_can_edit": "Els responsables poden editar aquesta sol·licitud d'extracció.", + "repo.pulls.maintainers_cannot_edit": "Els responsables no poden editar aquesta sol·licitud d'extracció.", + "mail.issue.action.close_by_commit": "%[1]s ha tancat %[2]s al commit %[3]s.", + "admin.dashboard.cleanup_offline_runners": "Neteja els executors fora de línia", + "settings.twofa_reenroll": "Torneu-vos a inscriure a l'autenticació de doble factor", + "migrate.pagure.private_issues.summary": "Incidències privades (opcional)", + "migrate.pagure.private_issues.description": "Aquesta funció està pensada per crear un segon repositori amb només les incidències privades del vostre projecte de Pragure amb la finalitat d'arxivar-lo. Primer, feu una migració normal (sense cap testimoni) per importar tot el contingut públic. Després, si teniu incidències privades que voleu preservar, creeu un repositori separat emprant aquesta opció de testimoni per arxivar-les.", + "migrate.pagure.token.placeholder": "Només per crear un arxiu d'incidències privades", + "actions.runs.viewing_out_of_date_run": "Esteu veient una execució desactualitzada d'aquesta tasca que va ser executada %[1]s.", + "actions.runs.view_most_recent_run": "Veure l'execució més recent", + "actions.workflow.pre_execution_error": "No s'ha executat el flux de treball degut a un error que ha bloquejat l'intent d'execució.", + "relativetime.future": "en el futur", + "migrate.pagure.private_issues.warning": "Assegureu-vos de configurar la visibilitat del repositori com a privada si esteu usant la clau API per importar incidències privades. Això evitarà exposar accidentalment el contingut privat en un repositori públic.", + "actions.runs.run_attempt_label": "Intent d'execució #%[1]s (%[2]s)", + "actions.workflow.job_parsing_error": "No s'han pogut analitzar les tasques al flux de treball: %v", + "release.n_downloads": { + "one": "%s baixada", + "many": "%s baixades", + "other": "%s baixades" + }, + "actions.workflow.event_detection_error": "No s'han pogut analitzar els esdeveniments compatibles al flux de treball: %v", + "og.repo.summary_card.alt_description": "La targeta de resum del repositori %[1]s, descrita com a: %[2]s", + "stars.list.none": "Ningú ha marcat aquest repositori com a favorit.", + "mail.actions.run_info_trigger": "Activat per: %[1]s per: %[2]s" } diff --git a/options/locale_next/locale_cs-CZ.json b/options/locale_next/locale_cs-CZ.json index e5d85a1fdb..c44f9ec54d 100644 --- a/options/locale_next/locale_cs-CZ.json +++ b/options/locale_next/locale_cs-CZ.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s stažení", + "other": "%s stažení" + }, "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", @@ -130,9 +134,7 @@ "migrate.pagure.incorrect_url": "Byla zadána nesprávná adresa URL zdrojového repozitáře", "migrate.pagure.project_url": "Adresa projektu Pagure", "migrate.pagure.project_example": "Adresa URL projektu Pagure, např. https://pagure.io/pagure", - "migrate.pagure.token_label": "Token", - "migrate.pagure.token_body_a": "Zadejte token API Pagure s přístupem k soukromým problémům pro vytvoření repozitáře obsahujícího pouze soukromé problémy", - "migrate.pagure.token_body_b": "Nezapomeňte nastavit repozitář jako soukromý výše, pokud chcete, aby byl repozitář soukromý", + "migrate.pagure.token_label": "Token API Pagure", "migrate.github.description": "Migrovat data z github.com nebo serveru GitHub Enterprise.", "migrate.git.description": "Migrovat pouze repozitář z libovolné služby Git.", "migrate.gitea.description": "Migrovat data z gitea.com nebo jiných instancí Gitea.", @@ -159,10 +161,22 @@ "actions.runs.view_most_recent_run": "Zobrazit nejnovější běh", "pulse.n_active_issues": { "one": "%s aktivní problém", + "few": "%s aktivní problémy", "other": "%s aktivních problémů" }, "pulse.n_active_prs": { "one": "%s aktivní žádost o sloučení", + "few": "%s aktivní žádosti o sloučení", "other": "%s aktivních žádostí o sloučení" - } + }, + "repo.pulls.maintainers_can_edit": "Správci mohou upravit tuto žádost o sloučení.", + "repo.pulls.maintainers_cannot_edit": "Správci nemohou upravit tuto žádost o sloučení.", + "mail.issue.action.close_by_commit": "%[1]s zavřel/a %[2]s v revizi %[3]s.", + "migrate.pagure.private_issues.summary": "Soukromé problémy (volitelné)", + "migrate.pagure.private_issues.description": "Tato funkce je navržená pro vytvoření druhého repozitáře obsahujícího pouze soukromé problémy z vašeho projektu Pagure pro účely archivace. Nejprve proveďte normální migraci (bez tokenu) pro importování veškerého veřejného obsahu. Poté, pokud máte soukromé problémy k uchování, vytvořte oddělený repozitář pomocí této možnosti tokenu k archivování daných soukromých problémů.", + "migrate.pagure.private_issues.warning": "Ujistěte se, že je viditelnost repozitáře výše nastavena na Soukromou, pokud používáte klíč API k importování soukromých problémů. Tím zabráníte nechtěnému zveřejněný soukromého obsahu ve veřejném repozitáři.", + "migrate.pagure.token.placeholder": "Pouze pro vytvoření archivu soukromých problémů", + "actions.workflow.job_parsing_error": "Nepodařilo se zpracovat úlohy ve workflow: %v", + "actions.workflow.event_detection_error": "Nepodařilo se zpracovat podporované události ve workflow: %v", + "actions.workflow.pre_execution_error": "Workflow nebyl vykonán z důvodu chyby, která zablokovala pokus o vykonání." } diff --git a/options/locale_next/locale_da.json b/options/locale_next/locale_da.json index 3d4eee95cd..3d20be657a 100644 --- a/options/locale_next/locale_da.json +++ b/options/locale_next/locale_da.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s download", + "other": "%s downloads" + }, "search.milestone_kind": "Søg milepæle…", "repo.pulls.title_desc": { "one": "ønsker at flette %[1]d commit fra %[2]s til %[3]s", diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json index 45ac041fda..e922d09828 100644 --- a/options/locale_next/locale_de-DE.json +++ b/options/locale_next/locale_de-DE.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s Download", + "other": "%s Downloads" + }, "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" @@ -117,7 +121,6 @@ "admin.auths.allow_username_change": "Benutzernamen ändern zulassen", "admin.auths.allow_username_change.description": "Benutzern erlauben, ihren Benutzernamen in den Profileinstellungen zu ändern", "warning.repository.out_of_sync": "Die Datenbankdarstellung dieses Repositorys ist nicht synchronisiert. Falls diese Warnung immer noch angezeigt wird, nachdem ein Commit zu diesem Repository gepusht wurde, kontaktieren Sie den Administrator.", - "migrate.pagure.token_body_b": "Stellen Sie sicher, dass das Flag für private Repos oben gesetzt ist, wenn Sie möchten, dass dieses Repo privat ist", "migrate.github.description": "Daten von github.com oder GitHub-Enterprise-Server migrieren.", "migrate.git.description": "Ein Repository von einem beliebigen Git-Dienst klonen.", "migrate.gitea.description": "Daten von gitea.com oder anderen Gitea-Instanzen migrieren.", @@ -129,10 +132,9 @@ "migrate.forgejo.description": "Daten von codeberg.org oder anderen Forgejo-Instanzen migrieren.", "repo.pulls.already_merged": "Zusammenführung fehlgeschlagen. Der Pull-Request wurde bereits zusammengeführt.", "migrate.pagure.incorrect_url": "Falsche Quellrepository-URL wurde angegeben", - "migrate.pagure.token_body_a": "Stellen Sie ein Pagure-API-Token mit Zugriff auf die privaten Issues zur Verfügung, um ein Repository mit nur den privaten Issues darin zu erstellen", "migrate.pagure.project_example": "Die URL des Pagure-Projekts, z. B. https://pagure.io/pagure", "migrate.pagure.description": "Daten von pagure.io oder anderen Pagure-Instanzen migrieren.", - "migrate.pagure.token_label": "Token", + "migrate.pagure.token_label": "Pagure-API-Token", "migrate.pagure.project_url": "Pagure-Projekt-URL", "admin.config.security": "Sicherheitskonfiguration", "settings.twofa_unroll_unavailable": "Für deinen Account wird die Zwei-Faktor-Authentifizierung benötigt; sie kann nicht deaktiviert werden.", @@ -158,5 +160,13 @@ "pulse.n_active_prs": { "one": "%s aktiver Pull-Request", "other": "%s aktive Pull-Requests" - } + }, + "migrate.pagure.private_issues.summary": "Private Issues (optional)", + "migrate.pagure.private_issues.description": "Dieses Feature wurde dafür entworfen, um ein zweites Repository zu erstellen, das nur private Issues von deinem Pagure-Projekt für Archivierungszwecke enthält. Nimm zuerst eine normale Migration (ohne ein Token) vor, um alle öffentliche Inhalte zu importieren. Anschließend, wenn du private Issues hast, die du aufbewahren willst, erstelle mit diesem Token ein separates Repository, um diese privaten Issues zu archivieren.", + "migrate.pagure.private_issues.warning": "Stell sicher, dass du die Repository-Sichtbarkeit oben auf Privat stellst, falls du den API-Schlüssel benutzt, um private Issues zu importieren. Damit verhindest du, dass du aus Versehen private Inhalte in einem öffentlichen Repository offenlegst.", + "migrate.pagure.token.placeholder": "Nur für die Erstellung eines privaten Issue-Archivs", + "mail.issue.action.close_by_commit": "%[1]s hat %[2]s in Commit %[3]s geschlossen.", + "actions.workflow.job_parsing_error": "Jobs im Workflow konnten nicht geparst werden: %v", + "actions.workflow.event_detection_error": "Unterstützte Ereignisse im Workflow konnten nicht geparst werden: %v", + "actions.workflow.pre_execution_error": "Der Workflow wurde aufgrund eines Fehlers, der den Ausführungsversuch blockierte, nicht ausgeführt." } diff --git a/options/locale_next/locale_el-GR.json b/options/locale_next/locale_el-GR.json index 2bac979e2e..dbba91e250 100644 --- a/options/locale_next/locale_el-GR.json +++ b/options/locale_next/locale_el-GR.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s λήψη", + "other": "%s λήψεις" + }, "repo.pulls.merged_title_desc": { "one": "συγχώνευθηκε %[1]d υποβολή από τον κλάδο %[2]s στον κλάδο %[3]s %[4]s", "other": "συγχώνευσε %[1]d υποβολές από %[2]s σε %[3]s %[4]s" @@ -99,8 +103,6 @@ "repo.pulls.already_merged": "Αποτυχία συγχώνευσης: Αυτό το pull request έχει ήδη συγχωνευτεί.", "repo.issue_indexer.title": "Ευρετηρητής Ζητημάτων", "migrate.pagure.token_label": "Διακριτικό", - "migrate.pagure.token_body_a": "Παρέχεται ένα διακριτικό Pagure API με πρόσβαση στα ιδιωτικά ζητήματα για τη δημιουργία ενός αποθετηρίου με μόνο τα ιδιωτικά ζητήματα σε αυτό", - "migrate.pagure.token_body_b": "Φροντίστε να ορίσετε το αποθετήριο με ιδιωτικό σήμα αν θέλετε από το αποθετήριο να είναι ιδιωτικό", "migrate.pagure.incorrect_url": "Δόθηκε λανθασμένο URL αποθετηρίου πηγής", "migrate.pagure.project_url": "URL έργου Pagure", "migrate.pagure.description": "Μετανάστευση δεδομένων από το pagure.io ή άλλες εγκαταστάσεις Pagure.", diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json index d3442d3b3e..485ef63092 100644 --- a/options/locale_next/locale_en-US.json +++ b/options/locale_next/locale_en-US.json @@ -150,6 +150,10 @@ "migrate.pagure.private_issues.description": "This feature is designed to create a second repository containing only private issues from your Pagure project for archive purposes. First, perform a normal migration (without a token) to import all public content. Then, if you have private issues to preserve, create a separate repository using this token option to archive those private issues.", "migrate.pagure.private_issues.warning": "Be sure to set the repository visibility above to Private if you are using the API key to import private issues. This prevents accidentally exposing private content in a public repository.", "migrate.pagure.token.placeholder": "Only for creating private issues archive", + "release.n_downloads": { + "one": "%s download", + "other": "%s downloads" + }, "actions.runs.run_attempt_label": "Run attempt #%[1]s (%[2]s)", "actions.runs.viewing_out_of_date_run": "You are viewing an out-of-date run of this job that was executed %[1]s.", "actions.runs.view_most_recent_run": "View most recent run", diff --git a/options/locale_next/locale_eo.json b/options/locale_next/locale_eo.json index 1f4124b2ea..72b33f927e 100644 --- a/options/locale_next/locale_eo.json +++ b/options/locale_next/locale_eo.json @@ -1,3 +1,62 @@ { - "search.milestone_kind": "Serĉi celojn..." + "search.milestone_kind": "Serĉi celojn…", + "home.welcome.no_activity": "Neniu aktiveco", + "home.explore_repos": "Esplori deponejojn", + "home.explore_users": "Esplori uzantojn", + "home.explore_orgs": "Esplori organizaĵojn", + "stars.list.none": "Neniu stelumis ĉi tiun deponejon.", + "relativetime.now": "nun", + "relativetime.mins": { + "one": "antaŭ %d minuto", + "other": "antaŭ %d minutoj" + }, + "relativetime.hours": { + "one": "antaŭ %d horo", + "other": "antaŭ %d horoj" + }, + "relativetime.days": { + "one": "antaŭ %d tago", + "other": "antaŭ %d tagoj" + }, + "relativetime.weeks": { + "one": "antaŭ %d semajno", + "other": "antaŭ %d semajnoj" + }, + "relativetime.months": { + "one": "antaŭ %d monato", + "other": "antaŭ %d monatoj" + }, + "relativetime.years": { + "one": "antaŭ %d jaro", + "other": "antaŭ %d jaroj" + }, + "relativetime.1day": "hieraŭ", + "relativetime.2days": "antaŭ du tagoj", + "relativetime.1week": "je lasta semajno", + "relativetime.2weeks": "antaŭ du semajnoj", + "relativetime.1month": "je lasta monato", + "relativetime.2months": "antaŭ du monatoj", + "relativetime.1year": "je lasta jaro", + "relativetime.2years": "antaŭ du jaroj", + "migrate.github.description": "Migrigi datumojn el github.com aŭ Github Enterprise server.", + "migrate.git.description": "Migrigi nur deponejon el ajna Git servilo.", + "migrate.gitea.description": "Migrigi datumojn el gitea.com aŭ aliaj Gitea instancoj.", + "migrate.gitlab.description": "Migrigi datumojn el gitlab.com aŭ aliaj GitLab instancoj.", + "migrate.gogs.description": "Migrigi datumojn el notabug.org aŭ aliaj Gogs instancoj.", + "migrate.onedev.description": "Migrigi datumojn el code.onedev.io aŭ aliaj OneDev instancoj.", + "migrate.gitbucket.description": "Migrigi datumojn el GitBucket instancoj.", + "migrate.codebase.description": "Migrigi datumojn el codebasehq.com.", + "migrate.forgejo.description": "Migrigi datumojn el codeberg.org aŭ aliaj Forgejo instancoj.", + "repo.settings.push_mirror.branch_filter.label": "Branĉa filtrilo (malnepra)", + "themes.names.forgejo-auto": "Forgejo (konformi kun sistema etoso)", + "themes.names.forgejo-light": "Forgejo hela", + "themes.names.forgejo-dark": "Forgejo malhela", + "error.not_found.title": "Paĝo ne trovita", + "alert.range_error": " devas esti nombro inter %[1]s kaj %[2]s.", + "profile.edit.link": "Redakti profilon", + "feed.atom.link": "Atomfluo", + "keys.ssh.link": "SSH ŝlosiloj", + "keys.gpg.link": "GPG ŝlosiloj", + "admin.moderation.reports": "Raportoj", + "admin.moderation.no_open_reports": "Ne estas malfermataj raportoj." } diff --git a/options/locale_next/locale_es-ES.json b/options/locale_next/locale_es-ES.json index f531f06f76..c7dc326e71 100644 --- a/options/locale_next/locale_es-ES.json +++ b/options/locale_next/locale_es-ES.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s descarga", + "other": "%s descargas" + }, "repo.pulls.merged_title_desc": { "one": "fusionó %[1]d confirmación de %[2]s en %[3]s %[4]s", "many": "fusionó %[1]d confirmaciones de %[2]s en %[3]s %[4]s", diff --git a/options/locale_next/locale_fi-FI.json b/options/locale_next/locale_fi-FI.json index 294995d5b5..bcb8e60564 100644 --- a/options/locale_next/locale_fi-FI.json +++ b/options/locale_next/locale_fi-FI.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s lataus", + "other": "%s latausta" + }, "repo.pulls.merged_title_desc": { "one": "yhdistetty %[1]d sitoumus %[2]s:sta kohteeseen %[3]s %[4]s", "other": "yhdistetty %[1]d sitoumusta %[2]s:sta kohteeseen %[3]s %[4]s" @@ -140,5 +144,16 @@ "pulse.n_active_prs": { "one": "%s aktiivinen vetopyyntö", "other": "%s aktiivista vetopyyntöä" - } + }, + "repo.pulls.maintainers_can_edit": "Ylläpitäjät voivat muokata tätä vetopyyntöä.", + "repo.pulls.maintainers_cannot_edit": "Ylläpitäjät eivät voi muokata tätä vetopyyntöä.", + "repo.form.cannot_create": "Kaikki tilat, joihin voit luoda tietovarastoja, ovat saavuttaneet tietovarastojen rajan.", + "migrate.form.error.url_credentials": "URL-osoite sisältää valtuustiedot, laita ne vastaavasti käyttäjänimi- ja salasanakenttiin", + "warning.repository.out_of_sync": "Tämän tietotietovaraston tietokantaesitys ei ole synkronoitu. Jos tämä varoitus näkyy edelleen tämän tietovaraston sitoumuksen lähettämisen jälkeen, ota yhteyttä järjestelmänvalvojaan.", + "admin.moderation.deleted_content_ref": "Ilmoitettua sisältöä, jonka tyyppi on %[1]v ja tunnus %[2]d, ei enää ole olemassa", + "settings.twofa_reenroll.description": "Ota mukaan kaksivaiheinen todennus uudelleen", + "user.ghost.tooltip": "Tämä käyttäjä on poistettu tai häntä ei voida yhdistää.", + "og.repo.summary_card.alt_description": "Yhteenvetokortti tietovarastosta %[1]s, kuvattu seuraavasti: %[2]s", + "migrate.pagure.incorrect_url": "Virheellinen lähdetietovaraston URL-osoite on syötetty", + "actions.runs.viewing_out_of_date_run": "Katselet tämän työn vanhentunutta suorituskertaa, joka suoritettiin %[1]s." } diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json index 62d8639277..d1d3d79940 100644 --- a/options/locale_next/locale_fil.json +++ b/options/locale_next/locale_fil.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s download", + "other": "%s mga download" + }, "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" @@ -120,10 +124,8 @@ "repo.pulls.already_merged": "Nabigo ang pagsasama: Naisama na ang hiling sa paghila na ito.", "migrate.pagure.incorrect_url": "Maling pinagmulang URL ng repositoryo ang ibinigay", "migrate.pagure.project_url": "URL ng Pagure na proyekto", - "migrate.pagure.token_label": "Token", - "migrate.pagure.token_body_a": "Magbigay ng Pagure API token na may access sa mga pribadong isyu para gumawa ng repositoryo na may mga pribadong isyu lang", + "migrate.pagure.token_label": "Pagure API Token", "migrate.pagure.project_example": "Ang URL ng Pagure na proyekto, hal. https://pagure.io/pagure", - "migrate.pagure.token_body_b": "Siguraduhin na itakda ang pribadong repositoryo na flag sa itaas kung gusto mo na pribado ang repositoryong ito", "migrate.pagure.description": "Mag-migrate ng data mula sa pagure.io o sa ibang mga Pagure na instansya.", "migrate.github.description": "Magmigrate ng data mula sa github.com o GitHub Enterprise server.", "migrate.git.description": "Mag-migrate lang ng repositoryo mula sa anumang serbisyo ng Git.", @@ -156,5 +158,15 @@ "pulse.n_active_prs": { "one": "%s aktibong hiling sa paghila", "other": "%s aktibong mga hiling sa paghila" - } + }, + "repo.pulls.maintainers_can_edit": "Maaaring i-edit ng mga tagapangaiswa ang hiling sa paghila na ito.", + "repo.pulls.maintainers_cannot_edit": "Hindi maaaring i-edit ng mga tagapangasiwa ang hiling sa paghila na ito.", + "migrate.pagure.private_issues.summary": "Mga Pribadong Isyu (Opsyonal)", + "migrate.pagure.private_issues.description": "Dinisenyo ang feature na ito na gumawa ng isa pang repositoryo na naglalaman lamang ng mga pribadong isyu mula sa iyong proyekto sa Pagure para sa layunin ng pag-archive. Una, magsagawa ng isang normal na pag-migrate (nang walang token) para i-import ang lahat ng mga nilalaman. At, kung may mga pribadong isyu na gusto mong panatilihin, gumawa ng isang hiwalay na repositoryo gamit ng opsyon ng token na ito para i-archive ang mga pribadong isyu.", + "migrate.pagure.private_issues.warning": "Siguraduhing itakda ang visibility ng repositoryo sa itaas sa Pribado kung ginagamit mo ang API key para i-import ang mga pribadong isyu. Pinipigilan nito ang paglalantag ng mga pribadong nilalaman sa isang pampublikong repositoryo.", + "migrate.pagure.token.placeholder": "Para lamang sa paggawa ng archive ng mga pribadong isyu", + "mail.issue.action.close_by_commit": "Isinara ni %[1]s ang %[2]s sa commit na %[3]s.", + "actions.workflow.job_parsing_error": "Hindi ma-parse ang mga trabaho sa workflow: %v", + "actions.workflow.event_detection_error": "Hindi ma-parse ang mga sinusuportahang event sa workflow: %v", + "actions.workflow.pre_execution_error": "Hindi na-execute ang workflow dahil sa isang error na hinarang ang pagtangka sa pag-execute." } diff --git a/options/locale_next/locale_fr-FR.json b/options/locale_next/locale_fr-FR.json index 10a99d9376..dce2900a60 100644 --- a/options/locale_next/locale_fr-FR.json +++ b/options/locale_next/locale_fr-FR.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s téléchargement", + "other": "%s téléchargements" + }, "repo.pulls.merged_title_desc": { "one": "a fusionné %[1]d commit depuis %[2]s vers %[3]s %[4]s", "many": "fusionné %[1]d de commits depuis %[2]s vers %[3]s %[4]s", @@ -155,14 +159,22 @@ "migrate.pagure.project_url": "URL du projet Pagure", "migrate.pagure.project_example": "L'URL du projet Pagure, ex. https://pagure.io/pagure", "migrate.pagure.token_label": "Jeton", - "migrate.pagure.token_body_a": "Veuillez fournir un jeton API Pagure avec l'accès aux problèmes privés pour créer un dépôt contenant seulement les problèmes privés", - "migrate.pagure.token_body_b": "Assurez-vous de définir le drapeau dépôt privé ci-dessus si vous souhaitez que ce dépôt soit privé", "pulse.n_active_issues": { "one": "%s ticket actif", - "other": "%s tickets actifs" + "many": "%s tickets actifs", + "other": "" }, "pulse.n_active_prs": { "one": "%s demande d'ajout active", - "other": "%s demandes d'ajout actives" - } + "many": "%s demandes d'ajout actives", + "other": "" + }, + "repo.pulls.maintainers_can_edit": "Les mainteneurs peuvent modifier cette pull request.", + "repo.pulls.maintainers_cannot_edit": "Les mainteneurs ne peuvent pas éditer cette pull request.", + "mail.issue.action.close_by_commit": "%[1]s a fermé %[2]s dans le commit %[3]s.", + "migrate.pagure.private_issues.summary": "Tickets privés (Optionnel)", + "migrate.pagure.private_issues.description": "Cette fonctionnalité est conçue pour créer un deuxième dépôt contenant uniquement des tickets privés de votre projet Pagure à des fins d'archive. Premièrement, effectuer une migration normale (sans jeton) pour importer tout le contenu public. Ensuite, si vous avez des tickets privés à préserver, créez un dépôt séparé en utilisant cette option de jeton pour archiver ces tickets privés.", + "migrate.pagure.private_issues.warning": "Assurez-vous de définir la visibilité du dépôt ci-dessus à Privé si vous utilisez la clé API pour importer des tickets privés. Cela empêche d'exposer accidentellement du contenu privé dans un dépôt public.", + "migrate.pagure.token.placeholder": "Seulement pour créer des archives de tickets privés", + "actions.workflow.pre_execution_error": "Workflow n'a pas été exécuté en raison d'une erreur qui a bloqué la tentative d'exécution." } diff --git a/options/locale_next/locale_id-ID.json b/options/locale_next/locale_id-ID.json index adf01c5a8f..1ad3f2158a 100644 --- a/options/locale_next/locale_id-ID.json +++ b/options/locale_next/locale_id-ID.json @@ -3,11 +3,140 @@ "repo.pulls.title_desc": "ingin menggabungkan komit %[1]d dari %[2]s menuju %[3]s", "moderation.abuse_category.malware": "Perangkat pembahaya", "pulse.n_active_issues": { - "one": "%s Masalah Aktif", - "other": "%s Masalah aktif" + "other": "%s Masalah Aktif" }, "pulse.n_active_prs": { - "one": "%s Tarik permintaan aktif", "other": "%s Tarik permintaan aktif" - } + }, + "home.welcome.no_activity": "Tidak ada aktivitas", + "home.welcome.activity_hint": "Belum ada konten di feed Anda. Aktivitas dan tindakan Anda dari repositori yang Anda ikuti akan ditampilkan di sini.", + "home.explore_repos": "Jelajahi repositori", + "home.explore_users": "Jelajahi pengguna", + "home.explore_orgs": "Jelajahi organisasi", + "stars.list.none": "Tidak ada yang memberikan bintang pada repositori ini.", + "watch.list.none": "Tidak ada yang memantau repositori ini.", + "followers.incoming.list.self.none": "Tidak ada yang mengikuti profil Anda.", + "followers.incoming.list.none": "Tidak ada yang mengikuti pengguna ini.", + "followers.outgoing.list.self.none": "Anda tidak mengikuti siapa pun.", + "followers.outgoing.list.none": "%s tidak mengikuti siapa pun.", + "relativetime.now": "sekarang", + "relativetime.future": "di masa depan", + "relativetime.mins": "%d menit yang lalu", + "relativetime.hours": "%d jam yang lalu", + "relativetime.days": "%d hari yang lalu", + "relativetime.weeks": "%d minggu yang lalu", + "relativetime.months": "%d bulan yang lalu", + "relativetime.years": "%d tahun yang lalu", + "relativetime.1day": "kemarin", + "relativetime.2days": "dua hari yang lalu", + "relativetime.1week": "minggu lalu", + "relativetime.2weeks": "dua minggu yang lalu", + "relativetime.1month": "bulan lalu", + "relativetime.2months": "dua bulan yang lalu", + "relativetime.1year": "tahun lalu", + "relativetime.2years": "dua tahun yang lalu", + "repo.pulls.already_merged": "Penggabungan (merge) gagal: Permintaan pull (pull request) ini sudah digabungkan.", + "repo.pulls.maintainers_can_edit": "Pengelola dapat mengedit permintaan pull ini.", + "repo.pulls.maintainers_cannot_edit": "Pengelola tidak dapat mengedit permintaan pull ini.", + "repo.form.cannot_create": "Semua ruang di mana Anda dapat membuat repositori telah mencapai batas jumlah repositori.", + "migrate.form.error.url_credentials": "URL tersebut mengandung kredensial, masukkan kredensial tersebut ke dalam kolom nama pengguna dan kata sandi masing-masing", + "migrate.github.description": "Migrasikan data dari github.com atau server GitHub Enterprise.", + "migrate.git.description": "Migrasikan repositori hanya dari layanan Git mana pun.", + "migrate.gitea.description": "Migrasikan data dari gitea.com atau instance Gitea lainnya.", + "migrate.gitlab.description": "Migrasikan data dari gitlab.com atau instance GitLab lainnya.", + "migrate.gogs.description": "Migrasikan data dari notabug.org atau instance Gogs lainnya.", + "migrate.onedev.description": "Migrasikan data dari code.onedev.io atau instance OneDev lainnya.", + "migrate.gitbucket.description": "Migrasikan data dari instance GitBucket.", + "migrate.codebase.description": "Migrasikan data dari codebasehq.com.", + "migrate.forgejo.description": "Migrasikan data dari codeberg.org atau instance Forgejo lainnya.", + "repo.issue_indexer.title": "Indeks Masalah", + "search.milestone_kind": "Cari milestone…", + "repo.settings.push_mirror.branch_filter.label": "Filter cabang (opsional)", + "repo.settings.push_mirror.branch_filter.description": "Cabang yang akan disalin. Biarkan kosong untuk menyalin semua cabang. Lihat %[2]s dokumentasi untuk sintaksis. Contoh: main, release/*", + "incorrect_root_url": "Instance Forgejo ini dikonfigurasi untuk diakses melalui “%s”. Saat ini Anda mengakses Forgejo melalui URL yang berbeda, yang dapat menyebabkan sebagian fungsi aplikasi tidak berfungsi dengan baik. URL kanonik dikendalikan oleh admin Forgejo melalui pengaturan ROOT_URL di berkas app.ini.", + "themes.names.forgejo-auto": "Forgejo (mengikuti tema sistem)", + "themes.names.forgejo-light": "Forgejo terang", + "themes.names.forgejo-dark": "Forgejo gelap", + "error.not_found.title": "Halaman tidak ditemukan", + "warning.repository.out_of_sync": "Representasi basis data repositori ini tidak sinkron. Jika peringatan ini masih ditampilkan setelah melakukan commit ke repositori ini, hubungi administrator.", + "alert.asset_load_failed": "Gagal memuat berkas aset dari {path}. Pastikan berkas aset dapat diakses.", + "alert.range_error": " Harus berupa angka antara %[1]s dan %[2]s.", + "install.invalid_lfs_path": "Tidak dapat membuat direktori root LFS di jalur yang ditentukan: %[1]s", + "profile.actions.tooltip": "Lebih banyak tindakan", + "profile.edit.link": "Edit profil", + "feed.atom.link": "Atom feed", + "keys.ssh.link": "Kunci SSH", + "keys.gpg.link": "Kunci GPG", + "admin.config.moderation_config": "Konfigurasi moderasi", + "admin.moderation.moderation_reports": "Konfigurasi moderasi", + "admin.moderation.reports": "Laporan", + "admin.moderation.no_open_reports": "Saat ini tidak ada laporan yang terbuka.", + "admin.moderation.deleted_content_ref": "Konten yang dilaporkan dengan tipe %[1]v dan ID %[2]d tidak lagi tersedia", + "moderation.report_abuse": "Laporkan penyalahgunaan", + "moderation.report_content": "Isi laporan", + "moderation.report_abuse_form.header": "Laporkan penyalahgunaan kepada administrator", + "moderation.report_abuse_form.details": "Formulir ini harus digunakan untuk melaporkan pengguna yang membuat profil spam, repositori, masalah, komentar, atau berperilaku tidak pantas.", + "moderation.report_abuse_form.invalid": "Argumen tidak valid", + "moderation.report_abuse_form.already_reported": "Anda sudah melaporkan konten ini", + "moderation.abuse_category": "Kategori", + "moderation.abuse_category.placeholder": "Pilih kategori", + "moderation.abuse_category.spam": "Spam", + "moderation.abuse_category.illegal_content": "Konten ilegal", + "moderation.abuse_category.other_violations": "Pelanggaran lain terhadap aturan platform", + "moderation.report_remarks": "Catatan", + "moderation.report_remarks.placeholder": "Silakan berikan beberapa detail mengenai penyalahgunaan yang Anda laporkan.", + "moderation.submit_report": "Kirimkan laporan", + "moderation.reporting_failed": "Tidak dapat kirimkan laporan penyalahgunaan baru: %v", + "moderation.reported_thank_you": "Terima kasih atas laporan yang Anda sampaikan. Pihak administrasi telah mengetahui hal tersebut.", + "mail.actions.successful_run_after_failure_subject": "Alur kerja %[1] telah dipulihkan di repositori %[2]", + "mail.actions.not_successful_run_subject": "Alur kerja %[1] gagal di repositori %[2]", + "mail.actions.successful_run_after_failure": "Alur kerja %[1] telah dipulihkan di repositori %[2]", + "mail.actions.not_successful_run": "Alur kerja %[1] gagal di repositori %[2]", + "mail.actions.run_info_cur_status": "Status Lari Ini: %[1]s (baru saja diperbarui dari %[2]s)", + "mail.actions.run_info_previous_status": "Status Eksekusi Sebelumnya: %[1]s", + "mail.actions.run_info_sha": "Komitmen: %[1]s", + "mail.actions.run_info_trigger": "Dipicu oleh: %[1]s oleh: %[2]s", + "mail.issue.action.close_by_commit": "%[1]s ditutup %[2]s dalam commit %[3]s.", + "repo.diff.commit.next-short": "Selanjutnya", + "repo.diff.commit.previous-short": "Sebelumnya", + "discussion.locked": "Diskusi ini telah dikunci. Komentar hanya dapat dilakukan oleh kontributor.", + "discussion.sidebar.reference": "Referensi", + "editor.textarea.tab_hint": "Baris sudah diindentasi. Tekan Tab lagi atau Escape untuk keluar dari editor.", + "editor.textarea.shift_tab_hint": "Tidak ada indentasi pada baris ini. Tekan Shift + Tab lagi atau Escape untuk keluar dari editor.", + "admin.auths.allow_username_change": "Izinkan perubahan nama pengguna", + "admin.auths.allow_username_change.description": "Izinkan pengguna untuk mengubah nama pengguna mereka di pengaturan profil", + "admin.dashboard.cleanup_offline_runners": "Pembersihan pelari offline", + "admin.dashboard.remove_resolved_reports": "Hapus laporan yang telah diselesaikan", + "admin.config.security": "Konfigurasi keamanan", + "admin.config.global_2fa_requirement.title": "Persyaratan dua faktor global", + "admin.config.global_2fa_requirement.none": "Tidak", + "admin.config.global_2fa_requirement.all": "Semua pengguna", + "admin.config.global_2fa_requirement.admin": "Administrator", + "settings.visibility.description": "Visibilitas profil memengaruhi kemampuan orang lain untuk mengakses repositori non-pribadi Anda. Pelajari lebih lanjut.", + "settings.twofa_unroll_unavailable": "Otentikasi dua faktor diwajibkan untuk akun Anda dan tidak dapat dinonaktifkan.", + "settings.twofa_reenroll": "Aktifkan kembali otentikasi dua faktor", + "settings.twofa_reenroll.description": "Daftarkan ulang otentikasi dua faktor Anda", + "settings.must_enable_2fa": "Instance Forgejo ini mengharuskan pengguna untuk mengaktifkan otentikasi dua faktor sebelum mereka dapat mengakses akun mereka.", + "error.must_enable_2fa": "Instance Forgejo ini mengharuskan pengguna untuk mengaktifkan otentikasi dua faktor sebelum mereka dapat mengakses akun mereka. Aktifkan di: %s", + "avatar.constraints_hint": "Avatar kustom tidak boleh melebihi %[1]s dalam ukuran atau lebih besar dari %[2]dx%[3]d piksel", + "user.ghost.tooltip": "Pengguna ini telah dihapus, atau tidak dapat diidentifikasi.", + "og.repo.summary_card.alt_description": "Kartu ringkasan repositori %[1]s, dijelaskan sebagai: %[2]s", + "repo.commit.load_tags_failed": "Pemuatan tag gagal karena kesalahan internal", + "compare.branches.title": "Bandingkan cabang", + "migrate.pagure.description": "Migrasikan data dari pagure.io atau instance Pagure lainnya.", + "migrate.pagure.incorrect_url": "URL repositori sumber yang salah telah disediakan", + "migrate.pagure.project_url": "URL Proyek Pagure", + "migrate.pagure.project_example": "URL proyek Pagure, misalnya https://pagure.io/pagure", + "migrate.pagure.token_label": "Token API Pagure", + "migrate.pagure.private_issues.summary": "Masalah Pribadi (Opsional)", + "migrate.pagure.private_issues.description": "Fitur ini dirancang untuk membuat repositori kedua yang hanya berisi masalah pribadi dari proyek Pagure Anda untuk tujuan arsip. Pertama, lakukan migrasi normal (tanpa token) untuk mengimpor semua konten publik. Kemudian, jika Anda memiliki masalah pribadi yang ingin disimpan, buat repositori terpisah menggunakan opsi token ini untuk mengarsipkan masalah pribadi tersebut.", + "migrate.pagure.private_issues.warning": "Pastikan untuk mengatur visibilitas repositori di atas menjadi Pribadi jika Anda menggunakan kunci API untuk mengimpor masalah pribadi. Hal ini mencegah pengungkapan konten pribadi secara tidak sengaja di repositori publik.", + "migrate.pagure.token.placeholder": "Hanya untuk membuat arsip masalah pribadi", + "actions.runs.run_attempt_label": "Upaya eksekusi #%[1]s (%[2]s)", + "actions.runs.viewing_out_of_date_run": "Anda sedang melihat hasil eksekusi yang sudah kadaluwarsa dari tugas ini yang dijalankan pada %[1]s.", + "actions.runs.view_most_recent_run": "Lihat hasil terbaru", + "actions.workflow.job_parsing_error": "Tidak dapat memproses pekerjaan dalam alur kerja: %v", + "actions.workflow.event_detection_error": "Tidak dapat memproses peristiwa yang didukung dalam alur kerja: %v", + "actions.workflow.pre_execution_error": "Alur kerja tidak dijalankan karena terjadi kesalahan yang menghalangi upaya eksekusi.", + "meta.last_line": "Terima kasih telah menerjemahkan Forgejo! Baris ini tidak terlihat oleh pengguna, tetapi memiliki fungsi lain dalam manajemen terjemahan. Anda dapat menambahkan fakta menarik dalam terjemahan alih-alih menerjemahkannya." } diff --git a/options/locale_next/locale_it-IT.json b/options/locale_next/locale_it-IT.json index 240c11492a..fee4263633 100644 --- a/options/locale_next/locale_it-IT.json +++ b/options/locale_next/locale_it-IT.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s download", + "other": "%s downloads" + }, "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", @@ -137,14 +141,12 @@ "user.ghost.tooltip": "Questo utente è stato eliminato, o non può essere trovato.", "og.repo.summary_card.alt_description": "Scheda di riepilogo del repositorio %[1]s, descritta come: %[2]s", "repo.commit.load_tags_failed": "Caricamento dei tag fallito a causa di un errore interno", - "migrate.pagure.token_body_a": "Fornisci un token API di Pagure con accesso alle segnalazioni private per creare un repositorio che contenga solo le segnalazioni private", "actions.runs.run_attempt_label": "Esegui tentativo #%[1]s (%[2]s)", "actions.runs.viewing_out_of_date_run": "Stai visualizzando un'esecuzione obsoleta di questo lavoro che è stata eseguita il %[1]s.", "actions.runs.view_most_recent_run": "Visualizza l'esecuzione più recente", "settings.visibility.description": "La visibilità del profilo influisce sulla capacità degli altri di accedere ai tuoi repository non privati. Scopri di più.", "error.must_enable_2fa": "Questa istanza Forgejo richiede che gli utenti attivino la verifica in due passaggi prima di poter accedere ai propri account. Attivala su: %s", "migrate.pagure.token_label": "Token", - "migrate.pagure.token_body_b": "Assicurati di impostare sopra l'attributo del repositorio privato se desideri che questo repositorio sia privato", "admin.config.security": "Configurazione della sicurezza", "admin.config.global_2fa_requirement.title": "Requisito globale di autenticazione a due fattori", "admin.config.global_2fa_requirement.none": "No", @@ -159,10 +161,15 @@ "settings.twofa_reenroll.description": "Reinserisci la verifica in due passaggi", "pulse.n_active_issues": { "one": "%s segnalazione attiva", - "other": "%s segnalazioni attive" + "many": "%s segnalazioni attive", + "other": "" }, "pulse.n_active_prs": { "one": "%s richiesta di modifica attiva", - "other": "%s richieste di modifiche attive" - } + "many": "%s richieste di modifiche attive", + "other": "" + }, + "repo.pulls.maintainers_can_edit": "I gestori possono modificare questa richiesta di modifica.", + "repo.pulls.maintainers_cannot_edit": "I gestori non possono modificare questa richiesta di modifica.", + "migrate.pagure.private_issues.summary": "Segnalazioni Private (opzionale)" } diff --git a/options/locale_next/locale_ja-JP.json b/options/locale_next/locale_ja-JP.json index 8a10c328f5..f8d25020cf 100644 --- a/options/locale_next/locale_ja-JP.json +++ b/options/locale_next/locale_ja-JP.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s のダウンロード", + "other": "%s のダウンロード" + }, "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_kab.json b/options/locale_next/locale_kab.json index 143ed17608..e64c287a38 100644 --- a/options/locale_next/locale_kab.json +++ b/options/locale_next/locale_kab.json @@ -9,5 +9,25 @@ "repo.diff.commit.previous-short": "Uzwir", "admin.config.global_2fa_requirement.none": "Uhu", "admin.config.global_2fa_requirement.admin": "Inedbalen", - "migrate.pagure.token_label": "Ajiṭun" + "migrate.pagure.token_label": "Ajiṭun API n Pagure", + "home.explore_repos": "Snirem ikufan", + "home.explore_users": "Snirem iseqdacen", + "relativetime.1week": "dduṛt yezrin", + "relativetime.1month": "ayyur yezrin", + "relativetime.1year": "ilindi", + "themes.names.forgejo-light": "Forgejo aceɛlal", + "themes.names.forgejo-dark": "Forgejo ubrik", + "profile.actions.tooltip": "Ugar n tigawin", + "profile.edit.link": "Ẓreg amaɣnu", + "keys.ssh.link": "Tasarut SSH", + "keys.gpg.link": "Tisura GPG", + "admin.config.security": "Tawila n tɣellist", + "admin.config.global_2fa_requirement.all": "Akk iseqdacen", + "relativetime.2days": "sin n wussan aya", + "relativetime.2months": "sin n wayyuren aya", + "relativetime.2years": "sin n iseggasen aya", + "error.not_found.title": "Asebtar ulac-it", + "moderation.abuse_category.placeholder": "Fren taggayt", + "migrate.pagure.project_url": "Tansa URL n usenfar Pagure", + "themes.names.forgejo-auto": "Forgejo (akken i yella usentel n unagraw)" } diff --git a/options/locale_next/locale_lv-LV.json b/options/locale_next/locale_lv-LV.json index 8d10c04a18..573e335aab 100644 --- a/options/locale_next/locale_lv-LV.json +++ b/options/locale_next/locale_lv-LV.json @@ -1,4 +1,9 @@ { + "release.n_downloads": { + "zero": "%s lejupielāžu", + "one": "%s lejupielāde", + "other": "%s lejupielādes" + }, "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", @@ -129,9 +134,7 @@ "migrate.pagure.incorrect_url": "Ir norādīts nepareizs avota glabātavas URL", "migrate.pagure.project_url": "Pagure projekta URL", "migrate.pagure.project_example": "Pagure projekta URL, piem., https://pagure.io/pagure", - "migrate.pagure.token_label": "Pilnvara", - "migrate.pagure.token_body_a": "Jānorāda Pagura API pilnvara ar piekļuvi privātajiem pieteikumiem, lai izveidotu glabātavu tikai ar privātiem pieteikumiem tajā", - "migrate.pagure.token_body_b": "Jāpārliecinās, ka augstāk ir iestatīts privātas glabātavas karogs, ja vēlies, lai šī glabātava būtu privāta", + "migrate.pagure.token_label": "Pagure API ilnvara", "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.gitea.description": "Pārcelt datus no gitea.com vai citiem Gitea serveriem.", @@ -160,11 +163,21 @@ "repo.pulls.maintainers_can_edit": "Uzturētāji var labot šo izmaiņu pieprasījumu.", "repo.pulls.maintainers_cannot_edit": "Uzturētāji nevar labot šo izmaiņu pieprasījumu.", "pulse.n_active_issues": { + "zero": "%s atvērtu pieteikumu", "one": "%s atvērts pieteikums", "other": "%s atvērti pieteikumi" }, "pulse.n_active_prs": { + "zero": "%s atvērtu izmaiņu pieprasījumu", "one": "%s atvērts izmaiņu pieprasījums", "other": "%s atvērti izmaiņu pieprasījumi" - } + }, + "mail.issue.action.close_by_commit": "%[1] aizvēra %[2]s iesūtījumā %[3]s.", + "migrate.pagure.private_issues.summary": "Privātie pieteikumi (izvēles)", + "migrate.pagure.private_issues.description": "Šī iespēja ir izstrādāta, lai izveidotu otrēju glabātavu, kurā arhivēšanas nolūkā atrodas tikai privātie pieteikumi no Pagure projekta. Vispirms jāveic parasta pārcelšana (bez pilnvaras), lai ievietotu visu publisko saturu. Tad, ja ir saglabājami privāti pieteikumi, jāizveido atsevišķa glabātava, izmantojot šo pilnvaras iespēju, lai arhivētu privātos pieteikumus.", + "migrate.pagure.private_issues.warning": "Jāpārliecinās, ka glabātavas redzamība augstāk ir iestatīta kā privāta, ja izmanto API atslēgu, lai ievietotu privātos pieteikumus. Tas novērš nejaušu privāta satura atklāšanu publiskā glabātavā.", + "migrate.pagure.token.placeholder": "Tikai privātu pieteikumu arhīva izveidošanai", + "actions.workflow.job_parsing_error": "Nebija iespējams apstrādāt darbus darbplūsmā: %v", + "actions.workflow.event_detection_error": "Nebija iespējams apstrādāt atbalstītos notikumus darbplūsmā: %v", + "actions.workflow.pre_execution_error": "Darbplūsma netika izpildīta kļūdas, kura aizturēja izpildes mēģinājumu, dēļ." } diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json index 63315d17ca..c1c8ed9635 100644 --- a/options/locale_next/locale_nds.json +++ b/options/locale_next/locale_nds.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s maal runnerladen", + "other": "%s maal runnerladen" + }, "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" @@ -121,10 +125,8 @@ "migrate.pagure.description": "Daten vun pagure.io of anner Pagure-Instanzen umtrecken.", "migrate.pagure.project_url": "Pagure-Projekt-URL", "migrate.pagure.project_example": "De URL vum Projekt up Pagure, to’n Bispööl https://pagure.io/pagure", - "migrate.pagure.token_label": "Teken", - "migrate.pagure.token_body_b": "Wees wiss, boven the Flagg för een privaates Repo to setten, wenn du willst, dat deeses Repo privaat wesen sall", + "migrate.pagure.token_label": "Pagure-API-Teken", "migrate.pagure.incorrect_url": "Ungültige Quell-Repositoriums-URL is angeven worden", - "migrate.pagure.token_body_a": "Giff een Pagure-API-Teken mit Togang to de privaaten Gefallens an, um een Repositorium mit blots the privaaten Gefallens daarin to maken", "migrate.github.description": "Daten vun github.com of eenem GitHub-Enterprise-Server umtrecken.", "migrate.git.description": "Een Repositorium blots vun elkeen Git-Deenst umtrecken.", "migrate.gitea.description": "Daten vun gitea.com of anner Gitea-Instanzen umtrecken.", @@ -158,5 +160,13 @@ "pulse.n_active_prs": { "one": "%s aktiiv Haalvörslag", "other": "%s aktiiv Haalvörslagen" - } + }, + "migrate.pagure.private_issues.summary": "Privaate Gefallens (wenn du willst)", + "migrate.pagure.token.placeholder": "Blots, um een Archiv vun privaaten Gefallens to maken", + "migrate.pagure.private_issues.description": "Deese Funktioon lett di een twedes Repositorium maken, wat blots privaate Gefallens ut dienem Pagure-Projekt för Archivzwecken enthollt. Maak toeerst eenen normaalen Umtreck (sünner een Teken), um alle publiken Inhollen to importeren. Dann, wenn du privaate Gefallens hest, wat du behollen willst, maak noch een anner Repositorium mit deesem Teken, um deese privaaten Gefallens to archiveren.", + "migrate.pagure.private_issues.warning": "Wees wiss, de Sichtbaarkeid vun de Repositorium up Privaat to setten, wenn du de API-Slötel bruukst, um privaate Gefallens to importeren. Dat verhinnert, dat du privaaten Inholl ut Versehn in eenem publiken Repositorium blootmaakst.", + "mail.issue.action.close_by_commit": "%[1]s hett %[2]s in Kommitteren %[3]s dichtmaakt.", + "actions.workflow.job_parsing_error": "Kann de Upgaven in de Warkwies nich lesen: %v", + "actions.workflow.event_detection_error": "Kann de unnerstütt Vörfallen in de Warkwies nich lesen: %v", + "actions.workflow.pre_execution_error": "Warkwies is nich utföhrt worden, denn een Fehler is uptreden, wat de Utföhrens-Versöök blockeert hett." } diff --git a/options/locale_next/locale_nl-NL.json b/options/locale_next/locale_nl-NL.json index 300776bc13..426d8eb644 100644 --- a/options/locale_next/locale_nl-NL.json +++ b/options/locale_next/locale_nl-NL.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s download", + "other": "%s downloads" + }, "repo.pulls.merged_title_desc": { "one": "heeft %[1]d commit van %[2]s samengevoegd in %[3]s %[4]s", "other": "heeft %[1]d commits van %[2]s samengevoegd in %[3]s %[4]s" @@ -123,8 +127,6 @@ "migrate.pagure.project_url": "Pagure-project URL", "migrate.pagure.project_example": "De url van het Pagure-project, bijvoorbeeld https://pagure.io/pagure", "migrate.pagure.token_label": "Token", - "migrate.pagure.token_body_a": "Geef een Pagure API-token met toegang tot de privé-issues om een repository te maken met alleen de privé-issues erin", - "migrate.pagure.token_body_b": "Zorg ervoor dat u de vlag voor privé-repository hierboven instelt als u wilt dat deze repository privé is", "migrate.github.description": "Migreer gegevens van github.com of GitHub Enterprise server.", "migrate.git.description": "Migreer een repositorie van elke Git service.", "migrate.gitea.description": "Gegevens overzetten van gitea.com of andere Gitea instanties.", diff --git a/options/locale_next/locale_pl-PL.json b/options/locale_next/locale_pl-PL.json index 1a1625efe8..7845a5e12d 100644 --- a/options/locale_next/locale_pl-PL.json +++ b/options/locale_next/locale_pl-PL.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s pobranie", + "many": "%s pobrania" + }, "repo.pulls.merged_title_desc": { "one": "scala %[1]d commit z %[2]s do %[3]s %[4]s", "few": "scala %[1]d commity z %[2]s do %[3]s %[4]s", @@ -111,10 +115,14 @@ "repo.diff.commit.previous-short": "Poprzedni", "pulse.n_active_issues": { "one": "%s aktywne zgłoszenie", - "many": "%s aktywne zgłoszenia" + "few": "%s aktywne zgłoszenia", + "many": "" }, "pulse.n_active_prs": { "one": "%s aktywny pull request", - "many": "%s aktywne pull requesty" - } + "few": "%s aktywne pull requesty", + "many": "" + }, + "repo.pulls.maintainers_can_edit": "Opiekunowie mogą edytować ten pull request.", + "repo.pulls.maintainers_cannot_edit": "Opiekunowie nie mogą edytować tego pull requestu." } diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json index 9cdb40688c..3106af1471 100644 --- a/options/locale_next/locale_pt-BR.json +++ b/options/locale_next/locale_pt-BR.json @@ -1,4 +1,9 @@ { + "release.n_downloads": { + "one": "%s download", + "many": "%s downloads", + "other": "%s downloads" + }, "repo.pulls.merged_title_desc": { "one": "mesclou %[1]d commit de %[2]s em %[3]s %[4]s", "many": "mesclou %[1]d de commits de %[2]s em %[3]s %[4]s", @@ -11,7 +16,7 @@ }, "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.welcome.activity_hint": "Ainda não tem nada no seu feed. Suas Actions 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", @@ -125,7 +130,6 @@ "admin.auths.allow_username_change.description": "Permitir que usuários alterem seus nomes de usuário nas configurações do perfil", "repo.commit.load_tags_failed": "Carregamento de etiquetas falhou devido a um erro interno", "migrate.pagure.description": "Migre dados do pagure.io ou outras instâncias do Pagure.", - "migrate.pagure.token_body_a": "Forneça um token da API Pagure com acesso aos issues privados para criar um repositório com apenas os issues privados nele", "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.gitea.description": "Migrar dados de gitea.com ou de outras instâncias do Gitea.", @@ -140,8 +144,7 @@ "migrate.pagure.incorrect_url": "Uma URL incorreta do repositório fonte foi fornecida", "migrate.pagure.project_example": "URL do projeto Pagure, por exemplo: https://pagure.io/pagure", "migrate.pagure.project_url": "URL do projeto Pagure", - "migrate.pagure.token_label": "Token", - "migrate.pagure.token_body_b": "Certifique-se de definir o sinalizador de repositório privado acima se você deseja que este repositório seja privado", + "migrate.pagure.token_label": "Token de API Pagure", "admin.config.global_2fa_requirement.title": "Exigência global de segundo fator", "admin.config.global_2fa_requirement.none": "Não", "admin.config.global_2fa_requirement.all": "Todos os usuários", @@ -161,10 +164,20 @@ "repo.pulls.maintainers_cannot_edit": "Mantenedores não podem editar este pull request.", "pulse.n_active_issues": { "one": "%s issue ativa", - "other": "%s issues ativas" + "many": "%s issues ativas", + "other": "" }, "pulse.n_active_prs": { "one": "%s pull request ativo", + "many": "%s pull requests ativos", "other": "%s pull requests ativos" - } + }, + "migrate.pagure.private_issues.summary": "Questões Privadas (Opcional)", + "migrate.pagure.private_issues.description": "Esta funcionalidade foi projetada para criar um segundo repositório contendo somente questões privadas do seu projeto Pagure para a finalidade de arquivo. Primeiro, faça uma migração normal (sem token) para importar todo o conteúdo público. Depois, se você tem questões privadas que deseja preservar, crie um repositório separado usando esta opção de token para arquivar estas questões privadas.", + "migrate.pagure.private_issues.warning": "Certifique-se de definir a visibilidade do repositório acima para Privado se você está usando a chave de API para importar questões privadas. Isso evita expor acidentalmente conteúdo privado em um repositório público.", + "migrate.pagure.token.placeholder": "Somente para criar um arquivo de questões privadas", + "mail.issue.action.close_by_commit": "%[1]s fechou %[2]s no commit %[3]s.", + "actions.workflow.job_parsing_error": "Não foi possível processar alguns trabalhos do workflow: %v", + "actions.workflow.event_detection_error": "Não foi possível processar eventos suportados no workflow: %v", + "actions.workflow.pre_execution_error": "Workflow não foi executado devido a um erro que bloqueou a tentativa de execução." } diff --git a/options/locale_next/locale_pt-PT.json b/options/locale_next/locale_pt-PT.json index a1d01ee47e..715a812079 100644 --- a/options/locale_next/locale_pt-PT.json +++ b/options/locale_next/locale_pt-PT.json @@ -1,4 +1,9 @@ { + "release.n_downloads": { + "one": "%s descarga", + "many": "%s descargas", + "other": "%s descargas" + }, "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", @@ -140,9 +145,7 @@ "migrate.pagure.incorrect_url": "Foi fornecida uma URL incorreta do repositório de origem", "migrate.pagure.project_url": "URL do projeto Pagure", "migrate.pagure.project_example": "URL do projeto Pagure, por exemplo, https://pagure.io/pagure", - "migrate.pagure.token_label": "Token", - "migrate.pagure.token_body_a": "Forneça um token da API Pagure com acesso às questões privadas para criar um repositório contendo apenas as questões privadas", - "migrate.pagure.token_body_b": "Certifique-se de definir o marcador de repositório privado acima se desejar que este repositório seja privado", + "migrate.pagure.token_label": "Código da API do Pagure", "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.gitea.description": "Migrar dados de gitea.com ou de outras instâncias do Gitea.", @@ -159,10 +162,22 @@ "actions.runs.view_most_recent_run": "Ver execução mais recente", "pulse.n_active_issues": { "one": "%s questão vigente", + "many": "%s questões vigentes", "other": "%s questões vigentes" }, "pulse.n_active_prs": { "one": "%s pedido de integração vigente", + "many": "%s pedidos de integração vigentes", "other": "%s pedidos de integração vigentes" - } + }, + "repo.pulls.maintainers_can_edit": "Os responsáveis podem editar este pedido de integração.", + "repo.pulls.maintainers_cannot_edit": "Os responsáveis não podem editar este pedido de integração.", + "mail.issue.action.close_by_commit": "%[1]s fechou %[2]s no cometimento %[3]s.", + "migrate.pagure.private_issues.summary": "Questões privadas (opcional)", + "migrate.pagure.private_issues.description": "Esta funcionalidade está desenhada para criar um segundo repositório contendo apenas questões privadas do seu repositório Pagure para efeitos de arquivo. Primeiro, faça uma migração normal (sem um código) para importar todo o conteúdo público. Depois, se tiver questões privadas a preservar, crie um repositório separado usando esta opção com código para arquivar essas questões privadas.", + "migrate.pagure.private_issues.warning": "Certifique-se que passa a visibilidade do repositório para Privado se estiver a usar a chave de API para importar questões privadas. Isso irá evitar que exponha acidentalmente conteúdo privado num repositório público.", + "migrate.pagure.token.placeholder": "Somente para criar arquivo com questões privadas", + "actions.workflow.job_parsing_error": "Não foi possível analisar os trabalhos na sequência de trabalho: %v", + "actions.workflow.event_detection_error": "Não foi possível analisar eventos suportados na sequência de trabalho: %v", + "actions.workflow.pre_execution_error": "A sequência de trabalho não foi executada por causa de um erro que bloqueou a tentativa de execução." } diff --git a/options/locale_next/locale_pt.json b/options/locale_next/locale_pt.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/options/locale_next/locale_pt.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json index 36c0e500fb..71762b6e91 100644 --- a/options/locale_next/locale_ru-RU.json +++ b/options/locale_next/locale_ru-RU.json @@ -1,4 +1,9 @@ { + "release.n_downloads": { + "one": "%s скачивание", + "few": "%s скачивания", + "many": "%s скачиваний" + }, "repo.pulls.merged_title_desc": { "one": "слит %[1]d коммит из %[2]s в %[3]s %[4]s", "few": "слито %[1]d коммита из %[2]s в %[3]s %[4]s", @@ -23,7 +28,7 @@ "alert.asset_load_failed": "Не удалось получить ресурсы из {path}. Убедитесь, что файлы ресурсов доступны.", "install.invalid_lfs_path": "Не удалось расположить корень LFS по указанному пути: %[1]s", "alert.range_error": " - число должно быть в диапазоне от %[1]s-%[2]s.", - "meta.last_line": "This magic string will cause Codeberg Translate to create a new pull request in the Forgejo repository. Test.", + "meta.last_line": "This magic string will cause Codeberg Translate to create a new pull request in the Forgejo repository. Again.", "mail.actions.not_successful_run_subject": "Провал раб. потока %[1]s в репозитории %[2]s", "mail.actions.successful_run_after_failure_subject": "Возобновление раб. потока %[1]s в репозитории %[2]s", "mail.actions.run_info_trigger": "Причина срабатывания: %[1]s by: %[2]s", @@ -140,9 +145,7 @@ "migrate.pagure.incorrect_url": "Введена неправильная ссылка на источник", "migrate.pagure.project_url": "Ссылка проекта на Pagure", "migrate.pagure.project_example": "Ссылка проекта. Например, https://pagure.io/pagure", - "migrate.pagure.token_label": "Токен", - "migrate.pagure.token_body_a": "Если предоставить токен API Pagure с доступом к секретным задачам проекта, будет создан отдельный репозиторий, в котором они будут размещены", - "migrate.pagure.token_body_b": "Поставьте флажок на пункте видимости репозитория выше, если хотите, чтобы этот репозиторий был частным", + "migrate.pagure.token_label": "Токен API Pagure", "migrate.github.description": "Перенести данные с github.com или сервера GitHub Enterprise.", "migrate.git.description": "Перенести Git-репозиторий из любого совместимого сервиса.", "migrate.gitea.description": "Перенести данные с gitea.com или другого сервера Gitea.", @@ -161,10 +164,20 @@ "repo.pulls.maintainers_cannot_edit": "Сопровождающие не могут вносить правки.", "pulse.n_active_issues": { "one": "%s активная задача", + "few": "%s активных задачи", "many": "%s активных задач" }, "pulse.n_active_prs": { "one": "%s активный запрос слияния", + "few": "%s активных запроса слияния", "many": "%s активных запросов слияния" - } + }, + "migrate.pagure.private_issues.summary": "Скрытые задачи (необязательно)", + "migrate.pagure.private_issues.description": "Эта функция позволяет создать дополнительный репозиторий для архивации в нём скрытых задач из вашего проекта Pagure. Сперва выполните нормальный перенос репозитория без токена, чтобы скопировать всё публичное содержимое. Затем, если нужно, выполните ещё один перенос и укажите токен, чтобы разместить скрытые задачи в дополнительном репозитории.", + "migrate.pagure.private_issues.warning": "Не забудьте указать видимость репозитория как Частную при переносе скрытых задач, чтобы их никто не увидел.", + "migrate.pagure.token.placeholder": "Только для переноса скрытых задач", + "mail.issue.action.close_by_commit": "%[1]s закрыл %[2]s из коммита %[2]s.", + "actions.workflow.job_parsing_error": "Не удалось прочитать задачи в раб. потоке: %v", + "actions.workflow.event_detection_error": "Не удалось прочитать поддерживаемые события в раб. потоке: %v", + "actions.workflow.pre_execution_error": "Рабочий поток не был выполнен из-за ошибки, возникшей при попытке начать выполнение." } diff --git a/options/locale_next/locale_sk-SK.json b/options/locale_next/locale_sk-SK.json index f665801786..fc71d1b6fb 100644 --- a/options/locale_next/locale_sk-SK.json +++ b/options/locale_next/locale_sk-SK.json @@ -96,7 +96,6 @@ "moderation.reported_thank_you": "Ďakujeme za Vaše hlásenie. Administrátori boli o ňom informovaný.", "admin.dashboard.cleanup_offline_runners": "Vymazať odpojené spúštače", "migrate.pagure.project_example": "URL adresa projektu Pagure, napr. https://pagure.io/pagure", - "migrate.pagure.token_body_a": "Poskytnite API token rozhrania Pagure s prístupom k súkromným problémom, aby ste vytvorili repozitár, ktorý bude obsahovať iba súkromné problémy", "migrate.gitea.description": "Migrovať dáta z gitea.com alebo iných inštancií Gitea.", "migrate.gitlab.description": "Migrovať dáta z gitlab.com alebo iných inštancií GitLab.", "migrate.gogs.description": "Migrovať dáta z notabug.org alebo iných inštancií Gogs.", @@ -124,7 +123,6 @@ "settings.twofa_reenroll.description": "Znovu zaregistrujte Vaše dvojfaktorové overenie", "settings.must_enable_2fa": "Táto inštancia Forgejo vyžaduje, aby používatelia povolili dvojfaktorové overenie predtým, ako budú môcť pristupovať k svojim účtom.", "error.must_enable_2fa": "Táto inštancia Forgejo vyžaduje, aby používatelia povolili dvojfaktorové overenie predtým, ako budú môcť pristupovať k svojim účtom. Povolíte ho tu: %s", - "migrate.pagure.token_body_b": "Ak chcete, aby bol tento repozitár súkromný, nezabudnite vyššie nastaviť príznak súkromného repozitára", "meta.last_line": "Ďakujem za preklad Forgejo! Tento riadok používatelia nevidia, ale slúži na iné účely v správe prekladov. Namiesto prekladu môžete do prekladu vložiť zaujímavý fakt.", "moderation.abuse_category": "Kategória", "warning.repository.out_of_sync": "Databázová reprezentácia tohto repozitára nie je synchronizovaná. Ak sa toto upozornenie zobrazuje aj po odoslaní commitu do tohto repozitára, kontaktujte administrátora.", diff --git a/options/locale_next/locale_sv-SE.json b/options/locale_next/locale_sv-SE.json index bbaa863369..a0344468cb 100644 --- a/options/locale_next/locale_sv-SE.json +++ b/options/locale_next/locale_sv-SE.json @@ -93,7 +93,7 @@ "moderation.abuse_category.placeholder": "Välj en kategori", "moderation.abuse_category.spam": "Skräppost", "moderation.abuse_category.malware": "Skadlig kod", - "settings.visibility.description": "Profilens synlighet påverkar andras möjlighet att komma åt dina icke-privata förråd. Läs mer", + "settings.visibility.description": "Profilens synlighet påverkar andras möjlighet att komma åt dina icke-privata förråd. Läs mer.", "avatar.constraints_hint": "Anpassade avatarer får inte vara större än %[1] eller %[2]dx%[3] bildpunkter", "og.repo.summary_card.alt_description": "Sammanfattningskort för arkivet %[1]s, beskrivet som: %[2]s", "profile.actions.tooltip": "Fler åtgärder", @@ -104,7 +104,6 @@ "repo.diff.commit.previous-short": "Föreg", "feed.atom.link": "Atom-flöde", "repo.pulls.already_merged": "Sammanfogning misslyckades: Denna pulka förfrågning har redan blivit sammanfogad.", - "feed.atom.link": "Atom-flöde", "pulse.n_active_issues": { "one": "%s aktivt ärende", "other": "%s aktiva ärenden" @@ -112,5 +111,62 @@ "pulse.n_active_prs": { "one": "%s aktiv pull-förfrågan", "other": "%s aktiva pull-förfrågningar" - } + }, + "migrate.form.error.url_credentials": "URL:en innehåller inloggningsuppgifter, sätt dem i respektive användarnamn- och lösenordsfält", + "migrate.git.description": "Migrera endast utvecklingskatalogen från vilken Git-tjänst som helst.", + "migrate.gitea.description": "Migrera data från gitea.com eller andra Gitea-instanser.", + "migrate.gitlab.description": "Migrera data från gitlab.com eller annan GitLab-instans.", + "migrate.gogs.description": "Migrera data från notabug.org eller annan Gogs-instans.", + "migrate.onedev.description": "Migrera data från code.onedev.io eller annan OneDev-instans.", + "migrate.gitbucket.description": "Migrera data från GitBucket-instans.", + "migrate.codebase.description": "Migrera data från codebasehq.com.", + "migrate.forgejo.description": "Migrera data från codeberg.org eller annan Forgejo-instans.", + "repo.settings.push_mirror.branch_filter.label": "Grenfilter (frivilligt)", + "repo.settings.push_mirror.branch_filter.description": "Grenar att speglas. Lämna tom för att spegla alla grenar. Se %[2]s dokumentation för syntax. Exempel: main, release/*", + "admin.moderation.moderation_reports": "Moderationsrapporter", + "admin.moderation.reports": "Rapporter", + "admin.moderation.no_open_reports": "Det finns för tillfället inga öppna rapporter.", + "mail.actions.run_info_sha": "Commit: %[1]s", + "discussion.sidebar.reference": "Referens", + "admin.auths.allow_username_change": "Tillåt användarnamnsändring", + "admin.auths.allow_username_change.description": "Tillåt användare att ändra sitt användarnamn i profilinställningarna", + "admin.dashboard.remove_resolved_reports": "Ta bort lösta rapporter", + "admin.config.security": "Säkerhetskonfiguration", + "admin.config.global_2fa_requirement.title": "Globalt tvåfaktorskrav", + "admin.config.global_2fa_requirement.none": "Nej", + "admin.config.global_2fa_requirement.all": "Alla användare", + "admin.config.global_2fa_requirement.admin": "Administratörer", + "settings.twofa_unroll_unavailable": "Tvåfaktorsautentisering krävs för ditt konto och kan inte inaktiveras.", + "settings.must_enable_2fa": "Denna Forgejo-instans kräver användare att aktivera tvåfaktorsautentisering innan de kan komma at deras konto.", + "error.must_enable_2fa": "Denna Forgejo-instans kräver användare att aktivera tvåfaktorsautentisering innan de kan komma åt deras konto. Aktivera det på: %s", + "repo.commit.load_tags_failed": "Laddning av taggar misslyckades på grund av internt fel", + "compare.branches.title": "Jämför grenar", + "migrate.pagure.description": "Migrera data från pagure.io eller andra Pagure-instanser.", + "migrate.pagure.project_url": "Pagure projekt-URL", + "migrate.pagure.project_example": "Pagure-projektets URL, t.ex. https://pagure.io/pagure", + "migrate.pagure.token_label": "Pagure API-token", + "actions.runs.run_attempt_label": "Kör försök #%[1]s (%[2]s)", + "migrate.github.description": "Migrera data från github.com eller GitHub Enterprise server.", + "repo.pulls.maintainers_can_edit": "Underhållsansvariga kan redigera denna pull-begäran.", + "repo.pulls.maintainers_cannot_edit": "Underhållsansvariga kan inte redigera denna pull-begäran.", + "mail.issue.action.close_by_commit": "%[1]s stängde %[2]s i commit %[3]s.", + "user.ghost.tooltip": "Denna användare har tagits bort eller kan inte matchas.", + "migrate.pagure.private_issues.summary": "Privata ärenden (valfritt)", + "release.n_downloads": { + "one": "%s nedladdning", + "other": "%s nedladdningar" + }, + "actions.runs.view_most_recent_run": "Visa senaste körning", + "actions.workflow.job_parsing_error": "Kunde inte tolka jobb i arbetsflöde: %v", + "actions.workflow.pre_execution_error": "Arbetsflödet kördes inte på grund av ett fel som blockerade körningsförsöket.", + "warning.repository.out_of_sync": "Databasrepresentationen av detta arkiv är inte synkroniserad. Om denna varning fortfarande visas efter att du har skickat en commit till detta arkiv, kontakta administratören.", + "admin.moderation.deleted_content_ref": "Rapporterat innehåll med typ %[1]v och id %[2]d finns inte längre", + "settings.twofa_reenroll": "Registrera om tvåfaktorsautentisering", + "settings.twofa_reenroll.description": "Registrera om din tvåfaktorsautentisering", + "migrate.pagure.incorrect_url": "Felaktig URL till källarkivet har angetts", + "migrate.pagure.private_issues.description": "Denna funktion är utformad för att skapa ett andra arkiv som endast innehåller privata ärenden från ditt Pagure-projekt för arkiveringsändamål. Utför först en normal migrering (utan token) för att importera allt publika innehåll. Om du har privata ärenden som du vill bevara skapar du sedan ett separat arkiv med hjälp av denna token-option för att arkivera dessa privata ärenden.", + "migrate.pagure.private_issues.warning": "Se till att ställa in synligheten för arkivet ovan till Privat om du använder API-nyckeln för att importera privata ärenden. Detta förhindrar att privat innehåll av misstag exponeras i ett publikt arkiv.", + "migrate.pagure.token.placeholder": "Endast för att skapa privata ärendearkiv", + "actions.runs.viewing_out_of_date_run": "Du tittar på en föråldrad körning av detta jobb som utfördes %[1]s.", + "actions.workflow.event_detection_error": "Det går inte att tolka stödda händelser i arbetsflödet: %v" } diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json index 4380990e46..509985daed 100644 --- a/options/locale_next/locale_uk-UA.json +++ b/options/locale_next/locale_uk-UA.json @@ -1,4 +1,9 @@ { + "release.n_downloads": { + "one": "%s завантаження", + "few": "%s завантаження", + "many": "%s завантажень" + }, "repo.pulls.merged_title_desc": { "one": "об'єднує %[1]d коміт з %[2]s в %[3]s %[4]s", "few": "об'єднує %[1]d коміти з %[2]s в %[3]s %[4]s", @@ -127,12 +132,10 @@ "warning.repository.out_of_sync": "База даних цього репозиторію не синхронізована. Якщо ви знову бачите це попередження після відправлення коміту в цей репозиторій, зверніться до адміністратора.", "repo.pulls.already_merged": "Не вдалося об'єднати: цей запит на злиття вже об'єднано.", "migrate.pagure.description": "Перенести дані з pagure.io або інших екземплярів Pagure.", - "migrate.pagure.token_label": "Токен", + "migrate.pagure.token_label": "Токен API Pagure", "migrate.pagure.project_url": "URL-адреса проєкту Pagure", "migrate.pagure.project_example": "URL-адреса проєкту Pagure, наприклад, https://pagure.io/pagure", - "migrate.pagure.token_body_b": "Якщо хочете зробити цей репозиторій приватним, обов'язково встановіть прапорець «Приватний репозиторій» вище", "migrate.pagure.incorrect_url": "Вказано неправильну URL-адресу репозиторію-джерела", - "migrate.pagure.token_body_a": "Уведіть токен API Pagure з доступом до приватних задач, щоб створити репозиторій, який міститиме лише приватні задачі", "migrate.github.description": "Перенести дані з github.com або сервера GitHub Enterprise.", "migrate.git.description": "Перенести репозиторій з будь-якої служби Git.", "migrate.gitea.description": "Перенести дані з gitea.com та інших екземплярів Gitea.", @@ -161,10 +164,20 @@ "repo.pulls.maintainers_cannot_edit": "Супроводжувачі не можуть редагувати цей запит на злиття.", "pulse.n_active_issues": { "one": "%s активна задача", + "few": "%s активних задачі", "many": "%s активних задач" }, "pulse.n_active_prs": { "one": "%s активний запит на злиття", + "few": "%s активних запити на злиття", "many": "%s активних запитів на злиття" - } + }, + "migrate.pagure.private_issues.summary": "Приватні задачі (необов'язково)", + "migrate.pagure.private_issues.description": "Ця функція дозволяє створити додатковий репозиторій для архівування в ньому приватних задач із вашого проєкту Pagure. Спочатку виконайте звичайну міграцію (без токена), щоб імпортувати весь публічний вміст. Потім, якщо у вас є приватні задачі, які потрібно зберегти, створіть окремий репозиторій, використовуючи токен, щоб архівувати ці приватні задачі.", + "migrate.pagure.private_issues.warning": "Обов'язково встановіть видимість репозиторію на «Приватний», якщо використовуєте ключ API для імпорту приватних задач. Це запобігає випадковому розкриттю приватного вмісту в публічному репозиторії.", + "migrate.pagure.token.placeholder": "Тільки для створення архіву приватних задач", + "mail.issue.action.close_by_commit": "%[1]s закриває %[2]s в коміті %[3]s.", + "actions.workflow.job_parsing_error": "Не вдалося розібрати завдання в робочому потоці: %v", + "actions.workflow.event_detection_error": "Не вдалося розібрати підтримувані події в робочому потоці: %v", + "actions.workflow.pre_execution_error": "Спробу виконання робочого потоку було заблоковано через помилку." } diff --git a/options/locale_next/locale_uz.json b/options/locale_next/locale_uz.json index 0967ef424b..69da5f01f1 100644 --- a/options/locale_next/locale_uz.json +++ b/options/locale_next/locale_uz.json @@ -1 +1,45 @@ -{} +{ + "home.explore_repos": "Omborlarni kashf etish", + "home.explore_users": "Foydalanuvchilarni kashf etish", + "home.explore_orgs": "`tashkilotlarni` kashf etish", + "stars.list.none": "Hech kim bu omborga yulduz bosmagan.", + "watch.list.none": "Bu ombor hech kimning ko'ruv'ida emas", + "followers.incoming.list.self.none": "Hech kim sizning profilingizga tirkalmagan.", + "followers.incoming.list.none": "Hech kim bu foydalanuvchiga tirkalmagan.", + "followers.outgoing.list.self.none": "Siz hech kimga tirkalmagansiz.", + "followers.outgoing.list.none": "%s hech kimga tirkalmagan.", + "relativetime.now": "hozir", + "relativetime.future": "kelajakda", + "relativetime.mins": { + "one": "%d daqiqa oldin.", + "other": "%d daqiqa oldin." + }, + "relativetime.hours": { + "one": "%d soat oldin.", + "other": "%d soat oldin." + }, + "relativetime.days": { + "one": "%d kun oldin.", + "other": "%d kun oldin." + }, + "relativetime.weeks": { + "one": "%d hafta oldin.", + "other": "%d hafta oldin." + }, + "relativetime.months": { + "one": "%d oy oldin.", + "other": "%d oy oldin." + }, + "relativetime.years": { + "one": "%d yil oldin.", + "other": "%d yil oldin." + }, + "relativetime.1day": "kecha", + "relativetime.2days": "2 kun oldin", + "relativetime.1week": "oxirgi hafta", + "relativetime.2weeks": "ikki hafta oldin", + "relativetime.1month": "oxirgi oy", + "relativetime.2months": "ikki oy oldin", + "relativetime.1year": "oxirgi yil", + "relativetime.2years": "ikki yil oldin" +} diff --git a/options/locale_next/locale_vi.json b/options/locale_next/locale_vi.json index 01931302ae..24b751d544 100644 --- a/options/locale_next/locale_vi.json +++ b/options/locale_next/locale_vi.json @@ -111,7 +111,6 @@ "migrate.pagure.incorrect_url": "URL kho mã nguồn được cung cấp không chính xác", "migrate.pagure.project_url": "URL dự án Pagure", "migrate.pagure.project_example": "URL dự án Pagure, vd: https://pagure.io/pagure", - "migrate.pagure.token_body_b": "Đảm bảo đặt nhãn kho mã riêng tư ở trên nếu bạn muốn kho mã này trở nên riêng tư", "actions.runs.run_attempt_label": "Lần chạy #%[1]s (%[2]s)", "actions.runs.viewing_out_of_date_run": "Bạn đang xem một lần chạy lỗi thời của công việc này mà đã chạy %[1]s.", "actions.runs.view_most_recent_run": "Xem lần chạy gần đây nhất", diff --git a/options/locale_next/locale_zh-CN.json b/options/locale_next/locale_zh-CN.json index 2dfcc89264..3d83d164fc 100644 --- a/options/locale_next/locale_zh-CN.json +++ b/options/locale_next/locale_zh-CN.json @@ -1,4 +1,5 @@ { + "release.n_downloads": "%s 次下载", "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": "搜索里程碑…", @@ -15,7 +16,7 @@ "alert.asset_load_failed": "无法从 {path} 加载资源文件。请确保资源文件可被访问。", "install.invalid_lfs_path": "无法在指定路径创建 LFS 根目录:%[1]s", "alert.range_error": " 必须是一个介于 %[1]s 和 %[2]s 之间的数字。", - "meta.last_line": "感谢各位对Forgejo翻译的支持和帮助!不需要翻译这个。", + "meta.last_line": "感谢各位对Forgejo翻译的支持和帮助!不需要翻译这个。(三维鱼)。", "mail.actions.successful_run_after_failure_subject": "仓库 %[2]s 中的工作流 %[1]s 已恢复", "mail.actions.not_successful_run_subject": "仓库 %[2]s 中的工作流 %[1]s 已失败", "mail.actions.successful_run_after_failure": "仓库 %[2]s 中的工作流 %[1]s 已恢复", @@ -116,21 +117,23 @@ "migrate.pagure.incorrect_url": "提供了错误的源仓库URL", "migrate.pagure.project_url": "Pagure 项目 URL", "migrate.pagure.project_example": "Pagure 项目 URL,例如:https://pagure.io/pagure", - "migrate.pagure.token_label": "令牌", - "migrate.pagure.token_body_a": "提供可访问私有议题的 Pagure API 令牌以创建一个只有私有议题的仓库", - "migrate.pagure.token_body_b": "如果你希望此仓库为私有,记得选择上面的私有仓库选项!", + "migrate.pagure.token_label": "Pagure API 令牌", "repo.pulls.already_merged": "合并失败:此合并请求已被合并。", "user.ghost.tooltip": "该用户已被删除或无法找到。", "migrate.form.error.url_credentials": "URL 包含凭据,请分别将凭据填入用户名和密码字段", "actions.runs.view_most_recent_run": "查看最新运行", "actions.runs.run_attempt_label": "运行尝试 #%[1]s(%[2]s)", "actions.runs.viewing_out_of_date_run": "您正在查看于 %[1]s 执行的过期运行。", - "pulse.n_active_issues": { - "one": "%s 项活动的议题", - "other": "%s 项活动的议题" - }, - "pulse.n_active_prs": { - "one": "%s 个活跃合并请求", - "other": "%s 个活跃合并请求" - } + "pulse.n_active_issues": "%s 项活动的议题", + "pulse.n_active_prs": "%s 个活跃的合并请求", + "repo.pulls.maintainers_can_edit": "维护者可以编辑此合并请求。", + "repo.pulls.maintainers_cannot_edit": "维护者无法编辑此合并请求。", + "migrate.pagure.private_issues.summary": "私有议题(可选)", + "migrate.pagure.private_issues.description": "此功能将创建一个单独的、只包含私有议题的仓库,以供存档。首先,不带令牌进行一次普通迁移以导入公开内容,然后若有需要,填写令牌并再次迁移以创建一个新的仓库并存档私有议题。", + "migrate.pagure.private_issues.warning": "请确保在导入私有议题时将仓库可见性设置为私有,以避免意外将私有内容泄漏至公开仓库。", + "migrate.pagure.token.placeholder": "仅用于创建私有议题归档", + "mail.issue.action.close_by_commit": "%[1]s 于提交 %[3]s 中关闭了 %[2]s。", + "actions.workflow.job_parsing_error": "无法解析工作流中的任务:%v", + "actions.workflow.event_detection_error": "无法解析工作流中受支持的事件:%v", + "actions.workflow.pre_execution_error": "因有错误阻止了执行尝试,工作流未被执行。" } diff --git a/options/locale_next/locale_zh-TW.json b/options/locale_next/locale_zh-TW.json index f3b5ef74e8..58ecf296ed 100644 --- a/options/locale_next/locale_zh-TW.json +++ b/options/locale_next/locale_zh-TW.json @@ -1,4 +1,8 @@ { + "release.n_downloads": { + "one": "%s 次下載", + "other": "%s 次下載" + }, "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 de5803560d..e6f26f6110 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,8 +16,8 @@ "@mcaptcha/vanilla-glue": "0.1.0-alpha-3", "@primer/octicons": "19.14.0", "ansi_up": "6.0.5", - "asciinema-player": "3.8.2", - "chart.js": "4.5.0", + "asciinema-player": "3.12.1", + "chart.js": "4.5.1", "chartjs-adapter-dayjs-4": "1.0.4", "chartjs-plugin-zoom": "2.2.0", "clippie": "4.1.7", @@ -25,18 +25,18 @@ "dayjs": "1.11.18", "dropzone": "6.0.0-beta.2", "easymde": "2.18.0", - "esbuild-loader": "4.3.0", + "esbuild-loader": "4.4.0", "escape-goat": "4.0.0", "fast-glob": "3.3.3", "htmx.org": "2.0.7", "idiomorph": "0.3.0", "jquery": "3.7.1", - "katex": "0.16.23", + "katex": "0.16.24", "mermaid": "11.12.0", "mini-css-extract-plugin": "2.9.3", "minimatch": "10.0.3", "monaco-editor": "0.52.2", - "monaco-editor-webpack-plugin": "7.1.0", + "monaco-editor-webpack-plugin": "7.1.1", "pdfobject": "2.3.0", "postcss": "8.5.6", "postcss-loader": "8.2.0", @@ -56,49 +56,49 @@ "vue-chartjs": "5.3.1", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", - "webpack": "5.102.0", + "webpack": "5.102.1", "webpack-cli": "6.0.1", "wrap-ansi": "9.0.2" }, "devDependencies": { "@axe-core/playwright": "4.10.2", "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", - "@playwright/test": "1.55.1", + "@playwright/test": "1.56.0", "@stoplight/spectral-cli": "6.15.0", - "@stylistic/eslint-plugin": "5.2.3", + "@stylistic/eslint-plugin": "5.4.0", "@stylistic/stylelint-plugin": "4.0.0", "@vitejs/plugin-vue": "6.0.1", "@vitest/coverage-v8": "3.2.4", - "@vitest/eslint-plugin": "1.3.13", + "@vitest/eslint-plugin": "1.3.16", "@vue/test-utils": "2.4.6", - "eslint": "9.33.0", + "eslint": "9.37.0", "eslint-import-resolver-typescript": "4.4.4", - "eslint-plugin-array-func": "5.0.2", + "eslint-plugin-array-func": "5.1.0", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-no-jquery": "3.1.1", "eslint-plugin-no-use-extend-native": "0.7.2", "eslint-plugin-playwright": "2.2.2", "eslint-plugin-regexp": "2.10.0", - "eslint-plugin-sonarjs": "3.0.4", + "eslint-plugin-sonarjs": "3.0.5", "eslint-plugin-toml": "0.12.0", - "eslint-plugin-unicorn": "61.0.1", + "eslint-plugin-unicorn": "61.0.2", "eslint-plugin-vitest-globals": "1.5.0", - "eslint-plugin-vue": "10.4.0", - "eslint-plugin-vue-scoped-css": "2.11.0", - "eslint-plugin-wc": "3.0.1", + "eslint-plugin-vue": "10.5.1", + "eslint-plugin-vue-scoped-css": "2.12.0", + "eslint-plugin-wc": "3.0.2", "globals": "16.4.0", - "happy-dom": "18.0.1", + "happy-dom": "20.0.1", "license-checker-rseidelsohn": "4.4.2", "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", "sharp": "0.34.4", - "stylelint": "16.23.1", + "stylelint": "16.25.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "4.0.0", "typescript": "5.9.3", - "typescript-eslint": "8.39.0", + "typescript-eslint": "8.46.1", "vite-string-plugin": "1.4.6", "vitest": "3.2.4" }, @@ -146,9 +146,9 @@ } }, "node_modules/@antfu/utils": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-9.2.1.tgz", - "integrity": "sha512-TMilPqXyii1AsiEii6l6ubRzbo76p6oshUSYPaKsmXDavyMLqjzVDkcp3pHp5ELMUNJHATcEOGxKTTsX9yYhGg==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-9.3.0.tgz", + "integrity": "sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" @@ -303,11 +303,24 @@ } }, "node_modules/@cacheable/utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.0.3.tgz", - "integrity": "sha512-m7Rce68cMHlAUjvWBy9Ru1Nmw5gU0SjGGtQDdhpe6E0xnbcvrIY0Epy//JU1VYYBUTzrG9jvgmTauULGKzOkWA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.1.0.tgz", + "integrity": "sha512-ZdxfOiaarMqMj+H7qwlt5EBKWaeGihSYVHdQv5lUsbn8MJJOTW82OIwirQ39U5tMZkNvy3bQE+ryzC+xTAb9/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "keyv": "^5.5.3" + } + }, + "node_modules/@cacheable/utils/node_modules/keyv": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.3.tgz", + "integrity": "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } }, "node_modules/@chevrotain/cst-dts-gen": { "version": "11.0.3", @@ -1150,19 +1163,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1247,9 +1263,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", - "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", "dev": true, "license": "MIT", "engines": { @@ -1270,13 +1286,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.16.0", "levn": "^0.4.1" }, "engines": { @@ -2075,9 +2091,9 @@ } }, "node_modules/@keyv/bigmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.0.2.tgz", - "integrity": "sha512-KR03xkEZlAZNF4IxXgVXb+uNIVNvwdh8UwI0cnc7WI6a+aQcDp8GL80qVfeB4E5NpsKJzou5jU0r6yLSSbMOtA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.0.3.tgz", + "integrity": "sha512-jUEkNlnE9tYzX2AIBeoSe1gVUvSOfIOQ5EFPL5Un8cFHGvjD9L/fxpxlS1tEivRLHgapO2RZJ3D93HYAa049pg==", "dev": true, "license": "MIT", "dependencies": { @@ -2167,9 +2183,9 @@ } }, "node_modules/@mermaid-js/parser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.2.tgz", - "integrity": "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", + "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", "license": "MIT", "dependencies": { "langium": "3.3.1" @@ -2266,13 +2282,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.55.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.1.tgz", - "integrity": "sha512-IVAh/nOJaw6W9g+RJVlIQJ6gSiER+ae6mKQ5CX1bERzQgbC1VSeBlwdvczT7pxb0GWiyrxH4TGKbMfDb4Sq/ig==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.0.tgz", + "integrity": "sha512-Tzh95Twig7hUwwNe381/K3PggZBZblKUe2wv25oIpzWLr6Z0m4KgV1ZVIjnR6GM9ANEqjZD7XsZEa6JL/7YEgg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.55.1" + "playwright": "1.56.0" }, "bin": { "playwright": "cli.js" @@ -2355,9 +2371,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", - "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", "cpu": [ "arm" ], @@ -2369,9 +2385,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", - "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", "cpu": [ "arm64" ], @@ -2383,9 +2399,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", - "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", "cpu": [ "arm64" ], @@ -2397,9 +2413,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", - "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", "cpu": [ "x64" ], @@ -2411,9 +2427,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", - "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", "cpu": [ "arm64" ], @@ -2425,9 +2441,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", - "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", "cpu": [ "x64" ], @@ -2439,9 +2455,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", - "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", "cpu": [ "arm" ], @@ -2453,9 +2469,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", - "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", "cpu": [ "arm" ], @@ -2467,9 +2483,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", - "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", "cpu": [ "arm64" ], @@ -2481,9 +2497,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", - "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", "cpu": [ "arm64" ], @@ -2495,9 +2511,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", - "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", "cpu": [ "loong64" ], @@ -2509,9 +2525,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", - "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", "cpu": [ "ppc64" ], @@ -2523,9 +2539,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", - "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", "cpu": [ "riscv64" ], @@ -2537,9 +2553,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", - "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", "cpu": [ "riscv64" ], @@ -2551,9 +2567,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", - "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", "cpu": [ "s390x" ], @@ -2565,9 +2581,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", - "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", "cpu": [ "x64" ], @@ -2579,9 +2595,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", - "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", "cpu": [ "x64" ], @@ -2593,9 +2609,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", - "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", "cpu": [ "arm64" ], @@ -2607,9 +2623,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", - "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", "cpu": [ "arm64" ], @@ -2621,9 +2637,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", - "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", "cpu": [ "ia32" ], @@ -2635,9 +2651,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", - "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", "cpu": [ "x64" ], @@ -2649,9 +2665,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", - "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", "cpu": [ "x64" ], @@ -2662,6 +2678,36 @@ "win32" ] }, + "node_modules/@solid-primitives/refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@solid-primitives/refs/-/refs-1.1.2.tgz", + "integrity": "sha512-K7tf2thy7L+YJjdqXspXOg5xvNEOH8tgEWsp0+1mQk3obHBRD6hEjYZk7p7FlJphSZImS35je3UfmWuD7MhDfg==", + "license": "MIT", + "dependencies": { + "@solid-primitives/utils": "^6.3.2" + }, + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, + "node_modules/@solid-primitives/transition-group": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@solid-primitives/transition-group/-/transition-group-1.1.2.tgz", + "integrity": "sha512-gnHS0OmcdjeoHN9n7Khu8KNrOlRc8a2weETDt2YT6o1zeW/XtUC6Db3Q9pkMU/9cCKdEmN4b0a/41MKAHRhzWA==", + "license": "MIT", + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, + "node_modules/@solid-primitives/utils": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-6.3.2.tgz", + "integrity": "sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==", + "license": "MIT", + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, "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", @@ -3170,14 +3216,14 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.2.3.tgz", - "integrity": "sha512-oY7GVkJGVMI5benlBDCaRrSC1qPasafyv5dOBLLv5MTilMGnErKhO6ziEfodDDIZbo5QxPUNW360VudJOFODMw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.4.0.tgz", + "integrity": "sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/types": "^8.38.0", + "@eslint-community/eslint-utils": "^4.9.0", + "@typescript-eslint/types": "^8.44.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", @@ -3613,9 +3659,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.19.tgz", - "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", + "version": "20.19.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.21.tgz", + "integrity": "sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -3665,17 +3711,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.0.tgz", - "integrity": "sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.1.tgz", + "integrity": "sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/type-utils": "8.39.0", - "@typescript-eslint/utils": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/type-utils": "8.46.1", + "@typescript-eslint/utils": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -3689,61 +3735,11 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.39.0", + "@typescript-eslint/parser": "^8.46.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", - "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", - "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", @@ -3755,16 +3751,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.0.tgz", - "integrity": "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.1.tgz", + "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", "debug": "^4.3.4" }, "engines": { @@ -3779,65 +3775,15 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", - "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", - "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/project-service": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.0.tgz", - "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.1.tgz", + "integrity": "sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.39.0", - "@typescript-eslint/types": "^8.39.0", + "@typescript-eslint/tsconfig-utils": "^8.46.1", + "@typescript-eslint/types": "^8.46.1", "debug": "^4.3.4" }, "engines": { @@ -3852,14 +3798,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", - "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz", + "integrity": "sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0" + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3870,9 +3816,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz", - "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.1.tgz", + "integrity": "sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==", "dev": true, "license": "MIT", "engines": { @@ -3887,15 +3833,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.0.tgz", - "integrity": "sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.1.tgz", + "integrity": "sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/utils": "8.39.0", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1", + "@typescript-eslint/utils": "8.46.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -3911,24 +3857,10 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/types": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", - "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.1.tgz", + "integrity": "sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", "dev": true, "license": "MIT", "engines": { @@ -3940,16 +3872,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz", - "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz", + "integrity": "sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.39.0", - "@typescript-eslint/tsconfig-utils": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/project-service": "8.46.1", + "@typescript-eslint/tsconfig-utils": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3968,38 +3900,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", - "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4034,16 +3934,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.0.tgz", - "integrity": "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.1.tgz", + "integrity": "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0" + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4057,64 +3957,14 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", - "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", - "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", - "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz", + "integrity": "sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/types": "8.46.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -4456,9 +4306,9 @@ } }, "node_modules/@vitest/eslint-plugin": { - "version": "1.3.13", - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.3.13.tgz", - "integrity": "sha512-QfzXd1+lCY3dIqPHOZlagA2bJYoWC5yAU3adv8Gks0rHAL6FpyXKYBiyMCuU6mRrbKUMphGqwDQobinOvYgJig==", + "version": "1.3.16", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.3.16.tgz", + "integrity": "sha512-EvXGiZpz3L1G/pmebcmMe61UzqgR8LFwmm+QGgQEHcrTCFkMgl+c0mj2jneo38/CkHhofbK3zc3xafV6/SpzNw==", "dev": true, "license": "MIT", "dependencies": { @@ -5171,29 +5021,6 @@ "node": ">=0.10.0" } }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -5204,25 +5031,6 @@ "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", @@ -5256,13 +5064,14 @@ } }, "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.12.1", + "resolved": "https://registry.npmjs.org/asciinema-player/-/asciinema-player-3.12.1.tgz", + "integrity": "sha512-X4tIjZEIsD7Keeu1cJbrsZZCbPSO85w2OiDRGui68JHQPjthIG2jh68TARDrf2CP2l1Lko4mevnBdwwmJfD0iw==", "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.21.0", - "solid-js": "^1.3.0" + "solid-js": "^1.3.0", + "solid-transition-group": "^0.2.3" } }, "node_modules/assertion-error": { @@ -5414,9 +5223,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.10.tgz", - "integrity": "sha512-uLfgBi+7IBNay8ECBO2mVMGZAc1VgZWEChxm4lv+TobGdG82LnXMjuNGo/BSSZZL4UmkWhxEHP2f5ziLNwGWMA==", + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz", + "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -5584,17 +5393,18 @@ } }, "node_modules/cacheable": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.0.3.tgz", - "integrity": "sha512-nZF80J3d8RMrroMSYm1E9pBllVDXWPuECZgEZxH+vusCY4MAXAJVrY0jutcHSgh3xYX3G2EUNnmtWGZVVjWCXw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.1.0.tgz", + "integrity": "sha512-zzL1BxdnqwD69JRT0dihnawAcLkBMwAH+hZSKjUzeBbPedVhk3qYPjRw9VOMYWwt5xRih5xd8S+3kEdGohZm/g==", "dev": true, "license": "MIT", "dependencies": { "@cacheable/memoize": "^2.0.3", "@cacheable/memory": "^2.0.3", - "@cacheable/utils": "^2.0.3", + "@cacheable/utils": "^2.1.0", "hookified": "^1.12.1", - "keyv": "^5.5.3" + "keyv": "^5.5.3", + "qified": "^0.5.0" } }, "node_modules/cacheable/node_modules/keyv": { @@ -5676,9 +5486,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001746", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz", - "integrity": "sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==", + "version": "1.0.30001750", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001750.tgz", + "integrity": "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==", "funding": [ { "type": "opencollective", @@ -5769,9 +5579,9 @@ } }, "node_modules/chart.js": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", - "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -5888,9 +5698,9 @@ } }, "node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, "funding": [ { @@ -6086,13 +5896,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", - "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", + "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.3" + "browserslist": "^4.26.3" }, "funding": { "type": "opencollective", @@ -7006,9 +6816,9 @@ } }, "node_modules/detect-libc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.1.tgz", - "integrity": "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -7228,9 +7038,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.228", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.228.tgz", - "integrity": "sha512-nxkiyuqAn4MJ1QbobwqJILiDtu/jk14hEAWaMiJmNPh1Z+jqoFlBFZjdXwLWGeVSeu9hGLg6+2G9yJaW8rBIFA==", + "version": "1.5.234", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.234.tgz", + "integrity": "sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -7283,9 +7093,9 @@ } }, "node_modules/envinfo": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.15.0.tgz", - "integrity": "sha512-chR+t7exF6y59kelhXw5I3849nTy7KIRO+ePdLMhCD+JRP/JvmkenDWP7QSFGlsHX+kxGxdDutOPrmj5j1HR6g==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.18.0.tgz", + "integrity": "sha512-02QGCLRW+Jb8PC270ic02lat+N57iBaWsvHjcJViqp6UVupRB+Vsg7brYPTqEFXvsdTql3KnSczv5ModZFpl8Q==", "license": "MIT", "bin": { "envinfo": "dist/cli.js" @@ -7450,19 +7260,6 @@ "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-to-primitive": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", @@ -7523,13 +7320,13 @@ } }, "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.4.0", + "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.4.0.tgz", + "integrity": "sha512-4J+hXTpTtEdzUNLoY8ReqDNJx2NoldfiljRCiKbeYUuZmVaiJeDqFgyAzz8uOopaekwRoCcqBFyEroGQLFVZ1g==", "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "get-tsconfig": "^4.7.0", + "get-tsconfig": "^4.10.1", "loader-utils": "^2.0.4", "webpack-sources": "^1.4.3" }, @@ -7575,20 +7372,20 @@ } }, "node_modules/eslint": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", - "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.33.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -7712,9 +7509,9 @@ } }, "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": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-array-func/-/eslint-plugin-array-func-5.1.0.tgz", + "integrity": "sha512-+OULB0IQdENBmBf8pHMPPObgV6QyfeXFin483jPonOaiurI9UFmc8UydWriK5f5Gel8xBhQLA6NzMwbck1BUJw==", "dev": true, "license": "MIT", "engines": { @@ -7845,9 +7642,9 @@ } }, "node_modules/eslint-plugin-sonarjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.4.tgz", - "integrity": "sha512-ftQcP811kRJNXapqpQXHErEoVOdTPfYPPYd7n3AExIPwv4qWKKHf4slFvXmodiOnfgy1Tl3waPZZLD7lcvJOtw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.5.tgz", + "integrity": "sha512-dI62Ff3zMezUToi161hs2i1HX1ie8Ia2hO0jtNBfdgRBicAG4ydy2WPt0rMTrAe3ZrlqhpAO3w1jcQEdneYoFA==", "dev": true, "license": "LGPL-3.0-only", "dependencies": { @@ -7855,7 +7652,7 @@ "builtin-modules": "3.3.0", "bytes": "3.1.2", "functional-red-black-tree": "1.0.1", - "jsx-ast-utils": "3.3.5", + "jsx-ast-utils-x": "0.1.0", "lodash.merge": "4.6.2", "minimatch": "9.0.5", "scslre": "0.3.0", @@ -7922,9 +7719,9 @@ } }, "node_modules/eslint-plugin-unicorn": { - "version": "61.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-61.0.1.tgz", - "integrity": "sha512-RwXXqS8oTxW7dVs6e4ZBpZkn1wB4qqNZSbCJektP8/Nzp/woJdfN/t7LVNcpGMZ57xWBs33K0ymZ7MV+VeQnbA==", + "version": "61.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-61.0.2.tgz", + "integrity": "sha512-zLihukvneYT7f74GNbVJXfWIiNQmkc/a9vYBTE4qPkQZswolWNdu+Wsp9sIXno1JOzdn6OUwLPd19ekXVkahRA==", "dev": true, "license": "MIT", "dependencies": { @@ -7957,6 +7754,33 @@ "eslint": ">=9.29.0" } }, + "node_modules/eslint-plugin-unicorn/node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "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", @@ -7965,9 +7789,9 @@ "license": "MIT" }, "node_modules/eslint-plugin-vue": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.4.0.tgz", - "integrity": "sha512-K6tP0dW8FJVZLQxa2S7LcE1lLw3X8VvB3t887Q6CLrFVxHYBXGANbXvwNzYIu6Ughx1bSJ5BDT0YB3ybPT39lw==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.5.1.tgz", + "integrity": "sha512-SbR9ZBUFKgvWAbq3RrdCtWaW0IKm6wwUiApxf3BVTNfqUIo4IQQmreMg2iHFJJ6C/0wss3LXURBJ1OwS/MhFcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7982,20 +7806,24 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { + "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "vue-eslint-parser": "^10.0.0" }, "peerDependenciesMeta": { + "@stylistic/eslint-plugin": { + "optional": true + }, "@typescript-eslint/parser": { "optional": true } } }, "node_modules/eslint-plugin-vue-scoped-css": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue-scoped-css/-/eslint-plugin-vue-scoped-css-2.11.0.tgz", - "integrity": "sha512-rrJgLY8iroTIUMSyxhyhJzFcRxABbk3gFrOLkl41F9G1VBqNNpDShyf6PmDoBEWDk07/bJlnqYlvnQ3giUrRYQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue-scoped-css/-/eslint-plugin-vue-scoped-css-2.12.0.tgz", + "integrity": "sha512-gEbuvYetNbsPA0IsmERFkVC2/vOHCInfFekNSOsAxWI/7C/bc8PoLal+fRibWfnzWryY6iL8YoluMtrEqWRj1A==", "dev": true, "license": "MIT", "dependencies": { @@ -8034,9 +7862,9 @@ } }, "node_modules/eslint-plugin-wc": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-3.0.1.tgz", - "integrity": "sha512-0p1wkSlA2Ue3FA4qW+5LZ+15sy0p1nUyVl1eyBMLq4rtN1LtE9IdI49BXNWMz8N8bM/y7Ulx8SWGAni5f8XO5g==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-3.0.2.tgz", + "integrity": "sha512-siwTrxPTw6GU2JmP3faInw8nhi0ZCnKsiSRM3j7EAkZmBTGYdDAToeseLYsvPrc5Urp/vPz+g7Ewh7XcICLxww==", "dev": true, "license": "MIT", "dependencies": { @@ -8660,9 +8488,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.12.0.tgz", + "integrity": "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==", "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -8865,9 +8693,9 @@ } }, "node_modules/happy-dom": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-18.0.1.tgz", - "integrity": "sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==", + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.0.1.tgz", + "integrity": "sha512-LLvZwSHE4XUB6m3G6GQCxfJik6Og7ChaRb4fs11dmPKz6QLqZIihUVsr7qum1VIrJdDQ1HvVlHX+XGMy4OJLTA==", "dev": true, "license": "MIT", "dependencies": { @@ -10224,20 +10052,14 @@ "node": ">=0.10.0" } }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "node_modules/jsx-ast-utils-x": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils-x/-/jsx-ast-utils-x-0.1.0.tgz", + "integrity": "sha512-eQQBjBnsVtGacsG9uJNB8qOr3yA8rga4wAaGG1qRcBzSIvfhERLrWxMAM1hp5fcS6Abo8M4+bUBTekYR0qTPQw==", "dev": true, "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, "engines": { - "node": ">=4.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/just-extend": { @@ -10247,9 +10069,9 @@ "license": "MIT" }, "node_modules/katex": { - "version": "0.16.23", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.23.tgz", - "integrity": "sha512-7VlC1hsEEolL9xNO05v9VjrvWZePkCVBJqj8ruICxYjZfHaHbaU53AlP+PODyFIXEnaEIEWi3wJy7FPZ95JAVg==", + "version": "0.16.24", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.24.tgz", + "integrity": "sha512-g/PXUTqqppA6XL2beQtIxoYBPdO1u3vnc2FHMQqJ53n9L5faHDm7UYa+tlYvnNQRuSX6eVusF30/v7ADkcFC8A==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -10450,12 +10272,16 @@ } }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -10893,9 +10719,9 @@ } }, "node_modules/mermaid/node_modules/marked": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz", - "integrity": "sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.0.tgz", + "integrity": "sha512-CTPAcRBq57cn3R8n3hwc2REddc28hjR7RzDXQ+lXLmMJYqn20BaI2cGw6QjgZGIgVfp2Wdfw4aMzgNteQ6qJgQ==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -11577,9 +11403,9 @@ "license": "MIT" }, "node_modules/monaco-editor-webpack-plugin": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-7.1.0.tgz", - "integrity": "sha512-ZjnGINHN963JQkFqjjcBtn1XBtUATDZBMgNQhDQwd78w2ukRhFXAPNgWuacaQiDZsUr4h1rWv5Mv6eriKuOSzA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-7.1.1.tgz", + "integrity": "sha512-WxdbFHS3Wtz4V9hzhe/Xog5hQRSMxmDLkEEYZwqMDHgJlkZo00HVFZR0j5d0nKypjTUkkygH3dDSXERLG4757A==", "license": "MIT", "dependencies": { "loader-utils": "^2.0.2" @@ -11631,9 +11457,9 @@ } }, "node_modules/napi-postinstall": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz", - "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, "license": "MIT", "bin": { @@ -11700,9 +11526,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", - "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", "license": "MIT" }, "node_modules/node-sarif-builder": { @@ -11855,25 +11681,6 @@ "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -11968,9 +11775,9 @@ "license": "BlueOak-1.0.0" }, "node_modules/package-manager-detector": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", - "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.4.0.tgz", + "integrity": "sha512-rRZ+pR1Usc+ND9M2NkmCvE/LYJS+8ORVV9X0KuNSY/gFsp7RBHJM/ADh9LYq4Vvfq6QkKrW6/weuh8SMEtN5gw==", "license": "MIT" }, "node_modules/parent-module": { @@ -12241,13 +12048,13 @@ } }, "node_modules/playwright": { - "version": "1.55.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.1.tgz", - "integrity": "sha512-cJW4Xd/G3v5ovXtJJ52MAOclqeac9S/aGGgRzLabuF8TnIb6xHvMzKIa6JmrRzUkeXJgfL1MhukP0NK6l39h3A==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.0.tgz", + "integrity": "sha512-X5Q1b8lOdWIE4KAoHpW3SE8HvUB+ZZsUoN64ZhjnN8dOb1UpujxBtENGiZFE+9F/yhzJwYa+ca3u43FeLbboHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.55.1" + "playwright-core": "1.56.0" }, "bin": { "playwright": "cli.js" @@ -12260,9 +12067,9 @@ } }, "node_modules/playwright-core": { - "version": "1.55.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.1.tgz", - "integrity": "sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.0.tgz", + "integrity": "sha512-1SXl7pMfemAMSDn5rkPeZljxOCYAmQnYLBTExuh6E8USHXGSX3dx6lYZN/xPpTz1vimXmPA9CDnILvmJaB8aSQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -12773,6 +12580,19 @@ "node": ">=6" } }, + "node_modules/qified": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.0.tgz", + "integrity": "sha512-Zj6Q/Vc/SQ+Fzc87N90jJUzBzxD7MVQ2ZvGyMmYtnl2u1a07CejAhvtk4ZwASos+SiHKCAIylyGHJKIek75QBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.12.1" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/quansync": { "version": "0.2.11", "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", @@ -13341,9 +13161,9 @@ "license": "ISC" }, "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -13711,6 +13531,23 @@ "seroval-plugins": "~1.3.0" } }, + "node_modules/solid-transition-group": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/solid-transition-group/-/solid-transition-group-0.2.3.tgz", + "integrity": "sha512-iB72c9N5Kz9ykRqIXl0lQohOau4t0dhel9kjwFvx81UZJbVwaChMuBuyhiZmK24b8aKEK0w3uFM96ZxzcyZGdg==", + "license": "MIT", + "dependencies": { + "@solid-primitives/refs": "^1.0.5", + "@solid-primitives/transition-group": "^1.0.2" + }, + "engines": { + "node": ">=18.0.0", + "pnpm": ">=8.6.0" + }, + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, "node_modules/sortablejs": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz", @@ -14001,9 +13838,9 @@ } }, "node_modules/strip-indent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.0.tgz", - "integrity": "sha512-OA95x+JPmL7kc7zCu+e+TeYxEiaIyndRx0OrBcK2QPPH09oAndr2ALvymxWA+Lx1PYYvFUm4O63pRkdJAaW96w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", "dev": true, "license": "MIT", "engines": { @@ -14047,9 +13884,9 @@ "license": "ISC" }, "node_modules/stylelint": { - "version": "16.23.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.23.1.tgz", - "integrity": "sha512-dNvDTsKV1U2YtiUDfe9d2gp902veFeo3ecCWdGlmLm2WFrAV0+L5LoOj/qHSBABQwMsZPJwfC4bf39mQm1S5zw==", + "version": "16.25.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.25.0.tgz", + "integrity": "sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ==", "dev": true, "funding": [ { @@ -14067,16 +13904,16 @@ "@csstools/css-tokenizer": "^3.0.4", "@csstools/media-query-list-parser": "^4.0.3", "@csstools/selector-specificity": "^5.0.0", - "@dual-bundle/import-meta-resolve": "^4.1.0", + "@dual-bundle/import-meta-resolve": "^4.2.1", "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.4.1", + "debug": "^4.4.3", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.1.3", + "file-entry-cache": "^10.1.4", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", @@ -14163,13 +14000,13 @@ } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.17", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.17.tgz", - "integrity": "sha512-Jzse4YoiUJBVYTwz5Bwl4h/2VQM7e2KK3MVAMlXzX9uamIHAH/TXUlRKU1AQGQOryQhN0EsmufiiF40G057YXA==", + "version": "6.1.18", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.18.tgz", + "integrity": "sha512-JUPnFgHMuAVmLmoH9/zoZ6RHOt5n9NlUw/sDXsTbROJ2SFoS2DS4s+swAV6UTeTbGH/CAsZIE6M8TaG/3jVxgQ==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^2.0.3", + "cacheable": "^2.1.0", "flatted": "^3.3.3", "hookified": "^1.12.0" } @@ -14525,9 +14362,9 @@ } }, "node_modules/tapable": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", - "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "license": "MIT", "engines": { "node": ">=6" @@ -15037,16 +14874,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.39.0.tgz", - "integrity": "sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.1.tgz", + "integrity": "sha512-VHgijW803JafdSsDO8I761r3SHrgk4T00IdyQ+/UsthtgPRsBWQLqoSxOolxTpxRKi1kGXK0bSz4CoAc9ObqJA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.39.0", - "@typescript-eslint/parser": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/utils": "8.39.0" + "@typescript-eslint/eslint-plugin": "8.46.1", + "@typescript-eslint/parser": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1", + "@typescript-eslint/utils": "8.46.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -15259,9 +15096,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.8.tgz", - "integrity": "sha512-oBXvfSHEOL8jF+R9Am7h59Up07kVVGH1NrFGFoEG6bPDZP3tGpQhvkBpy5x7U6+E6wZCu9OihsWgJqDbQIm8LQ==", + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", + "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", "dev": true, "license": "MIT", "dependencies": { @@ -15417,9 +15254,9 @@ } }, "node_modules/vite/node_modules/rollup": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", - "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15433,28 +15270,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.3", - "@rollup/rollup-android-arm64": "4.52.3", - "@rollup/rollup-darwin-arm64": "4.52.3", - "@rollup/rollup-darwin-x64": "4.52.3", - "@rollup/rollup-freebsd-arm64": "4.52.3", - "@rollup/rollup-freebsd-x64": "4.52.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", - "@rollup/rollup-linux-arm-musleabihf": "4.52.3", - "@rollup/rollup-linux-arm64-gnu": "4.52.3", - "@rollup/rollup-linux-arm64-musl": "4.52.3", - "@rollup/rollup-linux-loong64-gnu": "4.52.3", - "@rollup/rollup-linux-ppc64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-musl": "4.52.3", - "@rollup/rollup-linux-s390x-gnu": "4.52.3", - "@rollup/rollup-linux-x64-gnu": "4.52.3", - "@rollup/rollup-linux-x64-musl": "4.52.3", - "@rollup/rollup-openharmony-arm64": "4.52.3", - "@rollup/rollup-win32-arm64-msvc": "4.52.3", - "@rollup/rollup-win32-ia32-msvc": "4.52.3", - "@rollup/rollup-win32-x64-gnu": "4.52.3", - "@rollup/rollup-win32-x64-msvc": "4.52.3", + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", "fsevents": "~2.3.2" } }, @@ -15728,9 +15565,9 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.102.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.0.tgz", - "integrity": "sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==", + "version": "5.102.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", + "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -15741,7 +15578,7 @@ "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", - "browserslist": "^4.24.5", + "browserslist": "^4.26.3", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", @@ -15753,8 +15590,8 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.2.3", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" diff --git a/package.json b/package.json index 9cd14b418c..aabfec6263 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,8 @@ "@mcaptcha/vanilla-glue": "0.1.0-alpha-3", "@primer/octicons": "19.14.0", "ansi_up": "6.0.5", - "asciinema-player": "3.8.2", - "chart.js": "4.5.0", + "asciinema-player": "3.12.1", + "chart.js": "4.5.1", "chartjs-adapter-dayjs-4": "1.0.4", "chartjs-plugin-zoom": "2.2.0", "clippie": "4.1.7", @@ -24,18 +24,18 @@ "dayjs": "1.11.18", "dropzone": "6.0.0-beta.2", "easymde": "2.18.0", - "esbuild-loader": "4.3.0", + "esbuild-loader": "4.4.0", "escape-goat": "4.0.0", "fast-glob": "3.3.3", "htmx.org": "2.0.7", "idiomorph": "0.3.0", "jquery": "3.7.1", - "katex": "0.16.23", + "katex": "0.16.24", "mermaid": "11.12.0", "mini-css-extract-plugin": "2.9.3", "minimatch": "10.0.3", "monaco-editor": "0.52.2", - "monaco-editor-webpack-plugin": "7.1.0", + "monaco-editor-webpack-plugin": "7.1.1", "pdfobject": "2.3.0", "postcss": "8.5.6", "postcss-loader": "8.2.0", @@ -55,49 +55,49 @@ "vue-chartjs": "5.3.1", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", - "webpack": "5.102.0", + "webpack": "5.102.1", "webpack-cli": "6.0.1", "wrap-ansi": "9.0.2" }, "devDependencies": { "@axe-core/playwright": "4.10.2", "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", - "@playwright/test": "1.55.1", + "@playwright/test": "1.56.0", "@stoplight/spectral-cli": "6.15.0", - "@stylistic/eslint-plugin": "5.2.3", + "@stylistic/eslint-plugin": "5.4.0", "@stylistic/stylelint-plugin": "4.0.0", "@vitejs/plugin-vue": "6.0.1", "@vitest/coverage-v8": "3.2.4", - "@vitest/eslint-plugin": "1.3.13", + "@vitest/eslint-plugin": "1.3.16", "@vue/test-utils": "2.4.6", - "eslint": "9.33.0", + "eslint": "9.37.0", "eslint-import-resolver-typescript": "4.4.4", - "eslint-plugin-array-func": "5.0.2", + "eslint-plugin-array-func": "5.1.0", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-no-jquery": "3.1.1", "eslint-plugin-no-use-extend-native": "0.7.2", "eslint-plugin-playwright": "2.2.2", "eslint-plugin-regexp": "2.10.0", - "eslint-plugin-sonarjs": "3.0.4", + "eslint-plugin-sonarjs": "3.0.5", "eslint-plugin-toml": "0.12.0", - "eslint-plugin-unicorn": "61.0.1", + "eslint-plugin-unicorn": "61.0.2", "eslint-plugin-vitest-globals": "1.5.0", - "eslint-plugin-vue": "10.4.0", - "eslint-plugin-vue-scoped-css": "2.11.0", - "eslint-plugin-wc": "3.0.1", + "eslint-plugin-vue": "10.5.1", + "eslint-plugin-vue-scoped-css": "2.12.0", + "eslint-plugin-wc": "3.0.2", "globals": "16.4.0", - "happy-dom": "18.0.1", + "happy-dom": "20.0.1", "license-checker-rseidelsohn": "4.4.2", "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", "sharp": "0.34.4", - "stylelint": "16.23.1", + "stylelint": "16.25.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "4.0.0", "typescript": "5.9.3", - "typescript-eslint": "8.39.0", + "typescript-eslint": "8.46.1", "vite-string-plugin": "1.4.6", "vitest": "3.2.4" }, diff --git a/release-notes-published/13.0.0.md b/release-notes-published/13.0.0.md index 48cdce8528..7ab0679455 100644 --- a/release-notes-published/13.0.0.md +++ b/release-notes-published/13.0.0.md @@ -1 +1,499 @@ -placeholder +A [companion blog post](https://forgejo.org/2025-10-release-v13-0/) provides additional context on this major release. + +This release contains [a regression](https://codeberg.org/forgejo/forgejo/issues/9421) when `RENDER_CONTENT_MODE = iframe` is set in `app.ini` that sometime forces the height to be 300px. It will be fixed in [Forgejo v13.0.1](https://codeberg.org/forgejo/forgejo/milestone/29090). + + + +## Release notes + +- Security features + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8753): Add configurable global 2FA enforcement + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8692): migrate action secrets to `keying` to store them more securely +- Breaking features + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8328): bump the minimum required Git version from 2.0.0 to 2.34.1 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8502): Forgejo Actions workflows are verified with a YAML schema and common errors such as using an incorrect context (e.g. `${{ badcontext.FORGEJO_REPOSITORY }}`) or a typo in a required keyword (e.g. `ruins-on:` instead of `runs-on:`) will be reported in the action page and the web page that displays the file in the repository. It is recommended to verify existing workflows are successfully verified prior to upgrading, [as explained in the Forgejo runner release notes](https://code.forgejo.org/forgejo/runner/releases/tag/v9.0.0). +- Breaking bug fixes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9023): The `artifact-url` ouput [returned by the upload-artifact@v4 action](https://code.forgejo.org/actions/upload-artifact#outputs) can be used to download the artifact. It was previously 404. To implement this compatibility fix, the web UI URL to download artifacts (i.e. `/{owner}/{repo}/actions/runs/{run_id}/artifacts/{artifact_name}`) now relies on an identifier that is unique accross the instance. URLs to download artifacts that were bookmarked or copied prior to this change use an id relative to the repository and will no longer work. It previously was `/{owner}/{repo}/actions/runs/{run_index}/artifacts/{artifact_name}`, note the difference between `{run_id}` and `{run_index}`. The new URL can be obtained again by visiting the parent page, which still uses the relative id (`/{owner}/{repo}/actions/runs/{run_index}`). +- User Interface features + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9017): ability to view previous logs for Actions runs that have been retried + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8655): show CI status on force-pushes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8859): first native dialog for modal + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8572): feat(ui): improve org header with new noJS dropdown and more options + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9145): feat(ui): improve multiline file preview and anchor detection + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9184): feat(ui): render ordered checkbox lists with numbers + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7905): Admin interface for abuse reports + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8757): show timestamp on release attachments + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8759): add tag label to commit list view + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9110): support Markdown editor bold & italic keyboard shortcuts + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9146) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9493)): feat(ui): improve rendering commit links for PR commits, external repos and diffs + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8138): ui: refactor display of review threads on pr view + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8264): feat(ui): add links to assigners in issue comments + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8350): reduce amount of morphing for milestone + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8582): feat(ui): use simplified visibility label in dashboard orgs list + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8855): improve custom emojis + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9336): feat(ui): improve the global noJS notice + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9402): feat(ui): improve display of repo topics + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8239): feat(ui): add links to review request targets in issue comments + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9192): feat(ui): improve subscriptions screen filters + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9057): feat(ui): implement hover for switch + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8704): Pretty-print commit counts and other numbers +- User Interface bug fixes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9634) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9667)): fix(ui): add `markup` class to project descriptions + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8399): fix(ui): make releases filtering responsive + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9181): fix(ui): reworked file preview placement towards better HTML validity + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9398): fix(ui): fix alignment of items in tag signature + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9182): fix(ui): unescape file names in commit hash links + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8418): fix(ui): visually distinguish the branch name in action description + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8943): preserved 'Custom access' even after no permissions + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8363): fix(ui): show participants in mention suggestions in pr review + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9400): fix(ui): apply background color to wiki content + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8984): fix(ui): improve signature box responsiveness + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9262): ignore existence of commits for force pushes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8923): fix(ui): make unicode escape work in wiki + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9099): prevent initial 'blank' display of action logs view, remove unnecessary API calls + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9052): don't allow comment boxes to stretch outside diff boundries on small device UI + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7703): hide edit button on tag releases, improve ghost user display, fix tag signature banner + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8266): fix(ui): resolved 500 error upon clicking 'Clear milestone' button when there's no milestones available in Issue page + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8496): fix(ui): compare branches even with pull requests disabled +- Localization + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9600): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8977): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9347): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9259): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9108): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9013): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8535): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8673): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8744): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8826): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8891): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8490): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8410): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8295): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8238): i18n: update of translations from Codeberg Translate +- Features + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9638) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9689)): Uploaded avatar images can sometimes contain unexpected metadata such as the location where the image was created, or the device the image was created with, stored in a format called EXIF. Forgejo now removes EXIF data when custom user and repository images are uploaded in order to reduce the risk of personally identifiable information being leaked unexpectedly. A new CLI subcommand `forgejo doctor avatar-strip-exif` can be used to strip EXIF information from all existing avatars; we recommend that administrators run this command once after upgrade in order to minimize this risk for existing stored files. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8708): assorted ActivityPub code only refactors + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8667): feat(logger): rename settings for consistency and remove obsolete settings + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8831): Bring "remove a label from issue" API in line with GitHub equivalent + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9060): reject password reset attempts for OAuth2 users without a current password + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9056): feat(log): better parseable and configurable ssh-logs + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7940): add configurable timeout for automatically removing resolved reports + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8513): Add support for migrating from Pagure + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8116): add _URI entries for mail config + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8275): Improved signature handling & instance actor + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8792): Sent user activities to distant federated server + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8720): Add ActivityPub Person follow from distant + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8851): chore: remove goroutine PID logging + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8297): git/blob: GetContentBase64 with fewer allocations and no goroutine + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8332): make API pull and compare endpoint references to head more robust + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8438): git/commit: re-implement submodules file reader + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8212): add EXCLUSION to logging mode + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8594): add sort parameter for users/search api endpoint + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8932): Allow converting mirror repos to normal through the API + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8820): update broken git hook error + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9309): avoid expensive SQL for org home + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9285): make upload URL compatible with GitHub API + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8798): allow more README formats for `.profile` + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8479): AGit push options starting with `{base64}` are decoded + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8863): search in the `docs` directory for issue and pull request templates + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8451): improve checking if diffs differ + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8861): enable H2C for the HTTP server + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8377): detect Interlisp sources as text + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8714): add option to allow non-local users to change usernames + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8783): chroma: [`5d56970`](https://github.com/alecthomas/chroma/commit/5d56970) Add `uv.lock` to TOML lexer + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8783): chroma: [`a53c924`](https://github.com/alecthomas/chroma/commit/a53c924) create Lexer for Nu + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8783): chroma: [`abe0195`](https://github.com/alecthomas/chroma/commit/abe0195) create lexer for lox + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8783): chroma: [`f3be4c6`](https://github.com/alecthomas/chroma/commit/f3be4c6) create lexer for Gemtext + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8783): chroma: [`acd21c6`](https://github.com/alecthomas/chroma/commit/acd21c6) add aspect-ratio property to css.xml + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8783): chroma: [`d0ad679`](https://github.com/alecthomas/chroma/commit/d0ad679) improve Go lexer + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8347): Introduce global Merge Message Templates + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8393): chroma: [`970eacc`](https://github.com/alecthomas/chroma/commit/970eacc) add MoonScript lexer + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8393): chroma: [`bc60826`](https://github.com/alecthomas/chroma/commit/bc60826) add Core lexer + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7823): push mirror to have option to only push selected branches + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8426): if OAuth2 is disabled return 'Not found' for openid configuration + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8383): add `--attribute-ssh-pubic-key` to forgejo admin auth add-oauth and update-oauth CLI + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8325): feat(ui): add repository description to og:image:alt +- Bug fixes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9033): quota evaluation rules not working properly + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8957): artifacts can be downloaded using their id instead of their name + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9536): fix: failure to parse `on` block results in unconditional workflow execution + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8378): Fix invisible iframes with RENDER_CONTENT_MODE=iframe + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9468) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9471)): fix: package cleaned rule fails if the keep count is too high + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8844): prevent user-entered text with | characters from being truncated in activity feed + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8853): PR review dismissals were not appearing in activity feed + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8896): comment starting with a mermaid block displays error in activity feed + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8880): Markdown: generate unique per comment HTML IDs for footnotes and headers + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9098): very long commit messages cause pushed commits to fail to display on the action feed on MySQL + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8900): parse extra weird tree mode value + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9307): respect UI DEFAULT_SHOW_FULL_NAME setting in email From: headers + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9360): check target repo limit instead of user repo limit + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8424): enable multi-line math equations in wiki + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9158): Actions log view stops refreshing after the displayed job is finished, even if other jobs are still running + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8854): standardize truncation of user-entered comment text in activity feed + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8889): allow Actions tokens to access repos readable by signed in users + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8850): allow Forgejo Actions environment variables starting with CI + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8783): chroma: [`1ca24c9`](https://github.com/alecthomas/chroma/commit/1ca24c9) correct lexing AS keyword for docker + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8783): chroma: [`1f48e65`](https://github.com/alecthomas/chroma/commit/1f48e65) markdown: don't delegate to HTML lexer + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8783): chroma: [`dfb2819`](https://github.com/alecthomas/chroma/commit/dfb2819) Fixed ObjectPascal comment issue + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8393): chroma: [`2c20473`](https://github.com/alecthomas/chroma/commit/2c20473) RPGLE: various lexer & style fixes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8393): chroma: [`c803d79`](https://github.com/alecthomas/chroma/commit/c803d79) zig: detect zig object notation files as zig + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8393): chroma: [`ffedbf4`](https://github.com/alecthomas/chroma/commit/ffedbf4) kotlin: detect kotlin script files as kotlin +- Included for completeness but not user-facing (chores, etc.) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9687): re-add accidentally removed closing tag of div + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9680): reverts "fix: temporarily pin release builds to Go 1.24.7 (#9658)" + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9658): fix: temporarily pin release builds to Go 1.24.7 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9645) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9674)): fix: avoid jumping to begin of page on edit comment action (#9645) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9662) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9672)): chore(e2e): test flakiness in webauthn.test.e2e.ts + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9092): fix(i18n/en): update a few source strings + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9626) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9637)): fix(ui/releases): strech elements apart when no search bar + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8936): chore: do not impose merge requirements to cascading pull requests + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9011): chore(i18n): clean up orphans + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9504) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9515)): fix: allow unactivated users to send recovery mails + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9134): chore: fix a few typos in the documentation + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9611) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9620)): chore(ci): limit LDAP service container memory usage to 500M + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8908) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9622)): chore: TestParseGitURLs must use a valid IPv6 address + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8709): chore: add missing translation + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9534) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9540)): fix(ui): reworked file preview placement towards better HTML validity, take 2 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8689): fix(ui): issue comment review request targets when aggregated + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8267): abuse reports string data types + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9257): feat(ui): improve display of tags in commit list + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9293): loading action logs on a task that isn't fetched yet, fails when the job is fetched + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9417): upgrade to the ldap version used for testing to 2.5 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9502) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9506)): fix(ui): improve Pagure migrator private issues clarity + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9478) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9479)): fix: markup rendering panic must not abort the process + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9401) ([backported](https://codeberg.org/forgejo/forgejo/pulls/9445)): Replace "All pull requests" in repo issue filter + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9326): chore: replace xorm v1.3.9 with v1.3.9-forgejo.1, preparation for foreign key additions + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9317): chore(ui): improve dropdown opener visibility + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8992): Update module google.golang.org/protobuf to v1.36.8 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8736): feat(build): improve lint-locale-usage further + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9049): tests: Disable `Create review from commit` flaky e2e test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9395): Clarify description of deploy keys + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9337): chore(ui): Replace repo-code jQuery use, convert file to typescript + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9138): Update Swagger annotations to reflect actual behavior + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9381): Update renovate to v41.122.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9383): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9378): Remove redundant code + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9236): chore: fix transient error in TestPatchStatus tests + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9205): chore: build-release must close the cascading pull request + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9241): chore: fix transient error in TestPatchStatus tests (take 2) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9376): docs: update example config docs for MAX_CREATION_LIMIT + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9353): Update dependency mermaid to v11.12.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9338): Update dependency sharp to v0.34.4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9366): Update https://data.forgejo.org/actions/setup-forgejo action to v3.0.4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9368): chore(release-notes): Forgejo v12.0.4 [skip ci] + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9367): chore(release-notes): Forgejo v11.0.6 [skip ci] + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9356): Update dependency @playwright/test to v1.55.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9354): Update module code.forgejo.org/forgejo/runner/v11 to v11.1.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9301): Update module github.com/go-webauthn/webauthn to v0.14.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9314): chore: add SQL fault injector testing + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9062): feat(ui): refactor init & clearing of panel forms without jQuery + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9327): Update module github.com/mholt/archives to v0.1.4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9319): chore: document that [i18n].LANGS must contain en-US + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9310): failing backend tests + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9302): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9299): Update renovate to v41.113.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9275): Update module github.com/meilisearch/meilisearch-go to v0.34.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9295): Update module golang.org/x/oauth2 to v0.31.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9294): Update module golang.org/x/net to v0.44.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9291): Update module golang.org/x/image to v0.31.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9278): Update module golang.org/x/crypto to v0.42.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9251): chore: improvements to tag label display + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9266): Update https://data.forgejo.org/actions/cascading-pr action to v2.3.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9265): Update dependency forgejo/release-notes-assistant to v1.4.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9194): Update github.com/go-ap/jsonld digest to 8480b0f (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9212): Update dependency htmx.org to v2.0.7 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9246): Update dependency mermaid to v11.11.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9245): Update dependency globals to v16.4.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9218): Update module code.forgejo.org/forgejo/runner/v9 to v11 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9229): Update registry.redict.io/redict Docker tag to v7.3.5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9211): update action quick start url + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9228): Update module google.golang.org/protobuf to v1.36.9 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9227): Update https://data.forgejo.org/actions/setup-forgejo action to v3.0.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9217): chore(renovate): don't use go proxy for forgejo-code + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9208): refactored for lazy evaluation of MIGRATION_PACKAGES and GO_TEST_PACKAGES + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9213): Update dependency wrap-ansi to v9.0.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8592): chore: Use common SetCaptchaData in link account + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9198): Update dependency eslint-plugin-unicorn to v61 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9197): Update postcss (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9157): Update https://data.forgejo.org/infrastructure/next-digest action to v1.2.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8666): query token auth version mismatch + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8847): fix(test): TestActionsArtifactOverwrite needs ordered query for pgsql + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8842): prevent pull requests from being merged multiple times + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8771): migrate new Github release assets + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8690): return error when user is not repo writer + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8727): chore(ci): send mail when daily integration tests fail + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8897): minio initialization can freeze indefinitely if misconfigured + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8671): allow double digit epoch for Debian packages + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8882): compare week as numbers and not as strings + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9189): Update https://data.forgejo.org/infrastructure/next-digest action to v1.2.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9178): extend options in bug-reports regarding reproducibility on the Forgejo test instance + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9187): chore(release-notes): Forgejo v12.0.3 [skip ci] + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9186): chore(release-notes): Forgejo v11.0.5 [skip ci] + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9172): action view 'Re-run all jobs' leaves UI on the last attempt, not the new attempt + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9036): test(e2e): Fix and refactor repo-settings flaky test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9175): chore: cascading pr action input is close, not close-merge + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9169): chore: add missing gotestsum to nix dev shell + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9161): do better parsing of file modes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9151): Update dependency mermaid to v11.10.0 [SECURITY] (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8991): Update dependency vue to v3.5.21 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9159): Update dependency dayjs to v1.11.18 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9163): Update module github.com/go-chi/chi/v5 to v5.2.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9164): Update module github.com/ulikunitz/xz/cmd/gxz to v0.5.15 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9148): chore: fix renovate.json format error + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8742): chore: github.com/nektos/act is now at code.forgejo.org/forgejo/runner/v9 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9160): Update dependency mermaid to v11.10.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9156): Update dependency go to v1.24.7 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9150): Update module github.com/ulikunitz/xz to v0.5.15 [SECURITY] (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9137): tests: increase `checkAccessibility` timeout to 2s + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9127): casing of URL for Pagure migration page + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9051): test(e2e): improve resiliency of accessibilityCheck + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9105): chore(release-notes): Forgejo v11.0.4 [skip ci] + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9104): chore(release-notes): Forgejo v12.0.2 [skip ci] + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9041): chore(i18n): migrate migration descriptions to json + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8987): fix(ui): use correct string for pagure description + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9059): test(e2e): improve reliability of workflow list dynamic refresh test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9053): fix(ui): restore code search types + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9004): chore: collect coverage using GOCOVERDIR + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9035): chore: prefix all Actions related integration tests with TestActions + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9039): use mocked HTTP response for pagure migration + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8541): storage(minio): prevent io.Reader close + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8527): ignore "Close" error when uploading container blob + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8816): Update module github.com/minio/minio-go/v7 to v7.0.95 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8999): chore: make migration tests relative to the root of the repository + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8947): Update dependency webpack to v5.101.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8980): chore: depguard gopkg.in/yaml.v3 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8975): Update module code.forgejo.org/forgejo/runner/v9 to v9.1.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8953): chore: Update value of allowTemplateLiterals because of deprecation of 'true' + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8956): chore: replace gopkg.in/yaml.v3 with go.yaml.in/yaml/v3 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8374): disable Forgejo Actions email notifications on recovery + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8258): corrupted wiki unit default permission (#8234 follow-up) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8326): make API /repos/{owner}/{repo}/compare/{basehead} work with forks + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8461): chore: do not navigate to same URL in E2E test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8271): CI debug: testSleep: show actual times on failures + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8261): skip empty tokens in SearchOptions.Tokens() + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8320): chore: sort blocked users list for determistic results + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8366): cancelled or skipped runs are not failures for notifications + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8304): pass doer's ID for CRUD instance signing + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8464): use parent context for new transactions + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8460): chore: disable mismatched root URL e2e test for safari + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8286): Revert "fix(api): document `is_system_webhook` field (#7784)" + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8448): fix(email): actions notification template confuses branch with PR + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8400): chore: improve reliability of webauthn e2e test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8002): fix(ui): release: name is overridden with tag name on edit + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8524): chore: failed authentication attempts are not errors and are displayed at the log info level + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8492): fix(code-search): HighlightSearchResultCode should count the number of bytes and not the number of runes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8611): chore: disable E2E test for webkit + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8638): Revert "fix(ci): pull stylus from github:stylus/stylus#0.57.0 (#8625)" + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8301): chore: use eventually for mysql collation test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8625): fix(ci): pull stylus from github:stylus/stylus#0.57.0 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8519): expanding exactly 20 lines between diff sections leaves visual artifact + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8530): fix(packages): skip another stack frame from logging + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8948): Update gomock monorepo to v0.6.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8925): Update renovate to v41.76.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8927): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8874): redirect from /{username}/{reponame}/pulls/{index} to issue if index is a issue + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8663): chore: move template context + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8910): Update x/tools to v0.36.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8890): Pull Request Reference should use Pull Request format (!, not #) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8902): Update https://data.forgejo.org/actions/setup-forgejo action to v3.0.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8895): chore(docs): add instructions to run S3 tests locally + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8903): Update module github.com/mattn/go-sqlite3 to v1.14.32 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8878): Update dependency webpack to v5.101.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8879): Update module github.com/urfave/cli/v3 to v3.4.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8870): Update module github.com/urfave/cli/v3 to v3.3.9 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8858): test: fix failure in relative-time tests in US/Canada DST-aware timezones + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8856): Update renovate to v41.61.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8857): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8834): Update module github.com/mholt/archives to v0.1.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8832): Update linters (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8824): Update module golang.org/x/crypto to v0.41.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8822): Update module google.golang.org/protobuf to v1.36.7 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8825): Update module golang.org/x/image to v0.30.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7025): Use mholt/archives in place of deprecated mholt/archiver/v3 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8711): require `data-modal-id` for delete buttons + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8691): Enhance mysqlGetNextResourceIndex to use current MariaDB features + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8815): ci: fix mariadb path + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8810): chore: add MariaDB to daily tests + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8688): fix(ui): wrong org dashboard links when switching dashboard context + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8788): chore(dep): Update module meilisearch to v0.33 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8807): Update dependency go to v1.24.6 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8796): Update module github.com/caddyserver/certmagic to v0.24.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8795): Update module code.forgejo.org/forgejo/runner/v9 to v9.0.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8782): Update dependency mini-css-extract-plugin to v2.9.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8777): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8776): Update https://data.forgejo.org/forgejo/forgejo-build-publish action to v5.4.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8775): Update renovate to v41.51.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8721): chore(ui): improve hashbox + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8762): Update module code.forgejo.org/forgejo/runner/v9 to v9.0.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8766): Update dependency eslint-plugin-unicorn to v60 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8765): Update dependency @stylistic/stylelint-plugin to v4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8761): Update dependency @playwright/test to v1.54.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8763): Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.3.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8749): Update dependency @vitejs/plugin-vue to v6.0.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8739): Update module github.com/golang-jwt/jwt/v5 to v5.3.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8738): Update module github.com/mattn/go-sqlite3 to v1.14.30 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8752): Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.3.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8750): Update linters (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8728): chore(api): update swagger method descripitons + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8729): test: add logger settings tests + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8717): Update dependency webpack to v5.101.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8726): Update dependency forgejo/release-notes-assistant to v1.3.6 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8722): chore: revert release-notes-assistant to v1.3.3 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8274): assorted ActivityPub code only refactors + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8705): Revert "fix: assorted ActivityPub code only refactors (#8274)" + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8700): Update renovate to v41.43.5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8701): Update dependency forgejo/release-notes-assistant to v1.3.5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8703): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8642): don't mark files in AGit PRs as editable + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8686): chore: correctly prepare test env + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8680): add tracing logs after process is complete + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8675): RELEASE-NOTES.md to refer to the release notes directory on master [skip ci] + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8664): chore(release-notes): Forgejo v12.0.1 [skip ci] + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8660): Update module github.com/mattn/go-sqlite3 to v1.14.29 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8661): Update module code.forgejo.org/forgejo/act to v1.33.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8659): tests(e2e): Silence heading level warning + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8635): chore: integration test when rebase should happen + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7909): [gitea] week 2025-19 cherry pick (gitea/main -> forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8629): chore(renovate): use `forgejo` platform + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8623): Update dependency vue to v3.5.18 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8510): frontend: generic lazy loader for webcomponents + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8621): Update module github.com/yuin/goldmark to v1.7.13 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8620): Update dependency forgejo/release-notes-assistant to v1.3.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8578): Update module github.com/go-webauthn/webauthn to v0.13.4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8593): fix(i18n): improve en locale + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8615): Update renovate to v41.42.5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8606): Update dependency forgejo/release-notes-assistant to v1.3.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8605): Update renovate to v41.42.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8583): chore: tweak fomantic config + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8587): remove fomantic's tab module + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8395): chore(ci): temporarily disable flaky ActivityPub related tests + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8588): Migrate renovate config + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8586): Update https://data.forgejo.org/actions/cascading-pr action to v2.2.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8585): Update renovate to v41.40.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8568): Update dependency forgejo/release-notes-assistant to v1.3.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8562): Update https://data.forgejo.org/actions/setup-forgejo action to v3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8573): fix(ui): remove unused rule with unused class .tight + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8560): Update linters (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8558): Update dependency @playwright/test to v1.54.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8561): Update x/tools to v0.35.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8559): Update dependency vite-string-plugin to v1.4.6 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8557): Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.2.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8556): chore(ci): cache release-notes-assistant working directory [skip ci] + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8372): Update dependency @playwright/test to v1.53.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8547): chore(release notes): squash repeating localization updates + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8540): chore(release-notes): Forgejo v12.0.0 [skip ci] + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8542): chore: improve the wording of the "not worth a release note" category + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8506): feat(ui): make 'Reference' in issue sidebar more uniform + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8525): chore(renovate): enable v12 branch + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8521): Update module github.com/golang-jwt/jwt/v5 to v5.2.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8520): Update dependency webpack to v5.100.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8509): fix(ui): improve branch filter help + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8503): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8501): Update renovate to v41.32.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8494): Update module github.com/go-webauthn/webauthn to v0.13.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8493): Update dependency webpack to v5.100.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8484): Update module golang.org/x/net to v0.42.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8481): replace {workflowname} with {workflowfilename} in dispatch API + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8483): Update module golang.org/x/crypto to v0.40.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8482): Update dependency sharp to v0.34.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8470): Update module golang.org/x/sys to v0.34.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8469): Update module golang.org/x/sync to v0.16.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8467): Update dependency webpack to v5.100.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8472): chore(release-notes): Forgejo v11.0.3 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8473): chore(release-notes): Forgejo v7.0.16 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8415): file action button spacing when wrapped + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8433): test(cli): test `admin auth` subcommands + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8440): Update dependency mermaid to v11.8.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8442): Update module code.forgejo.org/forgejo/act to v1.29.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8436): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8434): Update renovate to v41.23.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8431): check PR reference on base repository + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8425): chore: Refactor `Is{Reference,Branch}Exist` + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8427): Update module github.com/go-webauthn/webauthn to v0.13.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8422): Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.2.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8420): Update dependency @vitest/eslint-plugin to v1.3.4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8419): chore: refactor `LineBlame` + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8421): Update linters (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8405): Update dependency mermaid to v11.8.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8380): Update module github.com/go-chi/cors to v1.2.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8381): Update dependency globals to v16.3.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8003): Make issue dropdown show more relevant results. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8368): Update github.com/google/pprof digest to 6e76a2b (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8369): Update ghcr.io/devcontainers/features/git-lfs Docker tag to v1.2.5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8371): Update vitest monorepo to v3.2.4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8322): fix(ui): repo settings units overview anchor + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8353): chore: do not require empty fixtures to clean tables + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8356): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8355): Update renovate to v41.17.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8352): detect incorrect integration test functions + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8327): fix(ui): small org dashboard ui cleanup + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8343): Update dependency svgo to v4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8342): Update dependency htmx.org to v2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8345): fix(ci): add install-minimum-git-version helper for workflows + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8340): Update dependency @stylistic/eslint-plugin to v5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8341): Update dependency @vitejs/plugin-vue to v6 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8337): Update dependency happy-dom to v18.0.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8336): Update dependency @stylistic/stylelint-plugin to v3.1.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8335): Update module github.com/niklasfasching/go-org to v1.9.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8323): git/TreeEntry: LinkTarget simplification + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8254): Update module github.com/jhillyerd/enmime/v2 to v2.2.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8257): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8270): git/blob: refactor line-counting logic + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8249): Update dependency mermaid to v11.7.0 (forgejo) +- Already announced in the release notes of an older stable release + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8892): migration failing when importing either issues or PRs but not the other + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8818): fix(ui): move file rename notice to before pagination + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9075): ensure GetUserByEmail only considers validated emails + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9264): use correct commit when fetching patch view for review comments + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9219): package cleanup rules are not applied when there are more than 200 packages (depends on `MAX_RESPONSE_ITEMS`) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8802): correct release link in feed + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9362): Do not display the title of unsubscribed issues or pull requests in the notification web page . The title of some random issues or pull requests from repositories were accidentally displayed in the notifications of a user. It was a rare occurrence, caused by an incorrect comparison of two unrelated unique identifiers that are unlikely to match (the id of the notification and the id of a repository). If the issue or the pull request belonged to a private repository to which the user had no read access, only the title was leaked. The user was denied permission to view the issue or the pull request when clicking on the link displayed in the notifications web page. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9201): fix(api): set default pagination and Link header for `repoListTags` + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9202): LFS GC is never running because of a bug in the parsing of the INI file + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9234): quotas double counting repo size when calculating size:all + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9252): `[quota.default].TOTAL` config setting supports unit suffixes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9072): only redirect to a new owner (organization or user) if the user has permissions to view the new owner + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8990): fix(ui): clear fields when canceling adding ssh key + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8829): fix(api): deactivate issue api for disabled or external issue-tracker + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8794): trim trailing slash in WebFinger OIDC issuer link + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9067): use credentials helpers for git clones + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9070): require password login for creation of new token + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8678): store code challenge correctly in session + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9076): delete old auth token upon replacing primary email + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9064): don't allow credentials in migrate/push mirror URL + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8830): wrap items in gitignore dropdown + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8715): allow admins to always rename users + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8681): show mergebox when only manual merge is allowed + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8756): correctly get stats for API commits + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9003): Actions workflows triggered by comments or labels to pull requests may access secrets + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9074): email comments are removed from email addresses + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9073): consistently enforce 2FA on OpenID 2.0 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9071): validate CSRF on non-safe methods + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8821): make ssh key verification command more robust + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8773): add .forgejo/CODEOWNERS support (#8746) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/9000): fix(code-search): fix broken pagination. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8450): correctly mark reviews as stale for AGit PRs + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7749): fix(ui): Add pasted images to dropzone + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8246): fix(ui): add missing lazy load attribute to images + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8296): add missing trust status to pull review commits + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8330): load OldMilestone based on OldMilestoneID, not MilestoneID + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8391): Auth Header: Allow lowercase as well as uppercase token + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8367): user activation with uppercase email address + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8417): fix(ui): multiple ComboMarkdownEditors on one page + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8565): correct image source for quoted reply + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8475): several fixes of ALT Package registry + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8633): Revert "feat: remove API authentication methods that uses the URL query (#7924)" + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8596): follow symlinks for local assets + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8644): fix(ui): update i18n usage in comments + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8553): fix(ui): prevent render failure on faulty org settings post + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8533): make sure to use unaltered fields when saving a shadow copy for updated profiles or comments + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8622): rebase and fast forward merge breaks commit signatures + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8617): make the action feed resilient to database inconsistencies + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8609): upgrade fails or hang at migration[31]: Migrate maven package name concatenation + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8550): use correct ACME default + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8511): PR not blocked by review request for a whitelisted team + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8575): allow for tracked time to be removed again + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8942): a corrupted Forgejo Actions scheduled workflow is disabled + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8864): de-duplicate Forgejo Actions job names when needed + diff --git a/release-notes/9458.md b/release-notes/9458.md new file mode 100644 index 0000000000..444113eccb --- /dev/null +++ b/release-notes/9458.md @@ -0,0 +1 @@ +Forgejo subcommands which only accept flag options would previously ignore any command-line arguments that were not flags and silently proceed to execute the command. This could lead to unexpected effects; for example, `--must-change-password false` is actually parsed as two arguments, `--must-change-password`, and `false`, where the `false` argument was ignored. In order to prevent misunderstandings where the user may have intended a supported argument format (`--must-change-password=false`), the presence of extra arguments that are not flags will now result in an error. Users of the Forgejo CLI who are relying on the previous behavior will find their commands are now resulting in errors. \ No newline at end of file diff --git a/release-notes/9513.md b/release-notes/9513.md new file mode 100644 index 0000000000..e744c87a59 --- /dev/null +++ b/release-notes/9513.md @@ -0,0 +1 @@ +fix!: Prevent forked `.profile` repositories from displaying profile content. When a user forked a repository named `.profile` without having created their own `.profile` repository, the content from the forked repository was unexpectedly displayed on their public profile page. This could lead to users' profiles displaying content they did not intentionally create for that purpose. Forked `.profile` repositories are now treated as standard repositories and do not populate the user's public profile page. Users who wish to use the content from a forked `.profile` repository can convert the fork to a regular repository in the "Danger Zone" section of Repository settings. This issue was particularly problematic on instances where users had repository creation limits (-1) and would inappropriately use forked `.profile` repositories to obtain profile customization. diff --git a/release-notes/9638.md b/release-notes/9638.md new file mode 100644 index 0000000000..c2f0008c20 --- /dev/null +++ b/release-notes/9638.md @@ -0,0 +1 @@ +Uploaded avatar images can sometimes contain unexpected metadata such as the location where the image was created, or the device the image was created with, stored in a format called EXIF. Forgejo now removes EXIF data when custom user and repository images are uploaded in order to reduce the risk of personally identifiable information being leaked unexpectedly. A new CLI subcommand `forgejo doctor avatar-strip-exif` can be used to strip EXIF information from all existing avatars; we recommend that administrators run this command once after upgrade in order to minimize this risk for existing stored files. \ No newline at end of file diff --git a/renovate.json b/renovate.json index 60c36fe435..d28721864c 100644 --- a/renovate.json +++ b/renovate.json @@ -9,7 +9,7 @@ "baseBranchPatterns": [ "$default", "/^v11\\.\\d+/forgejo$/", - "/^v12\\.\\d+/forgejo$/" + "/^v13\\.\\d+/forgejo$/" ], "postUpdateOptions": ["gomodTidy", "gomodUpdateImportPaths", "npmDedupe"], "prConcurrentLimit": 10, diff --git a/routers/api/packages/nuget/auth.go b/routers/api/packages/nuget/auth.go index 92868bdef5..139f84a0c6 100644 --- a/routers/api/packages/nuget/auth.go +++ b/routers/api/packages/nuget/auth.go @@ -9,7 +9,6 @@ import ( auth_model "forgejo.org/models/auth" user_model "forgejo.org/models/user" "forgejo.org/modules/log" - "forgejo.org/modules/timeutil" "forgejo.org/services/auth" ) @@ -38,9 +37,8 @@ func (a *Auth) Verify(req *http.Request, w http.ResponseWriter, store auth.DataS return nil, err } - token.UpdatedUnix = timeutil.TimeStampNow() - if err := auth_model.UpdateAccessToken(req.Context(), token); err != nil { - log.Error("UpdateAccessToken: %v", err) + if err := token.UpdateLastUsed(req.Context()); err != nil { + log.Error("UpdateLastUsed: %v", err) } return u, nil diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go index 6bc520f510..4c436aa070 100644 --- a/routers/api/v1/admin/user.go +++ b/routers/api/v1/admin/user.go @@ -254,6 +254,7 @@ func EditUser(ctx *context.APIContext) { MaxRepoCreation: optional.FromPtr(form.MaxRepoCreation), AllowCreateOrganization: optional.FromPtr(form.AllowCreateOrganization), IsRestricted: optional.FromPtr(form.Restricted), + KeepEmailPrivate: optional.FromPtr(form.HideEmail), } if err := user_service.UpdateUser(ctx, ctx.ContextUser, opts); err != nil { diff --git a/routers/api/v1/repo/action.go b/routers/api/v1/repo/action.go index 1efb3c2449..716a0b7fdb 100644 --- a/routers/api/v1/repo/action.go +++ b/routers/api/v1/repo/action.go @@ -807,7 +807,7 @@ func DispatchWorkflow(ctx *context.APIContext) { if opt.ReturnRunInfo { ctx.JSON(http.StatusCreated, workflowRun) } else { - ctx.JSON(http.StatusNoContent, nil) + ctx.Status(http.StatusNoContent) } } diff --git a/routers/api/v1/repo/migrate.go b/routers/api/v1/repo/migrate.go index e58545c2f6..874a05a3ac 100644 --- a/routers/api/v1/repo/migrate.go +++ b/routers/api/v1/repo/migrate.go @@ -4,7 +4,6 @@ package repo import ( - "bytes" "errors" "fmt" "net/http" @@ -195,10 +194,9 @@ func Migrate(ctx *context.APIContext) { defer func() { if e := recover(); e != nil { - var buf bytes.Buffer - fmt.Fprintf(&buf, "Handler crashed with error: %v", log.Stack(2)) - - err = errors.New(buf.String()) + log.Error("PANIC recovered: %v\nStacktrace: %s", e, log.Stack(2)) + err = fmt.Errorf("PANIC recover with error %v", e) + ctx.Error(http.StatusInternalServerError, "Recovered PANIC with error", err) } if err == nil { diff --git a/routers/common/db.go b/routers/common/db.go index ec31ced1bf..09c2c4072e 100644 --- a/routers/common/db.go +++ b/routers/common/db.go @@ -9,7 +9,7 @@ import ( "time" "forgejo.org/models/db" - "forgejo.org/models/migrations" + "forgejo.org/models/gitea_migrations" system_model "forgejo.org/models/system" "forgejo.org/modules/log" "forgejo.org/modules/setting" @@ -43,15 +43,15 @@ func InitDBEngine(ctx context.Context) (err error) { func migrateWithSetting(x *xorm.Engine) error { if setting.Database.AutoMigration { - return migrations.Migrate(x) + return gitea_migrations.Migrate(x) } - if current, err := migrations.GetCurrentDBVersion(x); err != nil { + if current, err := gitea_migrations.GetCurrentDBVersion(x); err != nil { return err } 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 { + return gitea_migrations.Migrate(x) + } else if expected := gitea_migrations.ExpectedDBVersion(); 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/install/install.go b/routers/install/install.go index f64f395a7f..eaede217d3 100644 --- a/routers/install/install.go +++ b/routers/install/install.go @@ -17,7 +17,7 @@ import ( "forgejo.org/models/db" db_install "forgejo.org/models/db/install" - "forgejo.org/models/migrations" + "forgejo.org/models/gitea_migrations" system_model "forgejo.org/models/system" user_model "forgejo.org/models/user" "forgejo.org/modules/auth/password/hash" @@ -362,7 +362,7 @@ func SubmitInstall(ctx *context.Context) { // Init the engine with migration // Wrap migrations.Migrate into a function of type func(db.Engine) error to fix diagnostics. - if err = db.InitEngineWithMigration(ctx, migrations.WrapperMigrate); err != nil { + if err = db.InitEngineWithMigration(ctx, gitea_migrations.WrapperMigrate); err != nil { db.UnsetDefaultEngine() ctx.Data["Err_DbSetting"] = true ctx.RenderWithErr(ctx.Tr("install.invalid_db_setting", err), tplInstall, &form) diff --git a/routers/private/default_branch.go b/routers/private/default_branch.go index da185e1ab1..7e99e57b4b 100644 --- a/routers/private/default_branch.go +++ b/routers/private/default_branch.go @@ -10,11 +10,11 @@ import ( repo_model "forgejo.org/models/repo" "forgejo.org/modules/gitrepo" "forgejo.org/modules/private" - gitea_context "forgejo.org/services/context" + app_context "forgejo.org/services/context" ) // SetDefaultBranch updates the default branch -func SetDefaultBranch(ctx *gitea_context.PrivateContext) { +func SetDefaultBranch(ctx *app_context.PrivateContext) { ownerName := ctx.Params(":owner") repoName := ctx.Params(":repo") branch := ctx.Params(":branch") diff --git a/routers/private/hook_post_receive.go b/routers/private/hook_post_receive.go index a856a7a00a..0acc09ab1b 100644 --- a/routers/private/hook_post_receive.go +++ b/routers/private/hook_post_receive.go @@ -27,12 +27,12 @@ import ( timeutil "forgejo.org/modules/timeutil" "forgejo.org/modules/util" "forgejo.org/modules/web" - gitea_context "forgejo.org/services/context" + app_context "forgejo.org/services/context" repo_service "forgejo.org/services/repository" ) // HookPostReceive updates services and users -func HookPostReceive(ctx *gitea_context.PrivateContext) { +func HookPostReceive(ctx *app_context.PrivateContext) { opts := web.GetForm(ctx).(*private.HookOptions) // We don't rely on RepoAssignment here because: @@ -325,7 +325,7 @@ func loadContextCacheUser(ctx context.Context, id int64) (*user_model.User, erro } // handlePullRequestMerging handle pull request merging, a pull request action should push at least 1 commit -func handlePullRequestMerging(ctx *gitea_context.PrivateContext, opts *private.HookOptions, ownerName, repoName string, updates []*repo_module.PushUpdateOptions) { +func handlePullRequestMerging(ctx *app_context.PrivateContext, opts *private.HookOptions, ownerName, repoName string, updates []*repo_module.PushUpdateOptions) { if len(updates) == 0 { ctx.JSON(http.StatusInternalServerError, private.HookPostReceiveResult{ Err: fmt.Sprintf("Pushing a merged PR (pr:%d) no commits pushed ", opts.PullRequestID), diff --git a/routers/private/hook_pre_receive.go b/routers/private/hook_pre_receive.go index 45992e8522..217e5d817f 100644 --- a/routers/private/hook_pre_receive.go +++ b/routers/private/hook_pre_receive.go @@ -23,12 +23,12 @@ import ( "forgejo.org/modules/private" "forgejo.org/modules/setting" "forgejo.org/modules/web" - gitea_context "forgejo.org/services/context" + app_context "forgejo.org/services/context" pull_service "forgejo.org/services/pull" ) type preReceiveContext struct { - *gitea_context.PrivateContext + *app_context.PrivateContext // loadedPusher indicates that where the following information are loaded loadedPusher bool @@ -175,7 +175,7 @@ func (ctx *preReceiveContext) quotaExceeded() { } // HookPreReceive checks whether a individual commit is acceptable -func HookPreReceive(ctx *gitea_context.PrivateContext) { +func HookPreReceive(ctx *app_context.PrivateContext) { opts := web.GetForm(ctx).(*private.HookOptions) ourCtx := &preReceiveContext{ diff --git a/routers/private/hook_proc_receive.go b/routers/private/hook_proc_receive.go index 9f6e23f158..167036821b 100644 --- a/routers/private/hook_proc_receive.go +++ b/routers/private/hook_proc_receive.go @@ -11,11 +11,11 @@ import ( "forgejo.org/modules/private" "forgejo.org/modules/web" "forgejo.org/services/agit" - gitea_context "forgejo.org/services/context" + app_context "forgejo.org/services/context" ) // HookProcReceive proc-receive hook - only handles agit Proc-Receive requests at present -func HookProcReceive(ctx *gitea_context.PrivateContext) { +func HookProcReceive(ctx *app_context.PrivateContext) { opts := web.GetForm(ctx).(*private.HookOptions) results, err := agit.ProcReceive(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, opts) diff --git a/routers/private/internal_repo.go b/routers/private/internal_repo.go index f237d2c676..dec020878f 100644 --- a/routers/private/internal_repo.go +++ b/routers/private/internal_repo.go @@ -12,13 +12,13 @@ import ( "forgejo.org/modules/gitrepo" "forgejo.org/modules/log" "forgejo.org/modules/private" - gitea_context "forgejo.org/services/context" + app_context "forgejo.org/services/context" ) // This file contains common functions relating to setting the Repository for the internal routes // RepoAssignment assigns the repository and gitrepository to the private context -func RepoAssignment(ctx *gitea_context.PrivateContext) context.CancelFunc { +func RepoAssignment(ctx *app_context.PrivateContext) context.CancelFunc { ownerName := ctx.Params(":owner") repoName := ctx.Params(":repo") @@ -37,7 +37,7 @@ func RepoAssignment(ctx *gitea_context.PrivateContext) context.CancelFunc { return nil } - ctx.Repo = &gitea_context.Repository{ + ctx.Repo = &app_context.Repository{ Repository: repo, GitRepo: gitRepo, } @@ -53,7 +53,7 @@ func RepoAssignment(ctx *gitea_context.PrivateContext) context.CancelFunc { return cancel } -func loadRepository(ctx *gitea_context.PrivateContext, ownerName, repoName string) *repo_model.Repository { +func loadRepository(ctx *app_context.PrivateContext, ownerName, repoName string) *repo_model.Repository { repo, err := repo_model.GetRepositoryByOwnerAndName(ctx, ownerName, repoName) if err != nil { log.Error("Failed to get repository: %s/%s Error: %v", ownerName, repoName, err) diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go index 987dc38892..d4a32c03a0 100644 --- a/routers/web/admin/users.go +++ b/routers/web/admin/users.go @@ -454,6 +454,7 @@ func EditUserPost(ctx *context.Context) { IsRestricted: optional.Some(form.Restricted), Visibility: optional.Some(form.Visibility), Language: optional.Some(form.Language), + KeepEmailPrivate: optional.Some(form.HideEmail), } if err := user_service.UpdateUser(ctx, u, opts); err != nil { diff --git a/routers/web/repo/card.go b/routers/web/repo/card.go index 449e5c4890..26e97603a9 100644 --- a/routers/web/repo/card.go +++ b/routers/web/repo/card.go @@ -330,7 +330,7 @@ func drawIssueSummaryCard(ctx *context.Context, issue *issue_model.Issue) (*card fmt.Sprintf( "%s - %s", issue.Poster.Name, - issue.Created.AsTime().Format(time.DateOnly), + issue.CreatedUnix.AsTime().Format(time.DateOnly), ), color.Gray{128}, 36, card.Middle, card.Left) if err != nil { @@ -381,12 +381,8 @@ func drawReleaseSummaryCard(ctx *context.Context, release *repo_model.Release) ( 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), - ) + downloadCountText := ctx.Locale.TrPluralString(downloadCount, + "release.n_downloads", strconv.FormatInt(downloadCount, 10)) _, err = downloadCountCard.DrawText(string(downloadCountText), color.Gray{128}, 36, card.Bottom, card.Left) if err != nil { diff --git a/routers/web/shared/user/header.go b/routers/web/shared/user/header.go index 87feb966cb..745b3c1dca 100644 --- a/routers/web/shared/user/header.go +++ b/routers/web/shared/user/header.go @@ -97,6 +97,10 @@ func PrepareContextForProfileBigAvatar(ctx *context.Context) { func FindUserProfileReadme(ctx *context.Context, doer *user_model.User) (profileDbRepo *repo_model.Repository, profileGitRepo *git.Repository, profileReadmeBlob *git.Blob, profileClose func()) { profileDbRepo, err := repo_model.GetRepositoryByName(ctx, ctx.ContextUser.ID, ".profile") if err == nil { + // Don't show profile content if .profile repository is a fork + if profileDbRepo.IsFork { + return nil, nil, nil, func() {} + } perm, err := access_model.GetUserRepoPermission(ctx, profileDbRepo, doer) if err == nil && !profileDbRepo.IsEmpty && perm.CanRead(unit.TypeCode) { if profileGitRepo, err = gitrepo.OpenRepository(ctx, profileDbRepo); err != nil { diff --git a/services/auth/auth.go b/services/auth/auth.go index 85121b2d7f..dc7a283aa9 100644 --- a/services/auth/auth.go +++ b/services/auth/auth.go @@ -17,7 +17,7 @@ import ( "forgejo.org/modules/session" "forgejo.org/modules/setting" "forgejo.org/modules/web/middleware" - gitea_context "forgejo.org/services/context" + app_context "forgejo.org/services/context" user_service "forgejo.org/services/user" ) @@ -101,7 +101,7 @@ func handleSignIn(resp http.ResponseWriter, req *http.Request, sess SessionStore middleware.SetLocaleCookie(resp, user.Language, 0) // Clear whatever CSRF has right now, force to generate a new one - if ctx := gitea_context.GetWebContext(req); ctx != nil { + if ctx := app_context.GetWebContext(req); ctx != nil { ctx.Csrf.DeleteCookie(ctx) } } diff --git a/services/auth/basic.go b/services/auth/basic.go index 4ffe712744..f117494762 100644 --- a/services/auth/basic.go +++ b/services/auth/basic.go @@ -15,7 +15,6 @@ import ( "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" ) @@ -97,9 +96,8 @@ func (b *Basic) Verify(req *http.Request, w http.ResponseWriter, store DataStore return nil, err } - token.UpdatedUnix = timeutil.TimeStampNow() - if err = auth_model.UpdateAccessToken(req.Context(), token); err != nil { - log.Error("UpdateAccessToken: %v", err) + if err = token.UpdateLastUsed(req.Context()); err != nil { + log.Error("UpdateLastUsed: %v", err) } store.GetData()["IsApiToken"] = true diff --git a/services/auth/oauth2.go b/services/auth/oauth2.go index fa13c20a7f..ee9f64c91f 100644 --- a/services/auth/oauth2.go +++ b/services/auth/oauth2.go @@ -16,7 +16,6 @@ import ( user_model "forgejo.org/models/user" "forgejo.org/modules/log" "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" "forgejo.org/modules/util" "forgejo.org/modules/web/middleware" "forgejo.org/services/actions" @@ -190,9 +189,8 @@ func (o *OAuth2) userIDFromToken(ctx context.Context, tokenSHA string, store Dat } return 0 } - t.UpdatedUnix = timeutil.TimeStampNow() - if err = auth_model.UpdateAccessToken(ctx, t); err != nil { - log.Error("UpdateAccessToken: %v", err) + if err := t.UpdateLastUsed(ctx); err != nil { + log.Error("UpdateLastUsed: %v", err) } store.GetData()["IsApiToken"] = true store.GetData()["ApiTokenScope"] = t.Scope diff --git a/services/auth/reverseproxy_test.go b/services/auth/reverseproxy_test.go index 7f89c0447a..f6740a0134 100644 --- a/services/auth/reverseproxy_test.go +++ b/services/auth/reverseproxy_test.go @@ -8,7 +8,6 @@ import ( "testing" "forgejo.org/models/db" - "forgejo.org/models/issues" "forgejo.org/models/unittest" user_model "forgejo.org/models/user" "forgejo.org/modules/setting" @@ -23,7 +22,7 @@ func TestReverseProxyAuth(t *testing.T) { defer test.MockVariableValue(&setting.Service.EnableReverseProxyFullName, true)() require.NoError(t, unittest.PrepareTestDatabase()) - require.NoError(t, db.TruncateBeans(db.DefaultContext, &issues.TrackedTime{}, &issues.Stopwatch{}, &user_model.User{})) + require.NoError(t, db.TruncateBeansCascade(db.DefaultContext, &user_model.User{})) require.EqualValues(t, 0, user_model.CountUsers(db.DefaultContext, nil)) t.Run("First user should be admin", func(t *testing.T) { diff --git a/services/convert/pull.go b/services/convert/pull.go index ca965a0d18..41cbcc25aa 100644 --- a/services/convert/pull.go +++ b/services/convert/pull.go @@ -235,9 +235,10 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u // Calculate diff startCommitID = pr.MergeBase - apiPullRequest.ChangedFiles, apiPullRequest.Additions, apiPullRequest.Deletions, err = gitRepo.GetDiffShortStat(startCommitID, endCommitID) + // startCommitID is already merge-base with endCommitID we can directly compare. + apiPullRequest.ChangedFiles, apiPullRequest.Additions, apiPullRequest.Deletions, err = gitRepo.GetShortStat(startCommitID, endCommitID, false) if err != nil { - log.Error("GetDiffShortStat: %v", err) + log.Error("GetShortStat: %v", err) } } diff --git a/services/doctor/dbconsistency.go b/services/doctor/dbconsistency.go index 79f29866a6..d986558940 100644 --- a/services/doctor/dbconsistency.go +++ b/services/doctor/dbconsistency.go @@ -10,8 +10,8 @@ import ( activities_model "forgejo.org/models/activities" auth_model "forgejo.org/models/auth" "forgejo.org/models/db" + "forgejo.org/models/gitea_migrations" 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" @@ -83,7 +83,7 @@ func checkDBConsistency(ctx context.Context, logger log.Logger, autofix bool) er if err != nil { return err } - return migrations.EnsureUpToDate(engine) + return gitea_migrations.EnsureUpToDate(engine) } if err := db.InitEngineWithMigration(ctx, ensureUpToDateWrapper); err != nil { logger.Critical("Model version on the database does not match the current Gitea version. Model consistency will not be checked until the database is upgraded") diff --git a/services/doctor/dbversion.go b/services/doctor/dbversion.go index c0ff22915d..c032a2c488 100644 --- a/services/doctor/dbversion.go +++ b/services/doctor/dbversion.go @@ -7,16 +7,16 @@ import ( "context" "forgejo.org/models/db" - "forgejo.org/models/migrations" + "forgejo.org/models/gitea_migrations" "forgejo.org/modules/log" "xorm.io/xorm" ) 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", gitea_migrations.ExpectedDBVersion()) if err := db.InitEngineWithMigration(ctx, func(eng db.Engine) error { - return migrations.EnsureUpToDate(eng.(*xorm.Engine)) + return gitea_migrations.EnsureUpToDate(eng.(*xorm.Engine)) }); err != nil { if !autofix { logger.Critical("Error: %v during ensure up to date", err) @@ -26,7 +26,7 @@ func checkDBVersion(ctx context.Context, logger log.Logger, autofix bool) error logger.Warn("Attempting to migrate to the latest DB version to fix this.") err = db.InitEngineWithMigration(ctx, func(eng db.Engine) error { - return migrations.Migrate(eng.(*xorm.Engine)) + return gitea_migrations.Migrate(eng.(*xorm.Engine)) }) if err != nil { logger.Critical("Error: %v during migration", err) diff --git a/services/forms/admin.go b/services/forms/admin.go index 5a5d46634b..dc2cc9c909 100644 --- a/services/forms/admin.go +++ b/services/forms/admin.go @@ -53,6 +53,7 @@ type AdminEditUserForm struct { ProhibitLogin bool Reset2FA bool `form:"reset_2fa"` Visibility structs.VisibleType + HideEmail bool `form:"hide_email"` } // Validate validates form fields diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index 2f3d289c80..ae878a6b69 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -9,6 +9,7 @@ import ( "bytes" "cmp" "context" + "errors" "fmt" "html" "html/template" @@ -1285,31 +1286,21 @@ type PullDiffStats struct { // GetPullDiffStats func GetPullDiffStats(gitRepo *git.Repository, opts *DiffOptions) (*PullDiffStats, error) { - repoPath := gitRepo.Path - diff := &PullDiffStats{} - separator := "..." - if opts.DirectComparison { - separator = ".." - } - objectFormat, err := gitRepo.GetObjectFormat() if err != nil { return nil, err } - diffPaths := []string{opts.BeforeCommitID + separator + opts.AfterCommitID} if len(opts.BeforeCommitID) == 0 || opts.BeforeCommitID == objectFormat.EmptyObjectID().String() { - diffPaths = []string{objectFormat.EmptyTree().String(), opts.AfterCommitID} + opts.BeforeCommitID = objectFormat.EmptyTree().String() + opts.DirectComparison = true } - 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...) + diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = gitRepo.GetShortStat(opts.BeforeCommitID, opts.AfterCommitID, !opts.DirectComparison) + if errors.Is(err, git.ErrNoMergebaseFound) { + diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = gitRepo.GetShortStat(opts.BeforeCommitID, opts.AfterCommitID, false) } if err != nil { return nil, err diff --git a/services/issue/pull.go b/services/issue/pull.go index 6245344ccb..fb68130433 100644 --- a/services/issue/pull.go +++ b/services/issue/pull.go @@ -6,7 +6,6 @@ package issue import ( "context" "fmt" - "time" issues_model "forgejo.org/models/issues" org_model "forgejo.org/models/organization" @@ -19,22 +18,6 @@ import ( "forgejo.org/modules/setting" ) -func getMergeBase(repo *git.Repository, pr *issues_model.PullRequest, baseBranch, headBranch string) (string, error) { - // Add a temporary remote - tmpRemote := fmt.Sprintf("mergebase-%d-%d", pr.ID, time.Now().UnixNano()) - if err := repo.AddRemote(tmpRemote, repo.Path, false); err != nil { - return "", fmt.Errorf("AddRemote: %w", err) - } - defer func() { - if err := repo.RemoveRemote(tmpRemote); err != nil { - log.Error("getMergeBase: RemoveRemote: %v", err) - } - }() - - mergeBase, _, err := repo.GetMergeBase(tmpRemote, baseBranch, headBranch) - return mergeBase, err -} - type ReviewRequestNotifier struct { Comment *issues_model.Comment IsAdd bool @@ -81,8 +64,7 @@ func PullRequestCodeOwnersReview(ctx context.Context, issue *issues_model.Issue, } } - // get the mergebase - mergeBase, err := getMergeBase(repo, pr, git.BranchPrefix+pr.BaseBranch, pr.GetGitRefName()) + mergeBase, err := repo.GetMergeBaseSimple(git.BranchPrefix+pr.BaseBranch, pr.GetGitRefName()) if err != nil { return nil, err } diff --git a/services/markup/processorhelper.go b/services/markup/processorhelper.go index 2f1b1e738c..ea747645b0 100644 --- a/services/markup/processorhelper.go +++ b/services/markup/processorhelper.go @@ -15,7 +15,7 @@ import ( "forgejo.org/modules/gitrepo" "forgejo.org/modules/log" "forgejo.org/modules/markup" - gitea_context "forgejo.org/services/context" + app_context "forgejo.org/services/context" file_service "forgejo.org/services/repository/files" ) @@ -28,7 +28,7 @@ func ProcessorHelper() *markup.ProcessorHelper { return false } - giteaCtx, ok := ctx.(*gitea_context.Context) + giteaCtx, ok := ctx.(*app_context.Context) if !ok { // when using general context, use user's visibility to check return mentionedUser.Visibility.IsPublic() @@ -45,7 +45,7 @@ func ProcessorHelper() *markup.ProcessorHelper { var user *user.User - giteaCtx, ok := ctx.(*gitea_context.Context) + giteaCtx, ok := ctx.(*app_context.Context) if ok { user = giteaCtx.Doer } diff --git a/services/markup/processorhelper_test.go b/services/markup/processorhelper_test.go index 8195451746..2494306d07 100644 --- a/services/markup/processorhelper_test.go +++ b/services/markup/processorhelper_test.go @@ -11,7 +11,7 @@ import ( "forgejo.org/models/db" "forgejo.org/models/unittest" "forgejo.org/models/user" - gitea_context "forgejo.org/services/context" + app_context "forgejo.org/services/context" "forgejo.org/services/contexttest" "github.com/stretchr/testify/assert" @@ -40,9 +40,9 @@ func TestProcessorHelper(t *testing.T) { // when using web context, use user.IsUserVisibleToViewer to check req, err := http.NewRequest("GET", "/", nil) require.NoError(t, err) - base, baseCleanUp := gitea_context.NewBaseContext(httptest.NewRecorder(), req) + base, baseCleanUp := app_context.NewBaseContext(httptest.NewRecorder(), req) defer baseCleanUp() - giteaCtx := gitea_context.NewWebContext(base, &contexttest.MockRender{}, nil) + giteaCtx := app_context.NewWebContext(base, &contexttest.MockRender{}, nil) assert.True(t, ProcessorHelper().IsUsernameMentionable(giteaCtx, userPublic)) assert.False(t, ProcessorHelper().IsUsernameMentionable(giteaCtx, userPrivate)) diff --git a/services/pull/pull.go b/services/pull/pull.go index c1fe6c6b55..6a6be319c4 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -28,7 +28,7 @@ import ( repo_module "forgejo.org/modules/repository" "forgejo.org/modules/setting" "forgejo.org/modules/sync" - gitea_context "forgejo.org/services/context" + app_context "forgejo.org/services/context" issue_service "forgejo.org/services/issue" notify_service "forgejo.org/services/notify" ) @@ -911,7 +911,7 @@ type CommitInfo struct { // GetPullCommits returns all commits on given pull request and the last review commit sha // Attention: The last review commit sha must be from the latest review whose commit id is not empty. // So the type of the latest review cannot be "ReviewTypeRequest". -func GetPullCommits(ctx *gitea_context.Context, issue *issues_model.Issue) ([]CommitInfo, string, error) { +func GetPullCommits(ctx *app_context.Context, issue *issues_model.Issue) ([]CommitInfo, string, error) { pull := issue.PullRequest baseGitRepo := ctx.Repo.GitRepo diff --git a/services/repository/adopt_test.go b/services/repository/adopt_test.go index a66b4c5ac0..79e4fc0023 100644 --- a/services/repository/adopt_test.go +++ b/services/repository/adopt_test.go @@ -69,7 +69,7 @@ func TestCheckUnadoptedRepositories(t *testing.T) { func TestListUnadoptedRepositories_ListOptions(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) username := "user2" - unadoptedList := []string{path.Join(username, "unadopted1"), path.Join(username, "unadopted2")} + unadoptedList := []string{path.Join(username, "rendering-test"), path.Join(username, "unadopted1"), path.Join(username, "unadopted2")} for _, unadopted := range unadoptedList { _ = os.Mkdir(path.Join(setting.RepoRootPath, unadopted+".git"), 0o755) } @@ -77,13 +77,13 @@ func TestListUnadoptedRepositories_ListOptions(t *testing.T) { opts := db.ListOptions{Page: 1, PageSize: 1} repoNames, count, err := ListUnadoptedRepositories(db.DefaultContext, "", &opts) require.NoError(t, err) - assert.Equal(t, 2, count) + assert.Equal(t, 3, count) assert.Equal(t, unadoptedList[0], repoNames[0]) opts = db.ListOptions{Page: 2, PageSize: 1} repoNames, count, err = ListUnadoptedRepositories(db.DefaultContext, "", &opts) require.NoError(t, err) - assert.Equal(t, 2, count) + assert.Equal(t, 3, count) assert.Equal(t, unadoptedList[1], repoNames[0]) } @@ -97,7 +97,7 @@ func TestAdoptRepository(t *testing.T) { path.Join(setting.RepoRootPath, username, unadopted+".git"), )) - opts := db.ListOptions{Page: 1, PageSize: 1} + opts := db.ListOptions{Page: 2, PageSize: 1} repoNames, _, err := ListUnadoptedRepositories(db.DefaultContext, "", &opts) require.NoError(t, err) require.Contains(t, repoNames, path.Join(username, unadopted)) diff --git a/services/repository/delete.go b/services/repository/delete.go index f4124fb9e2..c826842d70 100644 --- a/services/repository/delete.go +++ b/services/repository/delete.go @@ -95,16 +95,6 @@ func DeleteRepositoryDirectly(ctx context.Context, doer *user_model.User, repoID return err } - if cnt, err := sess.ID(repoID).Delete(&repo_model.Repository{}); err != nil { - return err - } else if cnt != 1 { - return repo_model.ErrRepoNotExist{ - ID: repoID, - OwnerName: "", - Name: "", - } - } - if org != nil && org.IsOrganization() { teams, err := organization.FindOrgTeams(ctx, org.ID) if err != nil { @@ -193,6 +183,16 @@ func DeleteRepositoryDirectly(ctx context.Context, doer *user_model.User, repoID return fmt.Errorf("deleteBeans: %w", err) } + if cnt, err := sess.ID(repoID).Delete(&repo_model.Repository{}); err != nil { + return err + } else if cnt != 1 { + return repo_model.ErrRepoNotExist{ + ID: repoID, + OwnerName: "", + Name: "", + } + } + // Delete Labels and related objects if err := issues_model.DeleteLabelsByRepoID(ctx, repoID); err != nil { return err diff --git a/services/repository/files/temp_repo.go b/services/repository/files/temp_repo.go index 64d3e5887d..3ce6a3413c 100644 --- a/services/repository/files/temp_repo.go +++ b/services/repository/files/temp_repo.go @@ -358,7 +358,7 @@ func (t *TemporaryUploadRepository) DiffIndex() (*gitdiff.Diff, error) { return nil, fmt.Errorf("unable to run diff-index pipeline in temporary repo: %w", err) } - diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(t.ctx, t.basePath, git.TrustedCmdArgs{"--cached"}, "HEAD") + diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetIndexShortStat(t.ctx, t.basePath, "HEAD") if err != nil { return nil, err } diff --git a/services/webhook/discord.go b/services/webhook/discord.go index 7259c4a995..330498f630 100644 --- a/services/webhook/discord.go +++ b/services/webhook/discord.go @@ -24,7 +24,7 @@ import ( api "forgejo.org/modules/structs" "forgejo.org/modules/util" webhook_module "forgejo.org/modules/webhook" - gitea_context "forgejo.org/services/context" + app_context "forgejo.org/services/context" "forgejo.org/services/forms" "forgejo.org/services/webhook/shared" @@ -47,7 +47,7 @@ var _ binding.Validator = &discordForm{} // Validate implements binding.Validator. func (d *discordForm) Validate(req *http.Request, errs binding.Errors) binding.Errors { - ctx := gitea_context.GetWebContext(req) + ctx := app_context.GetWebContext(req) if len([]rune(d.IconURL)) > 2048 { errs = append(errs, binding.Error{ FieldNames: []string{"IconURL"}, diff --git a/services/webhook/slack.go b/services/webhook/slack.go index 8c61e7ba25..e44cc09297 100644 --- a/services/webhook/slack.go +++ b/services/webhook/slack.go @@ -17,7 +17,7 @@ import ( "forgejo.org/modules/log" api "forgejo.org/modules/structs" webhook_module "forgejo.org/modules/webhook" - gitea_context "forgejo.org/services/context" + app_context "forgejo.org/services/context" "forgejo.org/services/forms" "forgejo.org/services/webhook/shared" @@ -42,7 +42,7 @@ var _ binding.Validator = &slackForm{} // Validate implements binding.Validator. func (s *slackForm) Validate(req *http.Request, errs binding.Errors) binding.Errors { - ctx := gitea_context.GetWebContext(req) + ctx := app_context.GetWebContext(req) if !IsValidSlackChannel(strings.TrimSpace(s.Channel)) { errs = append(errs, binding.Error{ FieldNames: []string{"Channel"}, diff --git a/services/webhook/sourcehut/builds.go b/services/webhook/sourcehut/builds.go index 96ed55c8ff..a3efa2a5a7 100644 --- a/services/webhook/sourcehut/builds.go +++ b/services/webhook/sourcehut/builds.go @@ -21,7 +21,7 @@ import ( "forgejo.org/modules/setting" api "forgejo.org/modules/structs" webhook_module "forgejo.org/modules/webhook" - gitea_context "forgejo.org/services/context" + app_context "forgejo.org/services/context" "forgejo.org/services/forms" "forgejo.org/services/webhook/shared" @@ -57,7 +57,7 @@ var _ binding.Validator = &buildsForm{} // Validate implements binding.Validator. func (f *buildsForm) Validate(req *http.Request, errs binding.Errors) binding.Errors { - ctx := gitea_context.GetWebContext(req) + ctx := app_context.GetWebContext(req) if !fs.ValidPath(f.ManifestPath) { errs = append(errs, binding.Error{ FieldNames: []string{"ManifestPath"}, diff --git a/templates/admin/emails/list.tmpl b/templates/admin/emails/list.tmpl index 0a9a28fa2d..035185c55c 100644 --- a/templates/admin/emails/list.tmpl +++ b/templates/admin/emails/list.tmpl @@ -75,13 +75,12 @@ {{template "base/paginate" .}} - - - + + - + +
+
{{ctx.Locale.Tr "admin.notices.view_detail_header"}}
+
+
+ +
+
+
{{template "admin/layout_footer" .}} diff --git a/templates/admin/user/edit.tmpl b/templates/admin/user/edit.tmpl index a1ff3d4117..cbf9d2df2d 100644 --- a/templates/admin/user/edit.tmpl +++ b/templates/admin/user/edit.tmpl @@ -69,6 +69,13 @@ +
+
+ + +
+ {{ctx.Locale.Tr "settings.keep_email_private_popup" .User.GetPlaceholderEmail}} +
diff --git a/templates/base/modal_actions_confirm.tmpl b/templates/base/modal_actions_confirm.tmpl index 8c4e346088..d663c8a899 100644 --- a/templates/base/modal_actions_confirm.tmpl +++ b/templates/base/modal_actions_confirm.tmpl @@ -22,7 +22,7 @@ The ".ok.button" and ".cancel.button" selectors are also used by Fomantic Modal {{if .ModalButtonCancelText}}{{$textNegitive = .ModalButtonCancelText}}{{end}} {{if .ModalButtonOkText}}{{$textPositive = .ModalButtonOkText}}{{end}} - + {{end}}
diff --git a/templates/explore/search.tmpl b/templates/explore/search.tmpl index 1d984a2e37..058bd39e87 100644 --- a/templates/explore/search.tmpl +++ b/templates/explore/search.tmpl @@ -1,23 +1,33 @@ - diff --git a/templates/repo/issue/labels/edit_delete_label.tmpl b/templates/repo/issue/labels/edit_delete_label.tmpl index a4732d35ec..31b8a03bc5 100644 --- a/templates/repo/issue/labels/edit_delete_label.tmpl +++ b/templates/repo/issue/labels/edit_delete_label.tmpl @@ -9,64 +9,64 @@ {{template "base/modal_actions_confirm" .}} -