diff --git a/.deadcode-out b/.deadcode-out
index ae0d358b51..a44599b6f1 100644
--- a/.deadcode-out
+++ b/.deadcode-out
@@ -169,6 +169,9 @@ code.gitea.io/gitea/modules/json
StdJSON.NewDecoder
StdJSON.Indent
+code.gitea.io/gitea/modules/log
+ NewEventWriterBuffer
+
code.gitea.io/gitea/modules/markup
GetRendererByType
RenderString
@@ -243,6 +246,7 @@ code.gitea.io/gitea/modules/translation
MockLocale.TrString
MockLocale.Tr
MockLocale.TrN
+ MockLocale.TrPluralString
MockLocale.TrSize
MockLocale.PrettyNumber
diff --git a/.dockerignore b/.dockerignore
index a1611a1ca5..5e7a893014 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -34,6 +34,7 @@ _testmain.go
*coverage.out
coverage.all
+coverage/
cpu.out
/modules/migration/bindata.go
diff --git a/.forgejo/testdata/build-release/Dockerfile b/.forgejo/testdata/build-release/Dockerfile
index 1116f459a9..d10564359e 100644
--- a/.forgejo/testdata/build-release/Dockerfile
+++ b/.forgejo/testdata/build-release/Dockerfile
@@ -1,4 +1,4 @@
-FROM data.forgejo.org/oci/alpine:3.20
+FROM data.forgejo.org/oci/alpine:3.21
ARG RELEASE_VERSION=unkown
LABEL maintainer="contact@forgejo.org" \
org.opencontainers.image.version="${RELEASE_VERSION}"
diff --git a/.forgejo/workflows-composite/setup-cache-go/action.yaml b/.forgejo/workflows-composite/setup-cache-go/action.yaml
index 67372d9f36..1b1d37bb6b 100644
--- a/.forgejo/workflows-composite/setup-cache-go/action.yaml
+++ b/.forgejo/workflows-composite/setup-cache-go/action.yaml
@@ -27,8 +27,9 @@ runs:
- name: "Get go environment information"
id: go-environment
run: |
- echo "modcache=$(su ${RUN_AS_USER} -c '/opt/hostedtoolcache/go/${GO_VERSION}/x64/bin/go env GOMODCACHE')" >> "$GITHUB_OUTPUT"
- echo "cache=$(su ${RUN_AS_USER} -c '/opt/hostedtoolcache/go/${GO_VERSION}/x64/bin/go env GOCACHE')" >> "$GITHUB_OUTPUT"
+ export GOROOT="$(go env GOROOT)"
+ echo "modcache=$(su ${RUN_AS_USER} -c '${GOROOT}/bin/go env GOMODCACHE')" >> "$GITHUB_OUTPUT"
+ echo "cache=$(su ${RUN_AS_USER} -c '${GOROOT}/bin/go env GOCACHE')" >> "$GITHUB_OUTPUT"
env:
RUN_AS_USER: ${{ inputs.username }}
GO_VERSION: ${{ steps.go-version.outputs.go-version }}
diff --git a/.forgejo/workflows-composite/setup-env/action.yaml b/.forgejo/workflows-composite/setup-env/action.yaml
index 28216e9b8d..f19569a137 100644
--- a/.forgejo/workflows-composite/setup-env/action.yaml
+++ b/.forgejo/workflows-composite/setup-env/action.yaml
@@ -19,7 +19,7 @@ runs:
set -ex
toolchain=$(grep -oP '(?<=toolchain ).+' go.mod)
version=$(go version | cut -d' ' -f3)
- if [ "$toolchain" != "$version" ]; then
- echo "go version mismatch: $toolchain <> $version"
+ if dpkg --compare-versions ${version#go} lt ${toolchain#go}; then
+ echo "go version too low: $toolchain >= $version"
exit 1
fi
diff --git a/.forgejo/workflows/build-release.yml b/.forgejo/workflows/build-release.yml
index 433b085969..9d88cb43dd 100644
--- a/.forgejo/workflows/build-release.yml
+++ b/.forgejo/workflows/build-release.yml
@@ -164,7 +164,7 @@ jobs:
- name: build container & release
if: ${{ secrets.TOKEN != '' }}
- uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1
+ uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.1
with:
forgejo: "${{ env.GITHUB_SERVER_URL }}"
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
@@ -183,7 +183,7 @@ jobs:
- name: build rootless container
if: ${{ secrets.TOKEN != '' }}
- uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1
+ uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.1
with:
forgejo: "${{ env.GITHUB_SERVER_URL }}"
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
diff --git a/.forgejo/workflows/publish-release.yml b/.forgejo/workflows/publish-release.yml
index cbc8455a99..0e75912a3a 100644
--- a/.forgejo/workflows/publish-release.yml
+++ b/.forgejo/workflows/publish-release.yml
@@ -42,7 +42,7 @@ jobs:
- uses: actions/checkout@v4
- name: copy & sign
- uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.2.1
+ uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.1
with:
from-forgejo: ${{ vars.FORGEJO }}
to-forgejo: ${{ vars.FORGEJO }}
@@ -61,14 +61,14 @@ jobs:
- name: get trigger mirror issue
id: mirror
- uses: https://data.forgejo.org/infrastructure/issue-action/get@v1.1.0
+ uses: https://data.forgejo.org/infrastructure/issue-action/get@v1.3.0
with:
forgejo: https://code.forgejo.org
repository: forgejo/forgejo
labels: mirror-trigger
- name: trigger the mirror
- uses: https://data.forgejo.org/infrastructure/issue-action/set@v1.1.0
+ uses: https://data.forgejo.org/infrastructure/issue-action/set@v1.3.0
with:
forgejo: https://code.forgejo.org
repository: forgejo/forgejo
diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml
index 1d89adbf42..632fb82c19 100644
--- a/.forgejo/workflows/renovate.yml
+++ b/.forgejo/workflows/renovate.yml
@@ -25,7 +25,7 @@ jobs:
runs-on: docker
container:
- image: data.forgejo.org/forgejo-contrib/renovate:39.69.2
+ image: data.forgejo.org/renovate/renovate:39.106.0
steps:
- name: Load renovate repo cache
diff --git a/.gitignore b/.gitignore
index 744577248d..79a4108dab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,6 +37,7 @@ _testmain.go
*coverage.out
coverage.all
+coverage/
cpu.out
/modules/migration/bindata.go
@@ -72,6 +73,7 @@ cpu.out
/tests/e2e/reports
/tests/e2e/test-artifacts
/tests/e2e/test-snapshots
+/tests/e2e/.auth
/tests/*.ini
/tests/**/*.git/**/*.sample
/node_modules
diff --git a/Dockerfile b/Dockerfile
index ae21a0821e..3f7f3e7d1f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,6 @@
FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/xx AS xx
-FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.23-alpine3.20 as build-env
+FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.23-alpine3.21 as build-env
ARG GOPROXY
ENV GOPROXY=${GOPROXY:-direct}
@@ -51,7 +51,7 @@ RUN chmod 755 /tmp/local/usr/bin/entrypoint \
/go/src/code.gitea.io/gitea/environment-to-ini
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete
-FROM code.forgejo.org/oci/alpine:3.20
+FROM code.forgejo.org/oci/alpine:3.21
ARG RELEASE_VERSION
LABEL maintainer="contact@forgejo.org" \
org.opencontainers.image.authors="Forgejo" \
@@ -98,7 +98,7 @@ ENV GITEA_CUSTOM=/data/gitea
VOLUME ["/data"]
ENTRYPOINT ["/usr/bin/entrypoint"]
-CMD ["/bin/s6-svscan", "/etc/s6"]
+CMD ["/usr/bin/s6-svscan", "/etc/s6"]
COPY --from=build-env /tmp/local /
RUN cd /usr/local/bin ; ln -s gitea forgejo
diff --git a/Dockerfile.rootless b/Dockerfile.rootless
index c5d6a13f35..129bd6f1ba 100644
--- a/Dockerfile.rootless
+++ b/Dockerfile.rootless
@@ -1,6 +1,6 @@
FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/xx AS xx
-FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.23-alpine3.20 as build-env
+FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.23-alpine3.21 as build-env
ARG GOPROXY
ENV GOPROXY=${GOPROXY:-direct}
@@ -49,7 +49,7 @@ RUN chmod 755 /tmp/local/usr/local/bin/docker-entrypoint.sh \
/go/src/code.gitea.io/gitea/environment-to-ini
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete
-FROM code.forgejo.org/oci/alpine:3.20
+FROM code.forgejo.org/oci/alpine:3.21
LABEL maintainer="contact@forgejo.org" \
org.opencontainers.image.authors="Forgejo" \
org.opencontainers.image.url="https://forgejo.org" \
diff --git a/Makefile b/Makefile
index a9de57e523..5865262d1a 100644
--- a/Makefile
+++ b/Makefile
@@ -37,7 +37,7 @@ endif
XGO_VERSION := go-1.21.x
AIR_PACKAGE ?= github.com/air-verse/air@v1 # renovate: datasource=go
-EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker@v3.0.3 # renovate: datasource=go
+EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker@v3.1.1 # renovate: datasource=go
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.7.0 # renovate: datasource=go
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.2 # renovate: datasource=go
GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11 # renovate: datasource=go
@@ -46,10 +46,10 @@ SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 # renova
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.28.0 # renovate: datasource=go
+DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.29.0 # renovate: datasource=go
GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.4.0 # renovate: datasource=go
-GOPLS_PACKAGE ?= golang.org/x/tools/gopls@v0.17.0 # renovate: datasource=go
-RENOVATE_NPM_PACKAGE ?= renovate@39.82.1 # renovate: datasource=docker packageName=code.forgejo.org/forgejo-contrib/renovate
+GOPLS_PACKAGE ?= golang.org/x/tools/gopls@v0.17.1 # renovate: datasource=go
+RENOVATE_NPM_PACKAGE ?= renovate@39.115.4 # 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: ...
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index a2749563d2..32f7b8c264 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -1590,7 +1590,7 @@ this situation, [follow the instructions in the companion blog post](https://for
The most prominent ones are described here, others can be found in the list of commits included in the release as described above.
- * [Fix links to pull request reviews sent via mail](https://codeberg.org/forgejo/forgejo/commit/88e179d5ef8ee41f71d068195685ff098b38ca31). The pull request link was correct but it did not go the the review and stayed at the beginning of the page
+ * [Fix links to pull request reviews sent via mail](https://codeberg.org/forgejo/forgejo/commit/88e179d5ef8ee41f71d068195685ff098b38ca31). The pull request link was correct but it did not go the review and stayed at the beginning of the page
* [Recognize OGG as an audio format](https://codeberg.org/forgejo/forgejo/commit/622ec5c79f299c32ac2667a1aa7b4bf5d7c2d6cf)
* [Consistently show the last time a cron job was run in the admin panel](https://codeberg.org/forgejo/forgejo/commit/5f769ef20)
* [Fix NuGet registry v2 & v3 API search endpoints](https://codeberg.org/forgejo/forgejo/commit/471138829b0c24fe8c621dbb866ae8bb45ebc674)
@@ -1609,7 +1609,7 @@ this situation, [follow the instructions in the companion blog post](https://for
* [Fix pull request check list when there are more than 30](https://codeberg.org/forgejo/forgejo/commit/e226b9646)
* [Fix attachment clipboard copy on insecure origin](https://codeberg.org/forgejo/forgejo/commit/12ac84c26)
* [Fix the profile README rendering](https://codeberg.org/forgejo/forgejo/commit/84c3b60a4) that [was inconsistent with other markdown files renderings](https://codeberg.org/forgejo/forgejo/issues/833)
- * [Fix API leaking the user email when the caller is not authentified](https://codeberg.org/forgejo/forgejo/commit/d89003cc1)
+ * [Fix API leaking the user email when the caller is not authenticated](https://codeberg.org/forgejo/forgejo/commit/d89003cc1)
## 1.20.2-0
@@ -1667,7 +1667,7 @@ $ git -C forgejo log --oneline --no-merges origin/v1.19/forgejo..origin/v1.20/fo
The semantic version was updated to `5.0.0+0-gitea-1.20.1` because it contains breaking changes.
- **Breaking:**
- [Scoped access tokens](https://codeberg.org/forgejo/forgejo/commit/18de83b2a3fc120922096b7348d6375094ae1532) or (Personal Access Tokens), were refactored and although existing tokens are still valid, they may have a different scope than before. To ensure that no tokens have a larger scope than expected they must be removed and recreated.
- - If your `app.ini` has one of the the following `[indexer].ISSUE_INDEXER_QUEUE_TYPE`, `[indexer].ISSUE_INDEXER_QUEUE_BATCH_NUMBER`, `[indexer].`, `[indexer].ISSUE_INDEXER_QUEUE_DIR`, `[indexer].ISSUE_INDEXER_QUEUE_CONN_STR`, `[indexer].UPDATE_BUFFER_LEN`, `[mailer].SEND_BUFFER_LEN`, `[repository].PULL_REQUEST_QUEUE_LENGTH` or `[repository].MIRROR_QUEUE_LENGTH`, Forgejo will abort immediately. Unless you know exactly what you're doing, you must comment them out so the default values are used.
+ - If your `app.ini` has one of the following `[indexer].ISSUE_INDEXER_QUEUE_TYPE`, `[indexer].ISSUE_INDEXER_QUEUE_BATCH_NUMBER`, `[indexer].`, `[indexer].ISSUE_INDEXER_QUEUE_DIR`, `[indexer].ISSUE_INDEXER_QUEUE_CONN_STR`, `[indexer].UPDATE_BUFFER_LEN`, `[mailer].SEND_BUFFER_LEN`, `[repository].PULL_REQUEST_QUEUE_LENGTH` or `[repository].MIRROR_QUEUE_LENGTH`, Forgejo will abort immediately. Unless you know exactly what you're doing, you must comment them out so the default values are used.
- The `-p` option of `environment-to-ini` is [no longer supported](https://codeberg.org/forgejo/forgejo/commit/fa0b5b14c2faa6a5f76bb2e7bc9241a5e4354189)
- The ".png" suffix for [user and organizations is now reserved](https://codeberg.org/forgejo/forgejo/commit/2b91841cd3e1213ff3e4ed4209d6a4be89c2fa79)
- The section `[git.reflog]` is [now obsolete and its keys have been moved](https://codeberg.org/forgejo/forgejo/commit/2f149c5c9db97f20fbbc65e32d1f3133048b11a2) to the following replacements:
@@ -1761,7 +1761,7 @@ $ git -C forgejo log --oneline --no-merges origin/v1.19/forgejo..origin/v1.20/fo
- [The repository migration can be canceled](https://codeberg.org/forgejo/forgejo/commit/f6e029e6c7849d4361abf7f1d749b5d528364ac4)
- [Add button on the diff header to copy the file name](https://codeberg.org/forgejo/forgejo/commit/c5ede35124c8d5280219c24049bb0ad7da9f02ed)
- [Add --quiet option to the dump CLI](https://codeberg.org/forgejo/forgejo/commit/cb1536471bcef4d78a3fe5cbd738b9f60fabbcc2)
- - [Support searching for an issue with its number in the the list of issues](https://codeberg.org/forgejo/forgejo/commit/1144b1d129de530b2c07dfdfaf55de383cd82212)
+ - [Support searching for an issue with its number in the list of issues](https://codeberg.org/forgejo/forgejo/commit/1144b1d129de530b2c07dfdfaf55de383cd82212)
- [Improve the list of notifications](https://codeberg.org/forgejo/forgejo/commit/f7ede92f82f7f3ec7bb31a1249f9524e5b728f34)
- [When editing a file in the web UI, allow for a preview whenever possible](https://codeberg.org/forgejo/forgejo/commit/ac64c8297444ade63a2a364c4afb7e6c1de5a75f)
- [Make release download URLs human readable](https://codeberg.org/forgejo/forgejo/commit/42919ccb7cd32ab67d0878baf2bac6cd007899a8)
@@ -1798,7 +1798,7 @@ $ git -C forgejo log --oneline --no-merges origin/v1.19/forgejo..origin/v1.20/fo
- [Add API for gitignore templates](https://codeberg.org/forgejo/forgejo/commit/36a5d4c2f3b5670e5e921034cd5d25817534a6d4)
- [Add API to upuload a file to an empty repository](https://codeberg.org/forgejo/forgejo/commit/cf465b472166ccf6d3e001e3043e4bf43e16e6b3)
- [Allow for --not when listing the commits of a repo](https://codeberg.org/forgejo/forgejo/commit/f766b002938b5c81e343c81fda3c0669fa09809f)
- - [Add `files` and `verification` parameters to improve performances when listing the commits of a a repo](https://codeberg.org/forgejo/forgejo/commit/1dd83dbb917d55bd253001646d6743f247a4d98b)
+ - [Add `files` and `verification` parameters to improve performances when listing the commits of a repo](https://codeberg.org/forgejo/forgejo/commit/1dd83dbb917d55bd253001646d6743f247a4d98b)
- [Allow for listing a single commit in a repository](https://codeberg.org/forgejo/forgejo/commit/5930ab5fdf7a970fcca3cd50b44cf1cacb615a54)
- [Create a branch directly from commit on the create branch API](https://codeberg.org/forgejo/forgejo/commit/cd9a13ebb47d32f46b38439a524e3b2e0c619490)
- [Add API for Label templates](https://codeberg.org/forgejo/forgejo/commit/25dc1556cd70b567a4920beb002a0addfbfd6ef2)
diff --git a/assets/go-licenses.json b/assets/go-licenses.json
index 1d19440d59..2c6bf78ec7 100644
--- a/assets/go-licenses.json
+++ b/assets/go-licenses.json
@@ -84,6 +84,11 @@
"path": "gitea.com/lunny/levelqueue/LICENSE",
"licenseText": "Copyright (c) 2019 Lunny Xiao\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
},
+ {
+ "name": "github.com/42wim/httpsig",
+ "path": "github.com/42wim/httpsig/LICENSE",
+ "licenseText": "BSD 3-Clause License\n\nCopyright (c) 2018, go-fed\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
+ },
{
"name": "github.com/42wim/sshsig",
"path": "github.com/42wim/sshsig/LICENSE",
@@ -292,7 +297,7 @@
{
"name": "github.com/cyphar/filepath-securejoin",
"path": "github.com/cyphar/filepath-securejoin/LICENSE",
- "licenseText": "Copyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
+ "licenseText": "Copyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017-2024 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
},
{
"name": "github.com/davecgh/go-spew/spew",
@@ -715,8 +720,8 @@
"licenseText": "MIT License\n\nCopyright (c) 2020-2024 Meili SAS\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
},
{
- "name": "github.com/mholt/acmez/v2",
- "path": "github.com/mholt/acmez/v2/LICENSE",
+ "name": "github.com/mholt/acmez/v3",
+ "path": "github.com/mholt/acmez/v3/LICENSE",
"licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"
},
{
@@ -812,7 +817,7 @@
{
"name": "github.com/pjbgf/sha1cd",
"path": "github.com/pjbgf/sha1cd/LICENSE",
- "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"
+ "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2023 pjbgf\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"
},
{
"name": "github.com/pkg/errors",
@@ -944,11 +949,6 @@
"path": "github.com/x448/float16/LICENSE",
"licenseText": "MIT License\n\nCopyright (c) 2019 Montgomery Edwards⁴⁴⁸ and Faye Amacker\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
},
- {
- "name": "github.com/xanzy/go-gitlab",
- "path": "github.com/xanzy/go-gitlab/LICENSE",
- "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright {yyyy} {name of copyright owner}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"
- },
{
"name": "github.com/xanzy/ssh-agent",
"path": "github.com/xanzy/ssh-agent/LICENSE",
@@ -979,6 +979,11 @@
"path": "github.com/zeebo/blake3/LICENSE",
"licenseText": "This work is released into the public domain with CC0 1.0.\n\n-------------------------------------------------------------------------------\n\nCreative Commons Legal Code\n\nCC0 1.0 Universal\n\n CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE\n LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN\n ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS\n INFORMATION ON AN \"AS-IS\" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES\n REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS\n PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM\n THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED\n HEREUNDER.\n\nStatement of Purpose\n\nThe laws of most jurisdictions throughout the world automatically confer\nexclusive Copyright and Related Rights (defined below) upon the creator\nand subsequent owner(s) (each and all, an \"owner\") of an original work of\nauthorship and/or a database (each, a \"Work\").\n\nCertain owners wish to permanently relinquish those rights to a Work for\nthe purpose of contributing to a commons of creative, cultural and\nscientific works (\"Commons\") that the public can reliably and without fear\nof later claims of infringement build upon, modify, incorporate in other\nworks, reuse and redistribute as freely as possible in any form whatsoever\nand for any purposes, including without limitation commercial purposes.\nThese owners may contribute to the Commons to promote the ideal of a free\nculture and the further production of creative, cultural and scientific\nworks, or to gain reputation or greater distribution for their Work in\npart through the use and efforts of others.\n\nFor these and/or other purposes and motivations, and without any\nexpectation of additional consideration or compensation, the person\nassociating CC0 with a Work (the \"Affirmer\"), to the extent that he or she\nis an owner of Copyright and Related Rights in the Work, voluntarily\nelects to apply CC0 to the Work and publicly distribute the Work under its\nterms, with knowledge of his or her Copyright and Related Rights in the\nWork and the meaning and intended legal effect of CC0 on those rights.\n\n1. Copyright and Related Rights. A Work made available under CC0 may be\nprotected by copyright and related or neighboring rights (\"Copyright and\nRelated Rights\"). Copyright and Related Rights include, but are not\nlimited to, the following:\n\n i. the right to reproduce, adapt, distribute, perform, display,\n communicate, and translate a Work;\n ii. moral rights retained by the original author(s) and/or performer(s);\niii. publicity and privacy rights pertaining to a person's image or\n likeness depicted in a Work;\n iv. rights protecting against unfair competition in regards to a Work,\n subject to the limitations in paragraph 4(a), below;\n v. rights protecting the extraction, dissemination, use and reuse of data\n in a Work;\n vi. database rights (such as those arising under Directive 96/9/EC of the\n European Parliament and of the Council of 11 March 1996 on the legal\n protection of databases, and under any national implementation\n thereof, including any amended or successor version of such\n directive); and\nvii. other similar, equivalent or corresponding rights throughout the\n world based on applicable law or treaty, and any national\n implementations thereof.\n\n2. Waiver. To the greatest extent permitted by, but not in contravention\nof, applicable law, Affirmer hereby overtly, fully, permanently,\nirrevocably and unconditionally waives, abandons, and surrenders all of\nAffirmer's Copyright and Related Rights and associated claims and causes\nof action, whether now known or unknown (including existing as well as\nfuture claims and causes of action), in the Work (i) in all territories\nworldwide, (ii) for the maximum duration provided by applicable law or\ntreaty (including future time extensions), (iii) in any current or future\nmedium and for any number of copies, and (iv) for any purpose whatsoever,\nincluding without limitation commercial, advertising or promotional\npurposes (the \"Waiver\"). Affirmer makes the Waiver for the benefit of each\nmember of the public at large and to the detriment of Affirmer's heirs and\nsuccessors, fully intending that such Waiver shall not be subject to\nrevocation, rescission, cancellation, termination, or any other legal or\nequitable action to disrupt the quiet enjoyment of the Work by the public\nas contemplated by Affirmer's express Statement of Purpose.\n\n3. Public License Fallback. Should any part of the Waiver for any reason\nbe judged legally invalid or ineffective under applicable law, then the\nWaiver shall be preserved to the maximum extent permitted taking into\naccount Affirmer's express Statement of Purpose. In addition, to the\nextent the Waiver is so judged Affirmer hereby grants to each affected\nperson a royalty-free, non transferable, non sublicensable, non exclusive,\nirrevocable and unconditional license to exercise Affirmer's Copyright and\nRelated Rights in the Work (i) in all territories worldwide, (ii) for the\nmaximum duration provided by applicable law or treaty (including future\ntime extensions), (iii) in any current or future medium and for any number\nof copies, and (iv) for any purpose whatsoever, including without\nlimitation commercial, advertising or promotional purposes (the\n\"License\"). The License shall be deemed effective as of the date CC0 was\napplied by Affirmer to the Work. Should any part of the License for any\nreason be judged legally invalid or ineffective under applicable law, such\npartial invalidity or ineffectiveness shall not invalidate the remainder\nof the License, and in such case Affirmer hereby affirms that he or she\nwill not (i) exercise any of his or her remaining Copyright and Related\nRights in the Work or (ii) assert any associated claims and causes of\naction with respect to the Work, in either case contrary to Affirmer's\nexpress Statement of Purpose.\n\n4. Limitations and Disclaimers.\n\n a. No trademark or patent rights held by Affirmer are waived, abandoned,\n surrendered, licensed or otherwise affected by this document.\n b. Affirmer offers the Work as-is and makes no representations or\n warranties of any kind concerning the Work, express, implied,\n statutory or otherwise, including without limitation warranties of\n title, merchantability, fitness for a particular purpose, non\n infringement, or the absence of latent or other defects, accuracy, or\n the present or absence of errors, whether or not discoverable, all to\n the greatest extent permissible under applicable law.\n c. Affirmer disclaims responsibility for clearing rights of other persons\n that may apply to the Work or any use thereof, including without\n limitation any person's Copyright and Related Rights in the Work.\n Further, Affirmer disclaims responsibility for obtaining any necessary\n consents, permissions or other rights required for any use of the\n Work.\n d. Affirmer understands and acknowledges that Creative Commons is not a\n party to this document and has no duty or obligation with respect to\n this CC0 or use of the Work.\n"
},
+ {
+ "name": "gitlab.com/gitlab-org/api/client-go",
+ "path": "gitlab.com/gitlab-org/api/client-go/LICENSE",
+ "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright {yyyy} {name of copyright owner}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"
+ },
{
"name": "go.etcd.io/bbolt",
"path": "go.etcd.io/bbolt/LICENSE",
@@ -999,6 +1004,11 @@
"path": "go.uber.org/zap/LICENSE",
"licenseText": "Copyright (c) 2016-2017 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
},
+ {
+ "name": "go.uber.org/zap/exp/zapslog",
+ "path": "go.uber.org/zap/exp/zapslog/LICENSE",
+ "licenseText": "Copyright (c) 2016-2024 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
+ },
{
"name": "golang.org/x/crypto",
"path": "golang.org/x/crypto/LICENSE",
diff --git a/build/lint-locale.go b/build/lint-locale.go
index c49e236938..44d320994c 100644
--- a/build/lint-locale.go
+++ b/build/lint-locale.go
@@ -59,9 +59,9 @@ func initRemoveTags() {
oldnew := []string{}
for _, el := range []string{
"email@example.com", "correu@example.com", "epasts@domens.lv", "email@exemplo.com", "eposta@ornek.com", "email@példa.hu", "email@esempio.it",
- "user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker",
+ "user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker", "bruger",
"server", "servidor", "kiszolgáló", "serveris",
- "label", "etichetta", "etiķete", "rótulo", "Label", "utilizador",
+ "label", "etichetta", "etiķete", "rótulo", "Label", "utilizador", "etiket", "iezīme",
} {
oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG")
}
diff --git a/cmd/admin_user_create.go b/cmd/admin_user_create.go
index dfc484aeb2..781148e734 100644
--- a/cmd/admin_user_create.go
+++ b/cmd/admin_user_create.go
@@ -69,6 +69,10 @@ var microcmdUserCreate = &cli.Command{
}
func runCreateUser(c *cli.Context) error {
+ // this command highly depends on the many setting options (create org, visibility, etc.), so it must have a full setting load first
+ // duplicate setting loading should be safe at the moment, but it should be refactored & improved in the future.
+ setting.LoadSettings()
+
if err := argsSet(c, "email"); err != nil {
return err
}
diff --git a/cmd/dump.go b/cmd/dump.go
index 5c641995a9..14f9a00b58 100644
--- a/cmd/dump.go
+++ b/cmd/dump.go
@@ -133,12 +133,12 @@ It can be used for backup and capture Forgejo server image to send to maintainer
&cli.BoolFlag{
Name: "skip-repository",
Aliases: []string{"R"},
- Usage: "Skip the repository dumping",
+ Usage: "Skip repositories",
},
&cli.BoolFlag{
Name: "skip-log",
Aliases: []string{"L"},
- Usage: "Skip the log dumping",
+ Usage: "Skip logs",
},
&cli.BoolFlag{
Name: "skip-custom-dir",
@@ -160,6 +160,10 @@ It can be used for backup and capture Forgejo server image to send to maintainer
Name: "skip-index",
Usage: "Skip bleve index data",
},
+ &cli.BoolFlag{
+ Name: "skip-repo-archives",
+ Usage: "Skip repository archives",
+ },
&cli.GenericFlag{
Name: "type",
Value: outputTypeEnum,
@@ -233,7 +237,7 @@ func runDump(ctx *cli.Context) error {
if file == nil {
file, err = os.Create(fileName)
if err != nil {
- fatal("Unable to open %s: %v", fileName, err)
+ fatal("Failed to open %s: %v", fileName, err)
}
}
defer file.Close()
@@ -250,7 +254,7 @@ func runDump(ctx *cli.Context) error {
iface, err = archiver.ByExtension(fileName)
}
if err != nil {
- fatal("Unable to get archiver for extension: %v", err)
+ fatal("Failed to get archiver for extension: %v", err)
}
w, _ := iface.(archiver.Writer)
@@ -260,7 +264,7 @@ func runDump(ctx *cli.Context) error {
defer w.Close()
if ctx.IsSet("skip-repository") && ctx.Bool("skip-repository") {
- log.Info("Skip dumping local repositories")
+ log.Info("Skipping local repositories")
} else {
log.Info("Dumping local repositories... %s", setting.RepoRootPath)
if err := addRecursiveExclude(w, "repos", setting.RepoRootPath, []string{absFileName}, verbose); err != nil {
@@ -268,9 +272,9 @@ func runDump(ctx *cli.Context) error {
}
if ctx.IsSet("skip-lfs-data") && ctx.Bool("skip-lfs-data") {
- log.Info("Skip dumping LFS data")
+ log.Info("Skipping LFS data")
} else if !setting.LFS.StartServer {
- log.Info("LFS isn't enabled. Skip dumping LFS data")
+ log.Info("LFS not enabled - skipping")
} else if err := storage.LFS.IterateObjects("", func(objPath string, object storage.Object) error {
info, err := object.Stat()
if err != nil {
@@ -295,7 +299,7 @@ func runDump(ctx *cli.Context) error {
defer func() {
_ = dbDump.Close()
if err := util.Remove(dbDump.Name()); err != nil {
- log.Warn("Unable to remove temporary file: %s: Error: %v", dbDump.Name(), err)
+ log.Warn("Failed to remove temporary file: %s: Error: %v", dbDump.Name(), err)
}
}()
@@ -331,16 +335,16 @@ func runDump(ctx *cli.Context) error {
fatal("Failed to include custom: %v", err)
}
} else {
- log.Info("Custom dir %s is inside data dir %s, skipped", setting.CustomPath, setting.AppDataPath)
+ log.Info("Custom dir %s is inside data dir %s, skipping", setting.CustomPath, setting.AppDataPath)
}
} else {
- log.Info("Custom dir %s doesn't exist, skipped", setting.CustomPath)
+ log.Info("Custom dir %s does not exist, skipping", setting.CustomPath)
}
}
isExist, err := util.IsExist(setting.AppDataPath)
if err != nil {
- log.Error("Unable to check if %s exists. Error: %v", setting.AppDataPath, err)
+ log.Error("Failed to check if %s exists: %v", setting.AppDataPath, err)
}
if isExist {
log.Info("Packing data directory...%s", setting.AppDataPath)
@@ -355,10 +359,16 @@ func runDump(ctx *cli.Context) error {
}
if ctx.IsSet("skip-index") && ctx.Bool("skip-index") {
+ log.Info("Skipping bleve index data")
excludes = append(excludes, setting.Indexer.RepoPath)
excludes = append(excludes, setting.Indexer.IssuePath)
}
+ if ctx.IsSet("skip-repo-archives") && ctx.Bool("skip-repo-archives") {
+ log.Info("Skipping repository archives data")
+ excludes = append(excludes, setting.RepoArchive.Storage.Path)
+ }
+
excludes = append(excludes, setting.RepoRootPath)
excludes = append(excludes, setting.LFS.Storage.Path)
excludes = append(excludes, setting.Attachment.Storage.Path)
@@ -371,7 +381,7 @@ func runDump(ctx *cli.Context) error {
}
if ctx.IsSet("skip-attachment-data") && ctx.Bool("skip-attachment-data") {
- log.Info("Skip dumping attachment data")
+ log.Info("Skipping attachment data")
} else if err := storage.Attachments.IterateObjects("", func(objPath string, object storage.Object) error {
info, err := object.Stat()
if err != nil {
@@ -384,9 +394,9 @@ func runDump(ctx *cli.Context) error {
}
if ctx.IsSet("skip-package-data") && ctx.Bool("skip-package-data") {
- log.Info("Skip dumping package data")
+ log.Info("Skipping package data")
} else if !setting.Packages.Enabled {
- log.Info("Packages isn't enabled. Skip dumping package data")
+ log.Info("Package registry not enabled - skipping")
} else if err := storage.Packages.IterateObjects("", func(objPath string, object storage.Object) error {
info, err := object.Stat()
if err != nil {
@@ -402,11 +412,11 @@ func runDump(ctx *cli.Context) error {
// ensuring that it's clear the dump is skipped whether the directory's initialized
// yet or not.
if ctx.IsSet("skip-log") && ctx.Bool("skip-log") {
- log.Info("Skip dumping log files")
+ log.Info("Skipping log files")
} else {
isExist, err := util.IsExist(setting.Log.RootPath)
if err != nil {
- log.Error("Unable to check if %s exists. Error: %v", setting.Log.RootPath, err)
+ log.Error("Failed to check if %s exists: %v", setting.Log.RootPath, err)
}
if isExist {
if err := addRecursiveExclude(w, "log", setting.Log.RootPath, []string{absFileName}, verbose); err != nil {
@@ -456,7 +466,7 @@ func addRecursiveExclude(w archiver.Writer, insidePath, absPath string, excludeA
currentInsidePath := path.Join(insidePath, file.Name())
if util.SliceContainsString(excludeAbsPath, currentAbsPath) {
- log.Debug("Skipping %q because matched an excluded path.", currentAbsPath)
+ log.Debug("Skipping %q (matched an excluded path)", currentAbsPath)
continue
}
diff --git a/cmd/main.go b/cmd/main.go
index b48a6143d7..9a28722b4b 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -206,6 +206,7 @@ func innerNewMainApp(version, versionExtra string, subCmdsStandaloneArgs, subCmd
app.Commands = append(app.Commands, subCmdWithConfig...)
app.Commands = append(app.Commands, subCmdStandalone...)
+ setting.InitGiteaEnvVars()
return app
}
diff --git a/cmd/main_test.go b/cmd/main_test.go
index 432f2b993c..8a9ec14b2e 100644
--- a/cmd/main_test.go
+++ b/cmd/main_test.go
@@ -6,7 +6,6 @@ package cmd
import (
"fmt"
"io"
- "os"
"path/filepath"
"strings"
"testing"
@@ -114,37 +113,17 @@ func TestCliCmd(t *testing.T) {
_, _ = fmt.Fprint(ctx.App.Writer, makePathOutput(setting.AppWorkPath, setting.CustomPath, setting.CustomConf))
return nil
})
- var envBackup []string
- for _, s := range os.Environ() {
- if strings.HasPrefix(s, "GITEA_") && strings.Contains(s, "=") {
- envBackup = append(envBackup, s)
- }
- }
- clearGiteaEnv := func() {
- for _, s := range os.Environ() {
- if strings.HasPrefix(s, "GITEA_") {
- _ = os.Unsetenv(s)
- }
- }
- }
- defer func() {
- clearGiteaEnv()
- for _, s := range envBackup {
- k, v, _ := strings.Cut(s, "=")
- _ = os.Setenv(k, v)
- }
- }()
-
for _, c := range cases {
- clearGiteaEnv()
- for k, v := range c.env {
- _ = os.Setenv(k, v)
- }
- args := strings.Split(c.cmd, " ") // for test only, "split" is good enough
- r, err := runTestApp(app, args...)
- require.NoError(t, err, c.cmd)
- assert.NotEmpty(t, c.exp, c.cmd)
- assert.Contains(t, r.Stdout, c.exp, c.cmd)
+ t.Run(c.cmd, func(t *testing.T) {
+ for k, v := range c.env {
+ t.Setenv(k, v)
+ }
+ args := strings.Split(c.cmd, " ") // for test only, "split" is good enough
+ r, err := runTestApp(app, args...)
+ require.NoError(t, err, c.cmd)
+ assert.NotEmpty(t, c.exp, c.cmd)
+ assert.Contains(t, r.Stdout, c.exp, c.cmd)
+ })
}
}
diff --git a/cmd/web.go b/cmd/web.go
index 44babd51c5..3fc64f7748 100644
--- a/cmd/web.go
+++ b/cmd/web.go
@@ -12,6 +12,7 @@ import (
"path/filepath"
"strconv"
"strings"
+ "time"
_ "net/http/pprof" // Used for debugging if enabled and a web server is running
@@ -115,6 +116,16 @@ func showWebStartupMessage(msg string) {
log.Info("* CustomPath: %s", setting.CustomPath)
log.Info("* ConfigFile: %s", setting.CustomConf)
log.Info("%s", msg) // show startup message
+
+ if setting.CORSConfig.Enabled {
+ log.Info("CORS Service Enabled")
+ }
+ if setting.DefaultUILocation != time.Local {
+ log.Info("Default UI Location is %v", setting.DefaultUILocation.String())
+ }
+ if setting.MailService != nil {
+ log.Info("Mail Service Enabled: RegisterEmailConfirm=%v, Service.EnableNotifyMail=%v", setting.Service.RegisterEmailConfirm, setting.Service.EnableNotifyMail)
+ }
}
func serveInstall(ctx *cli.Context) error {
diff --git a/docker/root/usr/bin/entrypoint b/docker/root/usr/bin/entrypoint
index d9dbb3ebe0..08587fc4f4 100755
--- a/docker/root/usr/bin/entrypoint
+++ b/docker/root/usr/bin/entrypoint
@@ -37,5 +37,5 @@ done
if [ $# -gt 0 ]; then
exec "$@"
else
- exec /bin/s6-svscan /etc/s6
+ exec /usr/bin/s6-svscan /etc/s6
fi
diff --git a/go.mod b/go.mod
index b054802289..313b41ee0d 100644
--- a/go.mod
+++ b/go.mod
@@ -2,10 +2,10 @@ module code.gitea.io/gitea
go 1.23
-toolchain go1.23.4
+toolchain go1.23.5
require (
- code.forgejo.org/f3/gof3/v3 v3.7.0
+ code.forgejo.org/f3/gof3/v3 v3.10.2
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251
code.forgejo.org/forgejo/reply v1.0.2
code.forgejo.org/go-chi/binding v1.0.0
@@ -13,20 +13,21 @@ require (
code.forgejo.org/go-chi/captcha v1.0.1
code.forgejo.org/go-chi/session v1.0.1
code.gitea.io/actions-proto-go v0.4.0
- code.gitea.io/sdk/gitea v0.17.1
+ code.gitea.io/sdk/gitea v0.20.0
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570
connectrpc.com/connect v1.17.0
gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4
+ github.com/42wim/httpsig v1.2.2
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358
- github.com/ProtonMail/go-crypto v1.0.0
- github.com/PuerkitoBio/goquery v1.10.0
+ github.com/ProtonMail/go-crypto v1.1.5
+ github.com/PuerkitoBio/goquery v1.10.1
github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2
- github.com/alecthomas/chroma/v2 v2.14.0
+ github.com/alecthomas/chroma/v2 v2.15.0
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb
github.com/blevesearch/bleve/v2 v2.4.4
github.com/buildkite/terminal-to-html/v3 v3.16.4
- github.com/caddyserver/certmagic v0.21.4
+ github.com/caddyserver/certmagic v0.21.7
github.com/chi-middleware/proxy v1.1.1
github.com/djherbis/buffer v1.2.0
github.com/djherbis/nio/v3 v3.0.1
@@ -43,8 +44,7 @@ require (
github.com/go-chi/cors v1.2.1
github.com/go-co-op/gocron v1.37.0
github.com/go-enry/go-enry/v2 v2.9.1
- github.com/go-fed/httpsig v1.1.1-0.20201223112313-55836744818e
- github.com/go-git/go-git/v5 v5.11.0
+ github.com/go-git/go-git/v5 v5.13.2
github.com/go-ldap/ldap/v3 v3.4.6
github.com/go-openapi/spec v0.20.14
github.com/go-sql-driver/mysql v1.8.1
@@ -68,7 +68,7 @@ require (
github.com/json-iterator/go v1.1.12
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
github.com/klauspost/compress v1.17.11
- github.com/klauspost/cpuid/v2 v2.2.8
+ github.com/klauspost/cpuid/v2 v2.2.9
github.com/lib/pq v1.10.9
github.com/markbates/goth v1.80.0
github.com/mattn/go-isatty v0.0.20
@@ -76,7 +76,7 @@ require (
github.com/meilisearch/meilisearch-go v0.29.0
github.com/mholt/archiver/v3 v3.5.1
github.com/microcosm-cc/bluemonday v1.0.27
- github.com/minio/minio-go/v7 v7.0.78
+ github.com/minio/minio-go/v7 v7.0.84
github.com/msteinert/pam v1.2.0
github.com/nektos/act v0.2.52
github.com/niklasfasching/go-org v1.7.0
@@ -89,27 +89,27 @@ require (
github.com/robfig/cron/v3 v3.0.1
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1
github.com/sassoftware/go-rpmutils v0.4.0
- github.com/sergi/go-diff v1.3.1
+ github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3
github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92
github.com/stretchr/testify v1.10.0
github.com/syndtr/goleveldb v1.0.0
github.com/ulikunitz/xz v0.5.12
github.com/urfave/cli/v2 v2.27.5
github.com/valyala/fastjson v1.6.4
- github.com/xanzy/go-gitlab v0.109.0
github.com/yohcop/openid-go v1.0.1
github.com/yuin/goldmark v1.7.8
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc
+ gitlab.com/gitlab-org/api/client-go v0.119.0
go.uber.org/mock v0.4.0
- golang.org/x/crypto v0.31.0
+ golang.org/x/crypto v0.32.0
golang.org/x/image v0.23.0
- golang.org/x/net v0.33.0
- golang.org/x/oauth2 v0.23.0
+ golang.org/x/net v0.34.0
+ golang.org/x/oauth2 v0.24.0
golang.org/x/sync v0.10.0
- golang.org/x/sys v0.28.0
+ golang.org/x/sys v0.29.0
golang.org/x/text v0.21.0
- google.golang.org/grpc v1.69.2
- google.golang.org/protobuf v1.36.1
+ google.golang.org/grpc v1.70.0
+ google.golang.org/protobuf v1.36.3
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/ini.v1 v1.67.0
gopkg.in/yaml.v3 v3.0.1
@@ -119,7 +119,7 @@ require (
)
require (
- cel.dev/expr v0.16.2 // indirect
+ cel.dev/expr v0.19.0 // indirect
cloud.google.com/go v0.116.0 // indirect
cloud.google.com/go/auth v0.9.9 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect
@@ -133,11 +133,11 @@ require (
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect
github.com/DataDog/zstd v1.5.5 // indirect
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect
- github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.2 // indirect
+ github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/RoaringBitmap/roaring v1.9.3 // indirect
github.com/andybalholm/brotli v1.1.1 // indirect
- github.com/andybalholm/cascadia v1.3.2 // indirect
+ github.com/andybalholm/cascadia v1.3.3 // indirect
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
@@ -168,11 +168,11 @@ require (
github.com/cloudflare/circl v1.3.8 // indirect
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
- github.com/cyphar/filepath-securejoin v0.2.4 // indirect
+ github.com/cyphar/filepath-securejoin v0.3.6 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/davidmz/go-pageant v1.0.2 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
- github.com/dlclark/regexp2 v1.11.0 // indirect
+ github.com/dlclark/regexp2 v1.11.4 // indirect
github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/envoyproxy/go-control-plane v0.13.1 // indirect
@@ -183,8 +183,9 @@ 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-fed/httpsig v1.1.0 // indirect
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
- github.com/go-git/go-billy/v5 v5.5.0 // indirect
+ github.com/go-git/go-billy/v5 v5.6.2 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
@@ -192,7 +193,7 @@ require (
github.com/go-openapi/jsonreference v0.20.4 // indirect
github.com/go-openapi/swag v0.22.7 // indirect
github.com/go-webauthn/x v0.1.14 // indirect
- github.com/goccy/go-json v0.10.3 // indirect
+ github.com/goccy/go-json v0.10.4 // indirect
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
github.com/golang/geo v0.0.0-20230421003525-6adc56603217 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
@@ -220,7 +221,7 @@ require (
github.com/markbates/going v1.0.3 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
- github.com/mholt/acmez/v2 v2.0.3 // indirect
+ github.com/mholt/acmez/v3 v3.0.1 // indirect
github.com/miekg/dns v1.1.62 // indirect
github.com/minio/md5-simd v1.1.2 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
@@ -233,7 +234,7 @@ require (
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/onsi/ginkgo v1.16.5 // indirect
github.com/pierrec/lz4/v4 v4.1.21 // indirect
- github.com/pjbgf/sha1cd v0.3.0 // indirect
+ github.com/pjbgf/sha1cd v0.3.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
@@ -246,7 +247,7 @@ require (
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
- github.com/skeema/knownhosts v1.2.1 // indirect
+ github.com/skeema/knownhosts v1.3.0 // indirect
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
@@ -255,24 +256,25 @@ require (
github.com/zeebo/blake3 v0.2.4 // indirect
go.etcd.io/bbolt v1.3.9 // indirect
go.opencensus.io v0.24.0 // indirect
- go.opentelemetry.io/contrib/detectors/gcp v1.31.0 // indirect
+ go.opentelemetry.io/contrib/detectors/gcp v1.32.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect
- go.opentelemetry.io/otel v1.31.0 // indirect
- go.opentelemetry.io/otel/metric v1.31.0 // indirect
- go.opentelemetry.io/otel/sdk v1.31.0 // indirect
- go.opentelemetry.io/otel/sdk/metric v1.31.0 // indirect
- go.opentelemetry.io/otel/trace v1.31.0 // indirect
+ go.opentelemetry.io/otel v1.32.0 // indirect
+ go.opentelemetry.io/otel/metric v1.32.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.32.0 // indirect
+ go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect
+ go.opentelemetry.io/otel/trace v1.32.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
+ go.uber.org/zap/exp v0.3.0 // indirect
golang.org/x/mod v0.22.0 // indirect
- golang.org/x/time v0.7.0 // indirect
+ golang.org/x/time v0.8.0 // indirect
golang.org/x/tools v0.28.0 // indirect
google.golang.org/api v0.203.0 // indirect
google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
)
@@ -281,10 +283,10 @@ replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1
replace github.com/shurcooL/vfsgen => github.com/lunny/vfsgen v0.0.0-20220105142115-2c99e1ffdfa0
-replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.22.0
+replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.23.1
replace github.com/mholt/archiver/v3 => code.forgejo.org/forgejo/archiver/v3 v3.5.1
-replace github.com/goccy/go-json => github.com/grafana/go-json v0.0.0-20241210211703-a119ee5a0a3b
-
replace github.com/gliderlabs/ssh => code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616
+
+replace git.sr.ht/~mariusor/go-xsd-duration => code.forgejo.org/forgejo/go-xsd-duration v0.0.0-20220703122237-02e73435a078
diff --git a/go.sum b/go.sum
index 4629eba1df..653b15b057 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,5 @@
-cel.dev/expr v0.16.2 h1:RwRhoH17VhAu9U5CMvMhH1PDVgf0tuz9FT+24AfMLfU=
-cel.dev/expr v0.16.2/go.mod h1:gXngZQMkWJoSbE8mOzehJlXQyubn/Vg0vR9/F3W7iw8=
+cel.dev/expr v0.19.0 h1:lXuo+nDhpyJSpWxpPVi5cPUwzKb+dsdOiw6IreM5yt0=
+cel.dev/expr v0.19.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -610,14 +610,16 @@ cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoIS
cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw=
-code.forgejo.org/f3/gof3/v3 v3.7.0 h1:ZfuCP8CGm8ZJbWmL+V0pUu3E0X4FCAA7GfRDy/y5/K4=
-code.forgejo.org/f3/gof3/v3 v3.7.0/go.mod h1:oNhOeqD4DZYjVcNjQXIOdDX9b/1tqxi9ITLS8H9/Csw=
+code.forgejo.org/f3/gof3/v3 v3.10.2 h1:EOlv9d8GR7l0BmvZF101O3LUuabb4g5Hw5fKYPiPZlI=
+code.forgejo.org/f3/gof3/v3 v3.10.2/go.mod h1:qApIHumpBkFkeBEokviO28+HK2WM11IsmMOhmjvCjFQ=
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 h1:HTZl3CBk3ABNYtFI6TPLvJgGKFIhKT5CBk0sbOtkDKU=
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:PphB88CPbx601QrWPMZATeorACeVmQlyv3u+uUMbSaM=
-code.forgejo.org/forgejo/act v1.22.0 h1:NbUf0+vQ48+ddwe4zVkINqnxKYl/to+NUvW7iisPA60=
-code.forgejo.org/forgejo/act v1.22.0/go.mod h1:+PcvJ9iv+NTFeJSh79ra9Jbk9l0vvyA9D9me5/dbxYM=
+code.forgejo.org/forgejo/act v1.23.1 h1:4LU7u3FE380DicHz1oZ4ohsWU9I527OHeslVHnr9eP4=
+code.forgejo.org/forgejo/act v1.23.1/go.mod h1:9zh6c69HHCT8HfMR8I38I5ikPebxumJc34IFKeiSrAE=
code.forgejo.org/forgejo/archiver/v3 v3.5.1 h1:UmmbA7D5550uf71SQjarmrn6yKwOGxtEjb3jaYYtmSE=
code.forgejo.org/forgejo/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4=
+code.forgejo.org/forgejo/go-xsd-duration v0.0.0-20220703122237-02e73435a078 h1:RArF5AsF9LH4nEoJxqRxcP5r8hhRfWcId84G82YbqzA=
+code.forgejo.org/forgejo/go-xsd-duration v0.0.0-20220703122237-02e73435a078/go.mod h1:g/V2Hjas6Z1UHUp4yIx6bATpNzJ7DYtD0FG3+xARWxs=
code.forgejo.org/forgejo/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCdgFuQ=
code.forgejo.org/forgejo/reply v1.0.2/go.mod h1:RyZUfzQLc+fuLIGjTSQWDAJWPiL4WtKXB/FifT5fM7U=
code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616 h1:kEZL84+02jY9RxXM4zHBWZ3Fml0B09cmP1LGkDsCfIA=
@@ -632,8 +634,8 @@ code.forgejo.org/go-chi/session v1.0.1 h1:RNkcJQZJBqlvJoIFXSth87b3kMFZLDBA18Vcit
code.forgejo.org/go-chi/session v1.0.1/go.mod h1:y69sjS984wc7k4xyu77yNE5HKeSlBoQW8VSGdsK7RAs=
code.gitea.io/actions-proto-go v0.4.0 h1:OsPBPhodXuQnsspG1sQ4eRE1PeoZyofd7+i73zCwnsU=
code.gitea.io/actions-proto-go v0.4.0/go.mod h1:mn7Wkqz6JbnTOHQpot3yDeHx+O5C9EGhMEE+htvHBas=
-code.gitea.io/sdk/gitea v0.17.1 h1:3jCPOG2ojbl8AcfaUCRYLT5MUcBMFwS0OSK2mA5Zok8=
-code.gitea.io/sdk/gitea v0.17.1/go.mod h1:aCnBqhHpoEWA180gMbaCtdX9Pl6BWBAuuP2miadoTNM=
+code.gitea.io/sdk/gitea v0.20.0 h1:Zm/QDwwZK1awoM4AxdjeAQbxolzx2rIP8dDfmKu+KoU=
+code.gitea.io/sdk/gitea v0.20.0/go.mod h1:faouBHC/zyx5wLgjmRKR62ydyvMzwWf3QnU0bH7Cw6U=
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570 h1:TXbikPqa7YRtfU9vS6QJBg77pUvbEb6StRdZO8t1bEY=
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570/go.mod h1:IIAjsijsd8q1isWX8MACefDEgTQslQ4stk2AeeTt3kM=
connectrpc.com/connect v1.17.0 h1:W0ZqMhtVzn9Zhn2yATuUokDLO5N+gIuBWMOnsQrfmZk=
@@ -644,13 +646,13 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
-git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 h1:cliQ4HHsCo6xi2oWZYKWW4bly/Ory9FuTpFPRxj/mAg=
-git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078/go.mod h1:g/V2Hjas6Z1UHUp4yIx6bATpNzJ7DYtD0FG3+xARWxs=
git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4 h1:IFT+hup2xejHqdhS7keYWioqfmxdnfblFDTGoOwcZ+o=
gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4/go.mod h1:HBqmLbz56JWpfEGG0prskAV97ATNRoj5LDmPicD22hU=
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
+github.com/42wim/httpsig v1.2.2 h1:ofAYoHUNs/MJOLqQ8hIxeyz2QxOz8qdSVvp3PX/oPgA=
+github.com/42wim/httpsig v1.2.2/go.mod h1:P/UYo7ytNBFwc+dg35IubuAUIs8zj5zzFIgUCEl55WY=
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121 h1:r3qt8PCHnfjOv9PN3H+XXKmDA1dfFMIN1AislhlA/ps=
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121/go.mod h1:Ock8XgA7pvULhIaHGAk/cDnRfNrF9Jey81nPcc403iU=
github.com/6543/go-version v1.3.1 h1:HvOp+Telns7HWJ2Xo/05YXQSB2bE0WmVgbHqwMPZT4U=
@@ -667,17 +669,17 @@ github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ=
github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 h1:oVLqHXhnYtUwM89y9T1fXGaK9wTkXHgNp8/ZNMQzUxE=
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.2 h1:cZpsGsWTIFKymTA0je7IIvi1O7Es7apb9CF3EQlOcfE=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.2/go.mod h1:itPGVDKf9cC/ov4MdvJ2QZ0khw4bfoo9jzwTJlaxy2k=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM=
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk=
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78=
-github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
-github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4=
-github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4=
+github.com/ProtonMail/go-crypto v1.1.5 h1:eoAQfK2dwL+tFSFpr7TbOaPNUbPiJj4fLYwwGE1FQO4=
+github.com/ProtonMail/go-crypto v1.1.5/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
+github.com/PuerkitoBio/goquery v1.10.1 h1:Y8JGYUkXWTGRB6Ars3+j3kN0xg1YqqlwvdTV8WTFQcU=
+github.com/PuerkitoBio/goquery v1.10.1/go.mod h1:IYiHrOMps66ag56LEH7QYDDupKXyo5A8qrjIx3ZtujY=
github.com/RoaringBitmap/roaring v1.9.3 h1:t4EbC5qQwnisr5PrP9nt0IRhRTb9gMUgQF4t4S2OByM=
github.com/RoaringBitmap/roaring v1.9.3/go.mod h1:6AXUsoIEzDTFFQCe1RbGA6uFONMhvejWj5rqITANK90=
github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2 h1:cSXom2MoKJ9KPPw29RoZtHvUETY4F4n/kXl8m9btnQ0=
@@ -686,11 +688,11 @@ github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm
github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
-github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE=
-github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
+github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
+github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs=
-github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E=
-github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I=
+github.com/alecthomas/chroma/v2 v2.15.0 h1:LxXTQHFoYrstG2nnV9y2X5O94sOBzf0CIUpSTbpxvMc=
+github.com/alecthomas/chroma/v2 v2.15.0/go.mod h1:gUhVLrPDXPtp/f+L1jo9xepo9gL4eLwRuGAunSZMkio=
github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8=
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
@@ -701,8 +703,8 @@ github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHG
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
-github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
-github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
+github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
+github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
@@ -768,9 +770,8 @@ github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
github.com/buildkite/terminal-to-html/v3 v3.16.4 h1:QFYO8IGvRnp7tGgiQb8g9uFU8kY9wOzxsFFx17+yy6Q=
github.com/buildkite/terminal-to-html/v3 v3.16.4/go.mod h1:r/J7cC9c3EzBzP3/wDz0RJLPwv5PUAMp+KF2w+ntMc0=
-github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
-github.com/caddyserver/certmagic v0.21.4 h1:e7VobB8rffHv8ZZpSiZtEwnLDHUwLVYLWzWSa1FfKI0=
-github.com/caddyserver/certmagic v0.21.4/go.mod h1:swUXjQ1T9ZtMv95qj7/InJvWLXURU85r+CfG0T+ZbDE=
+github.com/caddyserver/certmagic v0.21.7 h1:66KJioPFJwttL43KYSWk7ErSmE6LfaJgCQuhm8Sg6fg=
+github.com/caddyserver/certmagic v0.21.7/go.mod h1:LCPG3WLxcnjVKl/xpjzM0gqh0knrKKKiO5WVttX2eEI=
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -796,7 +797,6 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI=
github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
@@ -817,8 +817,8 @@ github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1Ig
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
-github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
+github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM=
+github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@@ -837,8 +837,8 @@ github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmW
github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
-github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
-github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
+github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo=
+github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s=
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4=
@@ -849,8 +849,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/editorconfig/editorconfig-core-go/v2 v2.6.2 h1:dKG8sc7n321deIVRcQtwlMNoBEra7j0qQ8RwxO8RN0w=
github.com/editorconfig/editorconfig-core-go/v2 v2.6.2/go.mod h1:7dvD3GCm7eBw53xZ/lsiq72LqobdMg3ITbMBxnmJmqY=
-github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
-github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
+github.com/elazarl/goproxy v1.4.0 h1:4GyuSbFa+s26+3rmYNSuUVsx+HgPrV1bk1jXI0l9wjM=
+github.com/elazarl/goproxy v1.4.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ=
github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjTA=
github.com/emersion/go-imap v1.2.1/go.mod h1:Qlx1FSx2FTxjnjWpIlVNEuX+ylerZQNFE5NsmKFSejY=
github.com/emersion/go-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4=
@@ -919,9 +919,8 @@ github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw=
github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw=
github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg=
github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo=
+github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI=
github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM=
-github.com/go-fed/httpsig v1.1.1-0.20201223112313-55836744818e h1:oRq/fiirun5HqlEWMLIcDmLpIELlG4iGbd0s8iqgPi8=
-github.com/go-fed/httpsig v1.1.1-0.20201223112313-55836744818e/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM=
github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=
github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=
github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
@@ -929,12 +928,12 @@ github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2H
github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
-github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
-github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
+github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM=
+github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
-github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4=
-github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY=
+github.com/go-git/go-git/v5 v5.13.2 h1:7O7xvsK7K+rZPKW6AQR1YyNhfywkv7B8/FsP3ki6Zv0=
+github.com/go-git/go-git/v5 v5.13.2/go.mod h1:hWdW5P4YZRjmpGHwRH2v3zkWcNl6HeXaXQEMGb3NJ9A=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -975,6 +974,9 @@ github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJA
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY=
+github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM=
+github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f h1:3BSP1Tbs2djlpprl7wCLuiqMaUh5SJkkzI2gDs+FgLs=
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f/go.mod h1:Pcatq5tYkCW2Q6yrR2VRHlbHpZ/R4/7qyL1TCF7vl14=
github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 h1:UjoPNDAQ5JPCjlxoJd6K8ALZqSDDhk2ymieAZOVaDg0=
@@ -1136,8 +1138,6 @@ github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kX
github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=
github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ=
github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik=
-github.com/grafana/go-json v0.0.0-20241210211703-a119ee5a0a3b h1:3LHDTH25Xtrac5UJfFlFL/BsykD7VLFg7xk4vtkjtk8=
-github.com/grafana/go-json v0.0.0-20241210211703-a119ee5a0a3b/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w=
@@ -1206,8 +1206,8 @@ github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
-github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
+github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU=
github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
@@ -1253,8 +1253,8 @@ github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBW
github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/meilisearch/meilisearch-go v0.29.0 h1:HZ9NEKN59USINQ/DXJge/aaXq8IrsKbXGTdAoBaaDz4=
github.com/meilisearch/meilisearch-go v0.29.0/go.mod h1:2cRCAn4ddySUsFfNDLVPod/plRibQsJkXF/4gLhxbOk=
-github.com/mholt/acmez/v2 v2.0.3 h1:CgDBlEwg3QBp6s45tPQmFIBrkRIkBT4rW4orMM6p4sw=
-github.com/mholt/acmez/v2 v2.0.3/go.mod h1:pQ1ysaDeGrIMvJ9dfJMk5kJNkn7L2sb3UhyrX6Q91cw=
+github.com/mholt/acmez/v3 v3.0.1 h1:4PcjKjaySlgXK857aTfDuRbmnM5gb3Ruz3tvoSJAUp8=
+github.com/mholt/acmez/v3 v3.0.1/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk=
github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA=
github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
@@ -1263,8 +1263,8 @@ github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcs
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
-github.com/minio/minio-go/v7 v7.0.78 h1:LqW2zy52fxnI4gg8C2oZviTaKHcBV36scS+RzJnxUFs=
-github.com/minio/minio-go/v7 v7.0.78/go.mod h1:84gmIilaX4zcvAWWzJ5Z1WI5axN+hAbM5w25xf8xvC0=
+github.com/minio/minio-go/v7 v7.0.84 h1:D1HVmAF8JF8Bpi6IU4V9vIEj+8pc+xU88EWMs2yed0E=
+github.com/minio/minio-go/v7 v7.0.84/go.mod h1:57YXpvc5l3rjPdhqNrDsvVlY0qPI6UTk1bflAe+9doY=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -1300,8 +1300,8 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
-github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
+github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
+github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
@@ -1316,8 +1316,8 @@ github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuR
github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
-github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
-github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
+github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4=
+github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -1373,8 +1373,8 @@ github.com/sassoftware/go-rpmutils v0.4.0/go.mod h1:3goNWi7PGAT3/dlql2lv3+MSN5jN
github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs=
-github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
-github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
+github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
+github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+YgDpBcK1ITf3o96N/K7/wsRXQnUTEs=
@@ -1382,8 +1382,8 @@ github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ=
-github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
+github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY=
+github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
@@ -1418,8 +1418,6 @@ github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXV
github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
-github.com/xanzy/go-gitlab v0.109.0 h1:RcRme5w8VpLXTSTTMZdVoQWY37qTJWg+gwdQl4aAttE=
-github.com/xanzy/go-gitlab v0.109.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY=
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo=
@@ -1449,6 +1447,8 @@ github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCR
github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
+gitlab.com/gitlab-org/api/client-go v0.119.0 h1:YBZyx9XUTtEDBBYtY36cZWz6JmT7om/8HPSk37IS95g=
+gitlab.com/gitlab-org/api/client-go v0.119.0/go.mod h1:ygHmS3AU3TpvK+AC6DYO1QuAxLlv6yxYK+/Votr/WFQ=
go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI=
go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
@@ -1460,22 +1460,22 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
-go.opentelemetry.io/contrib/detectors/gcp v1.31.0 h1:G1JQOreVrfhRkner+l4mrGxmfqYCAuy76asTDAo0xsA=
-go.opentelemetry.io/contrib/detectors/gcp v1.31.0/go.mod h1:tzQL6E1l+iV44YFTkcAeNQqzXUiekSYP9jjJjXwEd00=
+go.opentelemetry.io/contrib/detectors/gcp v1.32.0 h1:P78qWqkLSShicHmAzfECaTgvslqHxblNE9j62Ws1NK8=
+go.opentelemetry.io/contrib/detectors/gcp v1.32.0/go.mod h1:TVqo0Sda4Cv8gCIixd7LuLwW4EylumVWfhjZJjDD4DU=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
-go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY=
-go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE=
-go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE=
-go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
-go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
-go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
-go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc=
-go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8=
-go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys=
-go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
+go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U=
+go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg=
+go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M=
+go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8=
+go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4=
+go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU=
+go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU=
+go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
+go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM=
+go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
@@ -1490,6 +1490,8 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U=
+go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -1501,12 +1503,12 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
-golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
-golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+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.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
+golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -1522,6 +1524,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
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=
@@ -1566,6 +1570,9 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91
golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.9.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.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1629,8 +1636,12 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+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.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
+golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
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=
@@ -1660,8 +1671,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec
golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
-golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
-golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
+golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1678,6 +1689,9 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1768,9 +1782,12 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+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.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
+golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
@@ -1781,9 +1798,11 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
-golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
-golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
+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.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
+golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
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=
@@ -1802,6 +1821,7 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1810,8 +1830,8 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
-golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
+golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -1874,6 +1894,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
+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.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -2092,10 +2114,10 @@ google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOl
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53 h1:Df6WuGvthPzc+JiQ/G+m+sNX24kc0aTBqoDN/0yyykE=
google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53/go.mod h1:fheguH3Am2dGp1LfXkrvwqC/KlFq8F0nLq3LryOMrrE=
-google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 h1:fVoAXEKA4+yufmbdVYv+SE73+cPZbbbe8paLsHfkK+U=
-google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53/go.mod h1:riSXTwQ4+nqmPGtobMFyW5FqVAmIs0St6VPp4Ug7CE4=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
+google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a h1:OAiGFfOiA0v9MRYsSidp3ubZaBnteRUyn3xB2ZQ5G/E=
+google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a/go.mod h1:jehYqy3+AhJU9ve55aNOaSml7wUXjF9x6z2LcCfpAhY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a h1:hgh8P4EuoxpsuKMXX/To36nOFD7vixReXgn8lPGnt+o=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -2137,8 +2159,8 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g=
google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
-google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU=
-google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
+google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
+google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
@@ -2157,8 +2179,8 @@ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk=
-google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU=
+google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/models/actions/run_job.go b/models/actions/run_job.go
index de4b6aab66..9f8edfe4fc 100644
--- a/models/actions/run_job.go
+++ b/models/actions/run_job.go
@@ -10,6 +10,7 @@ import (
"time"
"code.gitea.io/gitea/models/db"
+ "code.gitea.io/gitea/modules/container"
"code.gitea.io/gitea/modules/timeutil"
"code.gitea.io/gitea/modules/util"
@@ -71,6 +72,15 @@ func (job *ActionRunJob) LoadAttributes(ctx context.Context) error {
return job.Run.LoadAttributes(ctx)
}
+func (job *ActionRunJob) ItRunsOn(labels []string) bool {
+ if len(labels) == 0 || len(job.RunsOn) == 0 {
+ return false
+ }
+ labelSet := make(container.Set[string])
+ labelSet.AddMultiple(labels...)
+ return labelSet.IsSubset(job.RunsOn)
+}
+
func GetRunJobByID(ctx context.Context, id int64) (*ActionRunJob, error) {
var job ActionRunJob
has, err := db.GetEngine(ctx).Where("id=?", id).Get(&job)
diff --git a/models/actions/run_job_test.go b/models/actions/run_job_test.go
new file mode 100644
index 0000000000..50a4ba10d8
--- /dev/null
+++ b/models/actions/run_job_test.go
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: MIT
+
+package actions
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestActionRunJob_ItRunsOn(t *testing.T) {
+ actionJob := ActionRunJob{RunsOn: []string{"ubuntu"}}
+ agentLabels := []string{"ubuntu", "node-20"}
+
+ assert.True(t, actionJob.ItRunsOn(agentLabels))
+ assert.False(t, actionJob.ItRunsOn([]string{}))
+
+ actionJob.RunsOn = append(actionJob.RunsOn, "node-20")
+
+ assert.True(t, actionJob.ItRunsOn(agentLabels))
+
+ agentLabels = []string{"ubuntu"}
+
+ assert.False(t, actionJob.ItRunsOn(agentLabels))
+
+ actionJob.RunsOn = []string{}
+
+ assert.False(t, actionJob.ItRunsOn(agentLabels))
+}
diff --git a/models/actions/task.go b/models/actions/task.go
index 8bd139a2d6..31655d2f1d 100644
--- a/models/actions/task.go
+++ b/models/actions/task.go
@@ -12,7 +12,6 @@ import (
auth_model "code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/unit"
- "code.gitea.io/gitea/modules/container"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/timeutil"
@@ -245,7 +244,7 @@ func CreateTaskForRunner(ctx context.Context, runner *ActionRunner) (*ActionTask
var job *ActionRunJob
log.Trace("runner labels: %v", runner.AgentLabels)
for _, v := range jobs {
- if isSubset(runner.AgentLabels, v.RunsOn) {
+ if v.ItRunsOn(runner.AgentLabels) {
job = v
break
}
@@ -482,20 +481,6 @@ func FindOldTasksToExpire(ctx context.Context, olderThan timeutil.TimeStamp, lim
Find(&tasks)
}
-func isSubset(set, subset []string) bool {
- m := make(container.Set[string], len(set))
- for _, v := range set {
- m.Add(v)
- }
-
- for _, v := range subset {
- if !m.Contains(v) {
- return false
- }
- }
- return true
-}
-
func convertTimestamp(timestamp *timestamppb.Timestamp) timeutil.TimeStamp {
if timestamp.GetSeconds() == 0 && timestamp.GetNanos() == 0 {
return timeutil.TimeStamp(0)
diff --git a/models/actions/task_list.go b/models/actions/task_list.go
index df4b43c5ef..502d29e1a3 100644
--- a/models/actions/task_list.go
+++ b/models/actions/task_list.go
@@ -50,7 +50,7 @@ type FindTaskOptions struct {
RepoID int64
OwnerID int64
CommitSHA string
- Status Status
+ Status []Status
UpdatedBefore timeutil.TimeStamp
StartedBefore timeutil.TimeStamp
RunnerID int64
@@ -67,8 +67,8 @@ func (opts FindTaskOptions) ToConds() builder.Cond {
if opts.CommitSHA != "" {
cond = cond.And(builder.Eq{"commit_sha": opts.CommitSHA})
}
- if opts.Status > StatusUnknown {
- cond = cond.And(builder.Eq{"status": opts.Status})
+ if opts.Status != nil {
+ cond = cond.And(builder.In("status", opts.Status))
}
if opts.UpdatedBefore > 0 {
cond = cond.And(builder.Lt{"updated": opts.UpdatedBefore})
diff --git a/models/auth/webauthn.go b/models/auth/webauthn.go
index aa13cf6cb1..b230e1665a 100644
--- a/models/auth/webauthn.go
+++ b/models/auth/webauthn.go
@@ -52,10 +52,10 @@ type WebAuthnCredential struct {
AAGUID []byte
SignCount uint32 `xorm:"BIGINT"`
CloneWarning bool
- BackupEligible bool `XORM:"NOT NULL DEFAULT false"`
- BackupState bool `XORM:"NOT NULL DEFAULT false"`
+ BackupEligible bool `xorm:"NOT NULL DEFAULT false"`
+ BackupState bool `xorm:"NOT NULL DEFAULT false"`
// If legacy is set to true, backup_eligible and backup_state isn't set.
- Legacy bool `XORM:"NOT NULL DEFAULT true"`
+ Legacy bool `xorm:"NOT NULL DEFAULT true"`
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
}
diff --git a/models/db/engine.go b/models/db/engine.go
index 61649592e7..822618a7e3 100755
--- a/models/db/engine.go
+++ b/models/db/engine.go
@@ -11,6 +11,7 @@ import (
"fmt"
"io"
"reflect"
+ "runtime/trace"
"strings"
"time"
@@ -163,6 +164,8 @@ func InitEngine(ctx context.Context) error {
Logger: errorLogger,
})
+ xormEngine.AddHook(&TracingHook{})
+
SetDefaultEngine(ctx, xormEngine)
return nil
}
@@ -318,6 +321,25 @@ func SetLogSQL(ctx context.Context, on bool) {
}
}
+type TracingHook struct{}
+
+var _ contexts.Hook = &TracingHook{}
+
+type sqlTask struct{}
+
+func (TracingHook) BeforeProcess(c *contexts.ContextHook) (context.Context, error) {
+ ctx, task := trace.NewTask(c.Ctx, "sql")
+ ctx = context.WithValue(ctx, sqlTask{}, task)
+ trace.Log(ctx, "query", c.SQL)
+ trace.Logf(ctx, "args", "%v", c.Args)
+ return ctx, nil
+}
+
+func (TracingHook) AfterProcess(c *contexts.ContextHook) error {
+ c.Ctx.Value(sqlTask{}).(*trace.Task).End()
+ return nil
+}
+
type SlowQueryHook struct {
Treshold time.Duration
Logger log.Logger
diff --git a/models/fixtures/action_run_job.yml b/models/fixtures/action_run_job.yml
index 117bb5ea05..702c6bc832 100644
--- a/models/fixtures/action_run_job.yml
+++ b/models/fixtures/action_run_job.yml
@@ -83,3 +83,48 @@
status: 1
started: 1683636528
stopped: 1683636626
+-
+ id: 393
+ run_id: 891
+ repo_id: 1
+ owner_id: 1
+ commit_sha: 985f0301dba5e7b34be866819cd15ad3d8f508ee
+ is_fork_pull_request: 0
+ name: job_2
+ attempt: 1
+ job_id: job_2
+ task_id: 47
+ status: 5
+ runs_on: '["ubuntu-latest"]'
+ started: 1683636528
+ stopped: 1683636626
+-
+ id: 394
+ run_id: 891
+ repo_id: 1
+ owner_id: 2
+ commit_sha: 985f0301dba5e7b34be866819cd15ad3d8f508ee
+ is_fork_pull_request: 0
+ name: job_2
+ attempt: 1
+ job_id: job_2
+ task_id: 47
+ status: 5
+ runs_on: '["debian-latest"]'
+ started: 1683636528
+ stopped: 1683636626
+-
+ id: 395
+ run_id: 891
+ repo_id: 1
+ owner_id: 3
+ commit_sha: 985f0301dba5e7b34be866819cd15ad3d8f508ee
+ is_fork_pull_request: 0
+ name: job_2
+ attempt: 1
+ job_id: job_2
+ task_id: 47
+ status: 5
+ runs_on: '["fedora"]'
+ started: 1683636528
+ stopped: 1683636626
diff --git a/models/fixtures/label.yml b/models/fixtures/label.yml
index 2242b90dcd..acfac74968 100644
--- a/models/fixtures/label.yml
+++ b/models/fixtures/label.yml
@@ -96,3 +96,14 @@
num_issues: 0
num_closed_issues: 0
archived_unix: 0
+
+-
+ id: 10
+ repo_id: 3
+ org_id: 0
+ name: repo3label1
+ color: '#112233'
+ exclusive: false
+ num_issues: 0
+ num_closed_issues: 0
+ archived_unix: 0
diff --git a/models/fixtures/user_redirect.yml b/models/fixtures/user_redirect.yml
index 8ff7993398..f471e94511 100644
--- a/models/fixtures/user_redirect.yml
+++ b/models/fixtures/user_redirect.yml
@@ -2,3 +2,4 @@
id: 1
lower_name: olduser1
redirect_user_id: 1
+ created_unix: 1730000000
diff --git a/models/forgejo_migrations/migrate.go b/models/forgejo_migrations/migrate.go
index 980f649f41..1450ad3c54 100644
--- a/models/forgejo_migrations/migrate.go
+++ b/models/forgejo_migrations/migrate.go
@@ -88,6 +88,10 @@ var migrations = []*Migration{
NewMigration("Add `purpose` column to `forgejo_auth_token` table", AddPurposeToForgejoAuthToken),
// v25 -> v26
NewMigration("Migrate `secret` column to store keying material", MigrateTwoFactorToKeying),
+ // v26 -> v27
+ NewMigration("Add `hash_blake2b` column to `package_blob` table", AddHashBlake2bToPackageBlob),
+ // v27 -> v28
+ NewMigration("Add `created_unix` column to `user_redirect` table", AddCreatedUnixToRedirect),
}
// GetCurrentDBVersion returns the current Forgejo database version.
diff --git a/models/forgejo_migrations/v26.go b/models/forgejo_migrations/v26.go
new file mode 100644
index 0000000000..5efe48a302
--- /dev/null
+++ b/models/forgejo_migrations/v26.go
@@ -0,0 +1,14 @@
+// Copyright 2024 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package forgejo_migrations //nolint:revive
+
+import "xorm.io/xorm"
+
+func AddHashBlake2bToPackageBlob(x *xorm.Engine) error {
+ type PackageBlob struct {
+ ID int64 `xorm:"pk autoincr"`
+ HashBlake2b string
+ }
+ return x.Sync(&PackageBlob{})
+}
diff --git a/models/forgejo_migrations/v27.go b/models/forgejo_migrations/v27.go
new file mode 100644
index 0000000000..b3a93a9aad
--- /dev/null
+++ b/models/forgejo_migrations/v27.go
@@ -0,0 +1,18 @@
+// Copyright 2024 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package forgejo_migrations //nolint:revive
+
+import (
+ "code.gitea.io/gitea/modules/timeutil"
+
+ "xorm.io/xorm"
+)
+
+func AddCreatedUnixToRedirect(x *xorm.Engine) error {
+ type UserRedirect struct {
+ ID int64 `xorm:"pk autoincr"`
+ CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL DEFAULT 0"`
+ }
+ return x.Sync(new(UserRedirect))
+}
diff --git a/models/issues/comment.go b/models/issues/comment.go
index c955f02e98..0bf53bb4dd 100644
--- a/models/issues/comment.go
+++ b/models/issues/comment.go
@@ -194,6 +194,20 @@ func (t CommentType) HasMailReplySupport() bool {
return false
}
+func (t CommentType) CountedAsConversation() bool {
+ for _, ct := range ConversationCountedCommentType() {
+ if t == ct {
+ return true
+ }
+ }
+ return false
+}
+
+// ConversationCountedCommentType returns the comment types that are counted as a conversation
+func ConversationCountedCommentType() []CommentType {
+ return []CommentType{CommentTypeComment, CommentTypeReview}
+}
+
// RoleInRepo presents the user's participation in the repo
type RoleInRepo string
@@ -887,7 +901,7 @@ func updateCommentInfos(ctx context.Context, opts *CreateCommentOptions, comment
}
fallthrough
case CommentTypeComment:
- if _, err = db.Exec(ctx, "UPDATE `issue` SET num_comments=num_comments+1 WHERE id=?", opts.Issue.ID); err != nil {
+ if err := UpdateIssueNumComments(ctx, opts.Issue.ID); err != nil {
return err
}
fallthrough
@@ -1182,8 +1196,8 @@ func DeleteComment(ctx context.Context, comment *Comment) error {
return err
}
- if comment.Type == CommentTypeComment {
- if _, err := e.ID(comment.IssueID).Decr("num_comments").Update(new(Issue)); err != nil {
+ if comment.Type.CountedAsConversation() {
+ if err := UpdateIssueNumComments(ctx, comment.IssueID); err != nil {
return err
}
}
@@ -1300,6 +1314,21 @@ func (c *Comment) HasOriginalAuthor() bool {
return c.OriginalAuthor != "" && c.OriginalAuthorID != 0
}
+func UpdateIssueNumCommentsBuilder(issueID int64) *builder.Builder {
+ subQuery := builder.Select("COUNT(*)").From("`comment`").Where(
+ builder.Eq{"issue_id": issueID}.And(
+ builder.In("`type`", ConversationCountedCommentType()),
+ ))
+
+ return builder.Update(builder.Eq{"num_comments": subQuery}).
+ From("`issue`").Where(builder.Eq{"id": issueID})
+}
+
+func UpdateIssueNumComments(ctx context.Context, issueID int64) error {
+ _, err := db.GetEngine(ctx).Exec(UpdateIssueNumCommentsBuilder(issueID))
+ return err
+}
+
// InsertIssueComments inserts many comments of issues.
func InsertIssueComments(ctx context.Context, comments []*Comment) error {
if len(comments) == 0 {
@@ -1332,8 +1361,7 @@ func InsertIssueComments(ctx context.Context, comments []*Comment) error {
}
for _, issueID := range issueIDs {
- if _, err := db.Exec(ctx, "UPDATE issue set num_comments = (SELECT count(*) FROM comment WHERE issue_id = ? AND `type`=?) WHERE id = ?",
- issueID, CommentTypeComment, issueID); err != nil {
+ if err := UpdateIssueNumComments(ctx, issueID); err != nil {
return err
}
}
diff --git a/models/issues/comment_test.go b/models/issues/comment_test.go
index f7088cc96c..88d2200bd1 100644
--- a/models/issues/comment_test.go
+++ b/models/issues/comment_test.go
@@ -125,3 +125,12 @@ func TestUpdateCommentsMigrationsByType(t *testing.T) {
assert.Empty(t, comment.OriginalAuthorID)
assert.EqualValues(t, 513, comment.PosterID)
}
+
+func Test_UpdateIssueNumComments(t *testing.T) {
+ require.NoError(t, unittest.PrepareTestDatabase())
+ issue2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
+
+ require.NoError(t, issues_model.UpdateIssueNumComments(db.DefaultContext, issue2.ID))
+ issue2 = unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
+ assert.EqualValues(t, 1, issue2.NumComments)
+}
diff --git a/models/issues/issue.go b/models/issues/issue.go
index 17391ffe6c..1e969790d7 100644
--- a/models/issues/issue.go
+++ b/models/issues/issue.go
@@ -268,6 +268,9 @@ func (issue *Issue) loadCommentsByType(ctx context.Context, tp CommentType) (err
IssueID: issue.ID,
Type: tp,
})
+ for _, comment := range issue.Comments {
+ comment.Issue = issue
+ }
return err
}
@@ -416,20 +419,6 @@ func (issue *Issue) SummaryCardURL() string {
return fmt.Sprintf("%s/summary-card", issue.HTMLURL())
}
-func (issue *Issue) SummaryCardSize() (int, int) {
- return 1200, 600
-}
-
-func (issue *Issue) SummaryCardWidth() int {
- width, _ := issue.SummaryCardSize()
- return width
-}
-
-func (issue *Issue) SummaryCardHeight() int {
- _, height := issue.SummaryCardSize()
- return height
-}
-
// Link returns the issue's relative URL.
func (issue *Issue) Link() string {
var path string
diff --git a/models/issues/label.go b/models/issues/label.go
index 804a118e7a..259c87459e 100644
--- a/models/issues/label.go
+++ b/models/issues/label.go
@@ -353,6 +353,17 @@ func GetLabelIDsInRepoByNames(ctx context.Context, repoID int64, labelNames []st
Find(&labelIDs)
}
+// GetLabelIDsInOrgByNames returns a list of labelIDs by names in a given org.
+func GetLabelIDsInOrgByNames(ctx context.Context, orgID int64, labelNames []string) ([]int64, error) {
+ labelIDs := make([]int64, 0, len(labelNames))
+ return labelIDs, db.GetEngine(ctx).Table("label").
+ Where("org_id = ?", orgID).
+ In("name", labelNames).
+ Asc("name").
+ Cols("id").
+ Find(&labelIDs)
+}
+
// BuildLabelNamesIssueIDsCondition returns a builder where get issue ids match label names
func BuildLabelNamesIssueIDsCondition(labelNames []string) *builder.Builder {
return builder.Select("issue_label.issue_id").
diff --git a/models/issues/review.go b/models/issues/review.go
index a39c12069b..cd3190f119 100644
--- a/models/issues/review.go
+++ b/models/issues/review.go
@@ -614,6 +614,10 @@ func InsertReviews(ctx context.Context, reviews []*Review) error {
return err
}
}
+
+ if err := UpdateIssueNumComments(ctx, review.IssueID); err != nil {
+ return err
+ }
}
return committer.Commit()
diff --git a/models/migrations/v1_23/v303.go b/models/migrations/v1_23/v303.go
index c1e74c596a..2fb37ac843 100644
--- a/models/migrations/v1_23/v303.go
+++ b/models/migrations/v1_23/v303.go
@@ -1,5 +1,5 @@
-// Copyright 2024 The Forgejo Authors.
-// SPDX-License-Identifier: MIT
+// Copyright 2025 The Forgejo Authors.
+// SPDX-License-Identifier: GPL-3.0-or-later
package v1_23 //nolint
@@ -7,26 +7,53 @@ import (
"code.gitea.io/gitea/models/migrations/base"
"xorm.io/xorm"
+ "xorm.io/xorm/schemas"
)
func GiteaLastDrop(x *xorm.Engine) error {
+ tables, err := x.DBMetas()
+ if err != nil {
+ return err
+ }
+
sess := x.NewSession()
defer sess.Close()
- if err := base.DropTableColumns(sess, "badge", "slug"); err != nil {
- return err
- }
- if err := base.DropTableColumns(sess, "oauth2_application", "skip_secondary_authorization"); err != nil {
- return err
- }
- if err := base.DropTableColumns(sess, "repository", "default_wiki_branch"); err != nil {
- return err
- }
- // the migration v297.go that adds everyone_access_mode exists in Gitea >= v1.22 and the column must be dropped
- // but it does not exist in Forgejo and a failure to drop the column can be ignored
- base.DropTableColumns(sess, "repo_unit", "everyone_access_mode")
- if err := base.DropTableColumns(sess, "protected_branch", "can_force_push", "enable_force_push_allowlist", "force_push_allowlist_user_i_ds", "force_push_allowlist_team_i_ds", "force_push_allowlist_deploy_keys"); err != nil {
- return err
+ for _, drop := range []struct {
+ table string
+ column string
+ }{
+ {"badge", "slug"},
+ {"oauth2_application", "skip_secondary_authorization"},
+ {"repository", "default_wiki_branch"},
+ {"repo_unit", "everyone_access_mode"},
+ {"protected_branch", "can_force_push"},
+ {"protected_branch", "enable_force_push_allowlist"},
+ {"protected_branch", "force_push_allowlist_user_i_ds"},
+ {"protected_branch", "force_push_allowlist_team_i_ds"},
+ {"protected_branch", "force_push_allowlist_deploy_keys"},
+ } {
+ var table *schemas.Table
+ found := false
+
+ for _, table = range tables {
+ if table.Name == drop.table {
+ found = true
+ break
+ }
+ }
+
+ if !found {
+ continue
+ }
+
+ if table.GetColumn(drop.column) == nil {
+ continue
+ }
+
+ if err := base.DropTableColumns(sess, drop.table, drop.column); err != nil {
+ return err
+ }
}
return sess.Commit()
diff --git a/models/migrations/v1_23/v303_test.go b/models/migrations/v1_23/v303_test.go
new file mode 100644
index 0000000000..752eacee0c
--- /dev/null
+++ b/models/migrations/v1_23/v303_test.go
@@ -0,0 +1,41 @@
+// Copyright 2025 The Forgejo Authors.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package v1_23 //nolint
+
+import (
+ "testing"
+
+ migration_tests "code.gitea.io/gitea/models/migrations/test"
+
+ "github.com/stretchr/testify/require"
+ "xorm.io/xorm/schemas"
+)
+
+func Test_GiteaLastDrop(t *testing.T) {
+ type Badge struct {
+ ID int64 `xorm:"pk autoincr"`
+ Slug string
+ }
+
+ x, deferable := migration_tests.PrepareTestEnv(t, 0, new(Badge))
+ defer deferable()
+ if x == nil || t.Failed() {
+ return
+ }
+
+ getColumn := func() *schemas.Column {
+ tables, err := x.DBMetas()
+ require.NoError(t, err)
+ require.Len(t, tables, 1)
+ table := tables[0]
+ require.Equal(t, "badge", table.Name)
+ return table.GetColumn("slug")
+ }
+
+ require.NotNil(t, getColumn(), "slug column exists")
+ require.NoError(t, GiteaLastDrop(x))
+ require.Nil(t, getColumn(), "slug column was deleted")
+ // idempotent
+ require.NoError(t, GiteaLastDrop(x))
+}
diff --git a/models/packages/alt/search.go b/models/packages/alt/search.go
new file mode 100644
index 0000000000..a9a0d524d3
--- /dev/null
+++ b/models/packages/alt/search.go
@@ -0,0 +1,29 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package alt
+
+import (
+ "context"
+
+ packages_model "code.gitea.io/gitea/models/packages"
+ rpm_module "code.gitea.io/gitea/modules/packages/rpm"
+)
+
+type PackageSearchOptions struct {
+ OwnerID int64
+ GroupID int64
+ Architecture string
+}
+
+// GetGroups gets all available groups
+func GetGroups(ctx context.Context, ownerID int64) ([]string, error) {
+ return packages_model.GetDistinctPropertyValues(
+ ctx,
+ packages_model.TypeAlt,
+ ownerID,
+ packages_model.PropertyTypeFile,
+ rpm_module.PropertyGroup,
+ nil,
+ )
+}
diff --git a/models/packages/descriptor.go b/models/packages/descriptor.go
index 803b73c968..32c871558a 100644
--- a/models/packages/descriptor.go
+++ b/models/packages/descriptor.go
@@ -187,6 +187,8 @@ func GetPackageDescriptor(ctx context.Context, pv *PackageVersion) (*PackageDesc
metadata = &pypi.Metadata{}
case TypeRpm:
metadata = &rpm.VersionMetadata{}
+ case TypeAlt:
+ metadata = &rpm.VersionMetadata{}
case TypeRubyGems:
metadata = &rubygems.Metadata{}
case TypeSwift:
diff --git a/models/packages/package.go b/models/packages/package.go
index 364cc2e7cc..fd408f8bef 100644
--- a/models/packages/package.go
+++ b/models/packages/package.go
@@ -51,6 +51,7 @@ const (
TypePub Type = "pub"
TypePyPI Type = "pypi"
TypeRpm Type = "rpm"
+ TypeAlt Type = "alt"
TypeRubyGems Type = "rubygems"
TypeSwift Type = "swift"
TypeVagrant Type = "vagrant"
@@ -76,6 +77,7 @@ var TypeList = []Type{
TypePub,
TypePyPI,
TypeRpm,
+ TypeAlt,
TypeRubyGems,
TypeSwift,
TypeVagrant,
@@ -122,6 +124,8 @@ func (pt Type) Name() string {
return "PyPI"
case TypeRpm:
return "RPM"
+ case TypeAlt:
+ return "Alt"
case TypeRubyGems:
return "RubyGems"
case TypeSwift:
@@ -173,6 +177,8 @@ func (pt Type) SVGName() string {
return "gitea-python"
case TypeRpm:
return "gitea-rpm"
+ case TypeAlt:
+ return "gitea-alt"
case TypeRubyGems:
return "gitea-rubygems"
case TypeSwift:
diff --git a/models/packages/package_blob.go b/models/packages/package_blob.go
index d9c30b6533..439178a14e 100644
--- a/models/packages/package_blob.go
+++ b/models/packages/package_blob.go
@@ -34,6 +34,7 @@ type PackageBlob struct {
HashSHA1 string `xorm:"hash_sha1 char(40) UNIQUE(sha1) INDEX NOT NULL"`
HashSHA256 string `xorm:"hash_sha256 char(64) UNIQUE(sha256) INDEX NOT NULL"`
HashSHA512 string `xorm:"hash_sha512 char(128) UNIQUE(sha512) INDEX NOT NULL"`
+ HashBlake2b string `xorm:"hash_blake2b char(128) UNIQUE(blake2b) INDEX"`
CreatedUnix timeutil.TimeStamp `xorm:"created INDEX NOT NULL"`
}
@@ -44,11 +45,12 @@ func GetOrInsertBlob(ctx context.Context, pb *PackageBlob) (*PackageBlob, bool,
existing := &PackageBlob{}
has, err := e.Where(builder.Eq{
- "size": pb.Size,
- "hash_md5": pb.HashMD5,
- "hash_sha1": pb.HashSHA1,
- "hash_sha256": pb.HashSHA256,
- "hash_sha512": pb.HashSHA512,
+ "size": pb.Size,
+ "hash_md5": pb.HashMD5,
+ "hash_sha1": pb.HashSHA1,
+ "hash_sha256": pb.HashSHA256,
+ "hash_sha512": pb.HashSHA512,
+ "hash_blake2b": pb.HashBlake2b,
}).Get(existing)
if err != nil {
return nil, false, err
diff --git a/models/project/project.go b/models/project/project.go
index 245838abb5..beffffcdfc 100644
--- a/models/project/project.go
+++ b/models/project/project.go
@@ -126,6 +126,14 @@ func (p *Project) LoadRepo(ctx context.Context) (err error) {
return err
}
+func ProjectLinkForOrg(org *user_model.User, projectID int64) string { //nolint
+ return fmt.Sprintf("%s/-/projects/%d", org.HomeLink(), projectID)
+}
+
+func ProjectLinkForRepo(repo *repo_model.Repository, projectID int64) string { //nolint
+ return fmt.Sprintf("%s/projects/%d", repo.Link(), projectID)
+}
+
// Link returns the project's relative URL.
func (p *Project) Link(ctx context.Context) string {
if p.OwnerID > 0 {
@@ -134,7 +142,7 @@ func (p *Project) Link(ctx context.Context) string {
log.Error("LoadOwner: %v", err)
return ""
}
- return fmt.Sprintf("%s/-/projects/%d", p.Owner.HomeLink(), p.ID)
+ return ProjectLinkForOrg(p.Owner, p.ID)
}
if p.RepoID > 0 {
err := p.LoadRepo(ctx)
@@ -142,7 +150,7 @@ func (p *Project) Link(ctx context.Context) string {
log.Error("LoadRepo: %v", err)
return ""
}
- return fmt.Sprintf("%s/projects/%d", p.Repo.Link(), p.ID)
+ return ProjectLinkForRepo(p.Repo, p.ID)
}
return ""
}
diff --git a/models/repo.go b/models/repo.go
index 0dc8ee5df3..598f8df6a4 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -19,6 +19,8 @@ import (
"code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/log"
+
+ "xorm.io/builder"
)
// Init initialize model
@@ -27,7 +29,7 @@ func Init(ctx context.Context) error {
}
type repoChecker struct {
- querySQL func(ctx context.Context) ([]map[string][]byte, error)
+ querySQL func(ctx context.Context) ([]int64, error)
correctSQL func(ctx context.Context, id int64) error
desc string
}
@@ -38,8 +40,7 @@ func repoStatsCheck(ctx context.Context, checker *repoChecker) {
log.Error("Select %s: %v", checker.desc, err)
return
}
- for _, result := range results {
- id, _ := strconv.ParseInt(string(result["id"]), 10, 64)
+ for _, id := range results {
select {
case <-ctx.Done():
log.Warn("CheckRepoStats: Cancelled before checking %s for with id=%d", checker.desc, id)
@@ -54,21 +55,23 @@ func repoStatsCheck(ctx context.Context, checker *repoChecker) {
}
}
-func StatsCorrectSQL(ctx context.Context, sql string, id int64) error {
- _, err := db.GetEngine(ctx).Exec(sql, id, id)
+func StatsCorrectSQL(ctx context.Context, sql any, ids ...any) error {
+ args := []any{sql}
+ args = append(args, ids...)
+ _, err := db.GetEngine(ctx).Exec(args...)
return err
}
func repoStatsCorrectNumWatches(ctx context.Context, id int64) error {
- return StatsCorrectSQL(ctx, "UPDATE `repository` SET num_watches=(SELECT COUNT(*) FROM `watch` WHERE repo_id=? AND mode<>2) WHERE id=?", id)
+ return StatsCorrectSQL(ctx, "UPDATE `repository` SET num_watches=(SELECT COUNT(*) FROM `watch` WHERE repo_id=? AND mode<>2) WHERE id=?", id, id)
}
func repoStatsCorrectNumStars(ctx context.Context, id int64) error {
- return StatsCorrectSQL(ctx, "UPDATE `repository` SET num_stars=(SELECT COUNT(*) FROM `star` WHERE repo_id=?) WHERE id=?", id)
+ return StatsCorrectSQL(ctx, "UPDATE `repository` SET num_stars=(SELECT COUNT(*) FROM `star` WHERE repo_id=?) WHERE id=?", id, id)
}
func labelStatsCorrectNumIssues(ctx context.Context, id int64) error {
- return StatsCorrectSQL(ctx, "UPDATE `label` SET num_issues=(SELECT COUNT(*) FROM `issue_label` WHERE label_id=?) WHERE id=?", id)
+ return StatsCorrectSQL(ctx, "UPDATE `label` SET num_issues=(SELECT COUNT(*) FROM `issue_label` WHERE label_id=?) WHERE id=?", id, id)
}
func labelStatsCorrectNumIssuesRepo(ctx context.Context, id int64) error {
@@ -105,11 +108,11 @@ func milestoneStatsCorrectNumIssuesRepo(ctx context.Context, id int64) error {
}
func userStatsCorrectNumRepos(ctx context.Context, id int64) error {
- return StatsCorrectSQL(ctx, "UPDATE `user` SET num_repos=(SELECT COUNT(*) FROM `repository` WHERE owner_id=?) WHERE id=?", id)
+ return StatsCorrectSQL(ctx, "UPDATE `user` SET num_repos=(SELECT COUNT(*) FROM `repository` WHERE owner_id=?) WHERE id=?", id, id)
}
func repoStatsCorrectIssueNumComments(ctx context.Context, id int64) error {
- return StatsCorrectSQL(ctx, "UPDATE `issue` SET num_comments=(SELECT COUNT(*) FROM `comment` WHERE issue_id=? AND type=0) WHERE id=?", id)
+ return StatsCorrectSQL(ctx, issues_model.UpdateIssueNumCommentsBuilder(id))
}
func repoStatsCorrectNumIssues(ctx context.Context, id int64) error {
@@ -128,9 +131,12 @@ func repoStatsCorrectNumClosedPulls(ctx context.Context, id int64) error {
return repo_model.UpdateRepoIssueNumbers(ctx, id, true, true)
}
-func statsQuery(args ...any) func(context.Context) ([]map[string][]byte, error) {
- return func(ctx context.Context) ([]map[string][]byte, error) {
- return db.GetEngine(ctx).Query(args...)
+// statsQuery returns a function that queries the database for a list of IDs
+// sql could be a string or a *builder.Builder
+func statsQuery(sql any, args ...any) func(context.Context) ([]int64, error) {
+ return func(ctx context.Context) ([]int64, error) {
+ var ids []int64
+ return ids, db.GetEngine(ctx).SQL(sql, args...).Find(&ids)
}
}
@@ -201,7 +207,16 @@ func CheckRepoStats(ctx context.Context) error {
},
// Issue.NumComments
{
- statsQuery("SELECT `issue`.id FROM `issue` WHERE `issue`.num_comments!=(SELECT COUNT(*) FROM `comment` WHERE issue_id=`issue`.id AND type=0)"),
+ statsQuery(builder.Select("`issue`.id").From("`issue`").Where(
+ builder.Neq{
+ "`issue`.num_comments": builder.Select("COUNT(*)").From("`comment`").Where(
+ builder.Expr("issue_id = `issue`.id").And(
+ builder.In("type", issues_model.ConversationCountedCommentType()),
+ ),
+ ),
+ },
+ ),
+ ),
repoStatsCorrectIssueNumComments,
"issue count 'num_comments'",
},
diff --git a/models/repo/archive_download_count.go b/models/repo/archive_download_count.go
index 31f0399d53..b0735df3ea 100644
--- a/models/repo/archive_download_count.go
+++ b/models/repo/archive_download_count.go
@@ -24,7 +24,7 @@ func init() {
db.RegisterModel(new(RepoArchiveDownloadCount))
}
-// CountArchiveDownload adds one download the the given archive
+// CountArchiveDownload adds one download the given archive
func CountArchiveDownload(ctx context.Context, repoID, releaseID int64, tp git.ArchiveType) error {
updateCount, err := db.GetEngine(ctx).Where("repo_id = ?", repoID).And("release_id = ?", releaseID).And("`type` = ?", tp).Incr("count").Update(new(RepoArchiveDownloadCount))
if err != nil {
diff --git a/models/repo/release.go b/models/repo/release.go
index 38e38c6572..eb18f8aa02 100644
--- a/models/repo/release.go
+++ b/models/repo/release.go
@@ -97,13 +97,11 @@ func init() {
// LoadAttributes load repo and publisher attributes for a release
func (r *Release) LoadAttributes(ctx context.Context) error {
- var err error
- if r.Repo == nil {
- r.Repo, err = GetRepositoryByID(ctx, r.RepoID)
- if err != nil {
- return err
- }
+ err := r.LoadRepo(ctx)
+ if err != nil {
+ return err
}
+
if r.Publisher == nil {
r.Publisher, err = user_model.GetUserByID(ctx, r.PublisherID)
if err != nil {
@@ -123,6 +121,18 @@ func (r *Release) LoadAttributes(ctx context.Context) error {
return GetReleaseAttachments(ctx, r)
}
+// LoadRepo load repo attribute for release
+func (r *Release) LoadRepo(ctx context.Context) error {
+ if r.Repo != nil {
+ return nil
+ }
+
+ var err error
+ r.Repo, err = GetRepositoryByID(ctx, r.RepoID)
+
+ return err
+}
+
// LoadArchiveDownloadCount loads the download count for the source archives
func (r *Release) LoadArchiveDownloadCount(ctx context.Context) error {
var err error
@@ -130,6 +140,25 @@ func (r *Release) LoadArchiveDownloadCount(ctx context.Context) error {
return err
}
+// GetTotalDownloadCount returns the summary of all dowload count of files attached to the release
+func (r *Release) GetTotalDownloadCount(ctx context.Context) (int64, error) {
+ var archiveCount int64
+ if !r.HideArchiveLinks {
+ _, err := db.GetEngine(ctx).SQL("SELECT SUM(count) FROM repo_archive_download_count WHERE release_id = ?", r.ID).Get(&archiveCount)
+ if err != nil {
+ return 0, err
+ }
+ }
+
+ var attachmentCount int64
+ _, err := db.GetEngine(ctx).SQL("SELECT SUM(download_count) FROM attachment WHERE release_id = ?", r.ID).Get(&attachmentCount)
+ if err != nil {
+ return 0, err
+ }
+
+ return archiveCount + attachmentCount, nil
+}
+
// APIURL the api url for a release. release must have attributes loaded
func (r *Release) APIURL() string {
return r.Repo.APIURL() + "/releases/" + strconv.FormatInt(r.ID, 10)
@@ -160,6 +189,20 @@ func (r *Release) Link() string {
return r.Repo.Link() + "/releases/tag/" + util.PathEscapeSegments(r.TagName)
}
+// SummaryCardURL returns the absolute URL to an image providing a summary of the release
+func (r *Release) SummaryCardURL() string {
+ return fmt.Sprintf("%s/releases/summary-card/%s", r.Repo.HTMLURL(), util.PathEscapeSegments(r.TagName))
+}
+
+// DisplayName retruns the name of the release
+func (r *Release) DisplayName() string {
+ if r.IsTag && r.Title == "" {
+ return r.TagName
+ }
+
+ return r.Title
+}
+
// IsReleaseExist returns true if release with given tag name already exists.
func IsReleaseExist(ctx context.Context, repoID int64, tagName string) (bool, error) {
if len(tagName) == 0 {
diff --git a/models/repo/release_test.go b/models/repo/release_test.go
index 4e61a2805d..7680f2cc9d 100644
--- a/models/repo/release_test.go
+++ b/models/repo/release_test.go
@@ -9,6 +9,7 @@ import (
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/unittest"
+ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -25,3 +26,26 @@ func TestMigrate_InsertReleases(t *testing.T) {
err := InsertReleases(db.DefaultContext, r)
require.NoError(t, err)
}
+
+func TestReleaseLoadRepo(t *testing.T) {
+ require.NoError(t, unittest.PrepareTestDatabase())
+
+ release := unittest.AssertExistsAndLoadBean(t, &Release{ID: 1})
+ assert.Nil(t, release.Repo)
+
+ require.NoError(t, release.LoadRepo(db.DefaultContext))
+
+ assert.EqualValues(t, 1, release.Repo.ID)
+}
+
+func TestReleaseDisplayName(t *testing.T) {
+ release := Release{TagName: "TagName"}
+
+ assert.Empty(t, release.DisplayName())
+
+ release.IsTag = true
+ assert.Equal(t, "TagName", release.DisplayName())
+
+ release.Title = "Title"
+ assert.Equal(t, "Title", release.DisplayName())
+}
diff --git a/models/repo/repo.go b/models/repo/repo.go
index cd6be48b90..bdf0de2f85 100644
--- a/models/repo/repo.go
+++ b/models/repo/repo.go
@@ -327,6 +327,11 @@ func (repo *Repository) HTMLURL() string {
return setting.AppURL + url.PathEscape(repo.OwnerName) + "/" + url.PathEscape(repo.Name)
}
+// SummaryCardURL returns the absolute URL to an image providing a summary of the repo
+func (repo *Repository) SummaryCardURL() string {
+ return fmt.Sprintf("%s/-/summary-card", repo.HTMLURL())
+}
+
// CommitLink make link to by commit full ID
// note: won't check whether it's an right id
func (repo *Repository) CommitLink(commitID string) (result string) {
diff --git a/models/repo_test.go b/models/repo_test.go
index 958725fe53..52f028bbb2 100644
--- a/models/repo_test.go
+++ b/models/repo_test.go
@@ -7,8 +7,10 @@ import (
"testing"
"code.gitea.io/gitea/models/db"
+ issues_model "code.gitea.io/gitea/models/issues"
"code.gitea.io/gitea/models/unittest"
+ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -22,3 +24,16 @@ func TestDoctorUserStarNum(t *testing.T) {
require.NoError(t, DoctorUserStarNum(db.DefaultContext))
}
+
+func Test_repoStatsCorrectIssueNumComments(t *testing.T) {
+ require.NoError(t, unittest.PrepareTestDatabase())
+
+ issue2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
+ assert.NotNil(t, issue2)
+ assert.EqualValues(t, 0, issue2.NumComments) // the fixture data is wrong, but we don't fix it here
+
+ require.NoError(t, repoStatsCorrectIssueNumComments(db.DefaultContext, 2))
+ // reload the issue
+ issue2 = unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
+ assert.EqualValues(t, 1, issue2.NumComments)
+}
diff --git a/models/unittest/testdb.go b/models/unittest/testdb.go
index 94a3253644..70110c4962 100644
--- a/models/unittest/testdb.go
+++ b/models/unittest/testdb.go
@@ -59,6 +59,13 @@ func InitSettings() {
_ = hash.Register("dummy", hash.NewDummyHasher)
setting.PasswordHashAlgo, _ = hash.SetDefaultPasswordHashAlgorithm("dummy")
+ setting.InitGiteaEnvVars()
+
+ // Avoid loading the git's system config.
+ // On macOS, system config sets the osxkeychain credential helper, which will cause tests to freeze with a dialog.
+ // But we do not set it in production at the moment, because it might be a "breaking" change,
+ // more details are in "modules/git.commonBaseEnvs".
+ _ = os.Setenv("GIT_CONFIG_NOSYSTEM", "true")
}
// TestOptions represents test options
diff --git a/models/user/redirect.go b/models/user/redirect.go
index 5a40d4df3b..0ea959e99d 100644
--- a/models/user/redirect.go
+++ b/models/user/redirect.go
@@ -6,10 +6,17 @@ package user
import (
"context"
"fmt"
+ "slices"
+ "strconv"
"strings"
+ "time"
"code.gitea.io/gitea/models/db"
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/timeutil"
"code.gitea.io/gitea/modules/util"
+
+ "xorm.io/builder"
)
// ErrUserRedirectNotExist represents a "UserRedirectNotExist" kind of error.
@@ -31,11 +38,25 @@ func (err ErrUserRedirectNotExist) Unwrap() error {
return util.ErrNotExist
}
+type ErrCooldownPeriod struct {
+ ExpireTime time.Time
+}
+
+func IsErrCooldownPeriod(err error) bool {
+ _, ok := err.(ErrCooldownPeriod)
+ return ok
+}
+
+func (err ErrCooldownPeriod) Error() string {
+ return fmt.Sprintf("cooldown period for claiming this username has not yet expired: the cooldown period ends at %s", err.ExpireTime)
+}
+
// Redirect represents that a user name should be redirected to another
type Redirect struct {
- ID int64 `xorm:"pk autoincr"`
- LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
- RedirectUserID int64 // userID to redirect to
+ ID int64 `xorm:"pk autoincr"`
+ LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
+ RedirectUserID int64 // userID to redirect to
+ CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL DEFAULT 0"`
}
// TableName provides the real table name
@@ -47,14 +68,24 @@ func init() {
db.RegisterModel(new(Redirect))
}
-// LookupUserRedirect look up userID if a user has a redirect name
-func LookupUserRedirect(ctx context.Context, userName string) (int64, error) {
+// GetUserRedirect returns the redirect for a given username, this is a
+// case-insenstive operation.
+func GetUserRedirect(ctx context.Context, userName string) (*Redirect, error) {
userName = strings.ToLower(userName)
redirect := &Redirect{LowerName: userName}
if has, err := db.GetEngine(ctx).Get(redirect); err != nil {
- return 0, err
+ return nil, err
} else if !has {
- return 0, ErrUserRedirectNotExist{Name: userName}
+ return nil, ErrUserRedirectNotExist{Name: userName}
+ }
+ return redirect, nil
+}
+
+// LookupUserRedirect look up userID if a user has a redirect name
+func LookupUserRedirect(ctx context.Context, userName string) (int64, error) {
+ redirect, err := GetUserRedirect(ctx, userName)
+ if err != nil {
+ return 0, err
}
return redirect.RedirectUserID, nil
}
@@ -78,6 +109,19 @@ func NewUserRedirect(ctx context.Context, ID int64, oldUserName, newUserName str
})
}
+// LimitUserRedirects deletes the oldest entries in user_redirect of the user,
+// such that the amount of user_redirects is at most `n` amount of entries.
+func LimitUserRedirects(ctx context.Context, userID, n int64) error {
+ // NOTE: It's not possible to combine these two queries into one due to a limitation of MySQL.
+ keepIDs := make([]int64, n)
+ if err := db.GetEngine(ctx).SQL("SELECT id FROM user_redirect WHERE redirect_user_id = ? ORDER BY created_unix DESC LIMIT "+strconv.FormatInt(n, 10), userID).Find(&keepIDs); err != nil {
+ return err
+ }
+
+ _, err := db.GetEngine(ctx).Exec(builder.Delete(builder.And(builder.Eq{"redirect_user_id": userID}, builder.NotIn("id", keepIDs))).From("user_redirect"))
+ return err
+}
+
// DeleteUserRedirect delete any redirect from the specified user name to
// anything else
func DeleteUserRedirect(ctx context.Context, userName string) error {
@@ -85,3 +129,46 @@ func DeleteUserRedirect(ctx context.Context, userName string) error {
_, err := db.GetEngine(ctx).Delete(&Redirect{LowerName: userName})
return err
}
+
+// CanClaimUsername returns if its possible to claim the given username,
+// it checks if the cooldown period for claiming an existing username is over.
+// If there's a cooldown period, the second argument returns the time when
+// that cooldown period is over.
+// In the scenario of renaming, the doerID can be specified to allow the original
+// user of the username to reclaim it within the cooldown period.
+func CanClaimUsername(ctx context.Context, username string, doerID int64) (bool, time.Time, error) {
+ // Only check for a cooldown period if UsernameCooldownPeriod is a positive number.
+ if setting.Service.UsernameCooldownPeriod <= 0 {
+ return true, time.Time{}, nil
+ }
+
+ userRedirect, err := GetUserRedirect(ctx, username)
+ if err != nil {
+ if IsErrUserRedirectNotExist(err) {
+ return true, time.Time{}, nil
+ }
+ return false, time.Time{}, err
+ }
+
+ // Allow reclaiming of user's own username.
+ if userRedirect.RedirectUserID == doerID {
+ return true, time.Time{}, nil
+ }
+
+ // We do not know if the redirect user id was for an organization, so
+ // unconditionally execute the following query to retrieve all users that
+ // are part of the "Owner" team. If the redirect user ID is not an organization
+ // the returned list would be empty.
+ ownerTeamUIDs := []int64{}
+ if err := db.GetEngine(ctx).SQL("SELECT uid FROM team_user INNER JOIN team ON team_user.`team_id` = team.`id` WHERE team.`org_id` = ? AND team.`name` = 'Owners'", userRedirect.RedirectUserID).Find(&ownerTeamUIDs); err != nil {
+ return false, time.Time{}, err
+ }
+
+ if slices.Contains(ownerTeamUIDs, doerID) {
+ return true, time.Time{}, nil
+ }
+
+ // Multiply the value of UsernameCooldownPeriod by the amount of seconds in a day.
+ expireTime := userRedirect.CreatedUnix.Add(86400 * setting.Service.UsernameCooldownPeriod).AsLocalTime()
+ return time.Until(expireTime) <= 0, expireTime, nil
+}
diff --git a/models/user/user.go b/models/user/user.go
index ec9b35964d..423a26c8d3 100644
--- a/models/user/user.go
+++ b/models/user/user.go
@@ -669,6 +669,18 @@ func createUser(ctx context.Context, u *User, createdByAdmin bool, overwriteDefa
return err
}
+ // Check if the new username can be claimed.
+ // Skip this check if done by an admin.
+ if !createdByAdmin {
+ if ok, expireTime, err := CanClaimUsername(ctx, u.Name, -1); err != nil {
+ return err
+ } else if !ok {
+ return ErrCooldownPeriod{
+ ExpireTime: expireTime,
+ }
+ }
+ }
+
// set system defaults
u.KeepEmailPrivate = setting.Service.DefaultKeepEmailPrivate
u.Visibility = setting.Service.DefaultUserVisibilityMode
diff --git a/models/user/user_test.go b/models/user/user_test.go
index 1c734fa926..df0c3856e9 100644
--- a/models/user/user_test.go
+++ b/models/user/user_test.go
@@ -393,6 +393,31 @@ func TestCreateUserWithoutCustomTimestamps(t *testing.T) {
assert.LessOrEqual(t, fetched.UpdatedUnix, timestampEnd)
}
+func TestCreateUserClaimingUsername(t *testing.T) {
+ require.NoError(t, unittest.PrepareTestDatabase())
+ defer test.MockVariableValue(&setting.Service.UsernameCooldownPeriod, 1)()
+
+ _, err := db.GetEngine(db.DefaultContext).NoAutoTime().Insert(&user_model.Redirect{RedirectUserID: 1, LowerName: "redirecting", CreatedUnix: timeutil.TimeStampNow()})
+ require.NoError(t, err)
+
+ user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
+
+ user.Name = "redirecting"
+ user.LowerName = strings.ToLower(user.Name)
+ user.ID = 0
+ user.Email = "unique@example.com"
+
+ t.Run("Normal creation", func(t *testing.T) {
+ err = user_model.CreateUser(db.DefaultContext, user)
+ assert.True(t, user_model.IsErrCooldownPeriod(err))
+ })
+
+ t.Run("Creation as admin", func(t *testing.T) {
+ err = user_model.AdminCreateUser(db.DefaultContext, user)
+ require.NoError(t, err)
+ })
+}
+
func TestGetUserIDsByNames(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
diff --git a/modules/activitypub/client.go b/modules/activitypub/client.go
index 064d8984c1..645a4b8c8d 100644
--- a/modules/activitypub/client.go
+++ b/modules/activitypub/client.go
@@ -22,7 +22,7 @@ import (
"code.gitea.io/gitea/modules/proxy"
"code.gitea.io/gitea/modules/setting"
- "github.com/go-fed/httpsig"
+ "github.com/42wim/httpsig"
)
const (
diff --git a/modules/card/card.go b/modules/card/card.go
index bb160d7ea3..370d241073 100644
--- a/modules/card/card.go
+++ b/modules/card/card.go
@@ -5,6 +5,7 @@ package card
import (
"bytes"
+ "fmt"
"image"
"image/color"
"io"
@@ -35,12 +36,19 @@ type Card struct {
Img *image.RGBA
Font *truetype.Font
Margin int
+ Width int
+ Height int
}
var fontCache = sync.OnceValues(func() (*truetype.Font, error) {
return truetype.Parse(goregular.TTF)
})
+// DefaultSize returns the default size for a card
+func DefaultSize() (int, int) {
+ return 1200, 600
+}
+
// NewCard creates a new card with the given dimensions in pixels
func NewCard(width, height int) (*Card, error) {
img := image.NewRGBA(image.Rect(0, 0, width, height))
@@ -55,6 +63,8 @@ func NewCard(width, height int) (*Card, error) {
Img: img,
Font: font,
Margin: 0,
+ Width: width,
+ Height: height,
}, nil
}
@@ -67,14 +77,14 @@ func (c *Card) Split(vertical bool, percentage int) (*Card, *Card) {
mid := (bounds.Dx() * percentage / 100) + bounds.Min.X
subleft := c.Img.SubImage(image.Rect(bounds.Min.X, bounds.Min.Y, mid, bounds.Max.Y)).(*image.RGBA)
subright := c.Img.SubImage(image.Rect(mid, bounds.Min.Y, bounds.Max.X, bounds.Max.Y)).(*image.RGBA)
- return &Card{Img: subleft, Font: c.Font},
- &Card{Img: subright, Font: c.Font}
+ return &Card{Img: subleft, Font: c.Font, Width: subleft.Bounds().Dx(), Height: subleft.Bounds().Dy()},
+ &Card{Img: subright, Font: c.Font, Width: subright.Bounds().Dx(), Height: subright.Bounds().Dy()}
}
mid := (bounds.Dy() * percentage / 100) + bounds.Min.Y
subtop := c.Img.SubImage(image.Rect(bounds.Min.X, bounds.Min.Y, bounds.Max.X, mid)).(*image.RGBA)
subbottom := c.Img.SubImage(image.Rect(bounds.Min.X, mid, bounds.Max.X, bounds.Max.Y)).(*image.RGBA)
- return &Card{Img: subtop, Font: c.Font},
- &Card{Img: subbottom, Font: c.Font}
+ return &Card{Img: subtop, Font: c.Font, Width: subtop.Bounds().Dx(), Height: subtop.Bounds().Dy()},
+ &Card{Img: subbottom, Font: c.Font, Width: subbottom.Bounds().Dx(), Height: subbottom.Bounds().Dy()}
}
// SetMargin sets the margins for the card
@@ -244,9 +254,14 @@ func (c *Card) fetchExternalImage(url string) (image.Image, bool) {
},
}
+ // Go expects a absolute URL, so we must change a relative to an absolute one
+ if !strings.Contains(url, "://") {
+ url = fmt.Sprintf("%s%s", setting.AppURL, strings.TrimPrefix(url, "/"))
+ }
+
resp, err := client.Get(url)
if err != nil {
- log.Warn("error when fetching external image from %s: %w", url, err)
+ log.Warn("error when fetching external image from %s: %v", url, err)
return nil, false
}
defer resp.Body.Close()
@@ -321,3 +336,8 @@ func (c *Card) DrawExternalImage(url string) {
}
c.DrawImage(image)
}
+
+// DrawRect draws a rect with the given color
+func (c *Card) DrawRect(startX, startY, endX, endY int, color color.Color) {
+ draw.Draw(c.Img, image.Rect(startX, startY, endX, endY), &image.Uniform{color}, image.Point{}, draw.Src)
+}
diff --git a/modules/charset/charset.go b/modules/charset/charset.go
index 1855446a98..fc42372b4d 100644
--- a/modules/charset/charset.go
+++ b/modules/charset/charset.go
@@ -134,7 +134,7 @@ func DetectEncoding(content []byte) (string, error) {
// First we check if the content represents valid utf8 content excepting a truncated character at the end.
// Now we could decode all the runes in turn but this is not necessarily the cheapest thing to do
- // instead we walk backwards from the end to trim off a the incomplete character
+ // instead we walk backwards from the end to trim off the incomplete character
toValidate := content
end := len(toValidate) - 1
diff --git a/modules/container/set.go b/modules/container/set.go
index 15779983fd..2d654d0aee 100644
--- a/modules/container/set.go
+++ b/modules/container/set.go
@@ -29,6 +29,15 @@ func (s Set[T]) AddMultiple(values ...T) {
}
}
+func (s Set[T]) IsSubset(subset []T) bool {
+ for _, v := range subset {
+ if !s.Contains(v) {
+ return false
+ }
+ }
+ return true
+}
+
// Contains determines whether a set contains the specified element.
// Returns true if the set contains the specified element; otherwise, false.
func (s Set[T]) Contains(value T) bool {
diff --git a/modules/container/set_test.go b/modules/container/set_test.go
index 1502236034..3cfbf7cc2c 100644
--- a/modules/container/set_test.go
+++ b/modules/container/set_test.go
@@ -33,4 +33,9 @@ func TestSet(t *testing.T) {
assert.False(t, s.Contains("key1"))
assert.True(t, s.Contains("key6"))
assert.True(t, s.Contains("key7"))
+
+ assert.True(t, s.IsSubset([]string{"key6", "key7"}))
+ assert.False(t, s.IsSubset([]string{"key1"}))
+
+ assert.True(t, s.IsSubset([]string{}))
}
diff --git a/modules/git/command.go b/modules/git/command.go
index a3d43aaec6..605816b7a2 100644
--- a/modules/git/command.go
+++ b/modules/git/command.go
@@ -13,6 +13,7 @@ import (
"os"
"os/exec"
"runtime"
+ "runtime/trace"
"strings"
"time"
@@ -317,12 +318,13 @@ func (c *Command) Run(opts *RunOpts) error {
var finished context.CancelFunc
if opts.UseContextTimeout {
- ctx, cancel, finished = process.GetManager().AddContext(c.parentContext, desc)
+ ctx, cancel, finished = process.GetManager().AddTypedContext(c.parentContext, desc, process.GitProcessType, true)
} else {
- ctx, cancel, finished = process.GetManager().AddContextTimeout(c.parentContext, timeout, desc)
+ ctx, cancel, finished = process.GetManager().AddTypedContextTimeout(c.parentContext, timeout, desc, process.GitProcessType, true)
}
defer finished()
+ trace.Log(ctx, "command", desc)
startTime := time.Now()
cmd := exec.CommandContext(ctx, c.prog, c.args...)
diff --git a/modules/git/remote.go b/modules/git/remote.go
index 3585313f6a..eea57dd8e0 100644
--- a/modules/git/remote.go
+++ b/modules/git/remote.go
@@ -5,6 +5,7 @@ package git
import (
"context"
+ "strings"
giturl "code.gitea.io/gitea/modules/git/url"
)
@@ -37,3 +38,12 @@ func GetRemoteURL(ctx context.Context, repoPath, remoteName string) (*giturl.Git
}
return giturl.Parse(addr)
}
+
+// IsRemoteNotExistError checks the prefix of the error message to see whether a remote does not exist.
+func IsRemoteNotExistError(err error) bool {
+ // see: https://github.com/go-gitea/gitea/issues/32889#issuecomment-2571848216
+ // Should not add space in the end, sometimes git will add a `:`
+ prefix1 := "exit status 128 - fatal: No such remote" // git < 2.30
+ prefix2 := "exit status 2 - error: No such remote" // git >= 2.30
+ return strings.HasPrefix(err.Error(), prefix1) || strings.HasPrefix(err.Error(), prefix2)
+}
diff --git a/modules/git/tree.go b/modules/git/tree.go
index 5b06cbf359..f6201f6cc9 100644
--- a/modules/git/tree.go
+++ b/modules/git/tree.go
@@ -176,3 +176,14 @@ func (repo *Repository) LsTree(ref string, filenames ...string) ([]string, error
return filelist, err
}
+
+// GetTreePathLatestCommitID returns the latest commit of a tree path
+func (repo *Repository) GetTreePathLatestCommit(refName, treePath string) (*Commit, error) {
+ stdout, _, err := NewCommand(repo.Ctx, "rev-list", "-1").
+ AddDynamicArguments(refName).AddDashesAndList(treePath).
+ RunStdString(&RunOpts{Dir: repo.Path})
+ if err != nil {
+ return nil, err
+ }
+ return repo.GetCommit(strings.TrimSpace(stdout))
+}
diff --git a/modules/git/tree_test.go b/modules/git/tree_test.go
index 6e5d7f4415..7e439628f2 100644
--- a/modules/git/tree_test.go
+++ b/modules/git/tree_test.go
@@ -26,3 +26,18 @@ func TestSubTree_Issue29101(t *testing.T) {
assert.True(t, IsErrNotExist(err))
}
}
+
+func Test_GetTreePathLatestCommit(t *testing.T) {
+ repo, err := openRepositoryWithDefaultContext(filepath.Join(testReposDir, "repo6_blame"))
+ require.NoError(t, err)
+ defer repo.Close()
+
+ commitID, err := repo.GetBranchCommitID("master")
+ require.NoError(t, err)
+ assert.EqualValues(t, "544d8f7a3b15927cddf2299b4b562d6ebd71b6a7", commitID)
+
+ commit, err := repo.GetTreePathLatestCommit("master", "blame.txt")
+ require.NoError(t, err)
+ assert.NotNil(t, commit)
+ assert.EqualValues(t, "45fb6cbc12f970b04eacd5cd4165edd11c8d7376", commit.ID.String())
+}
diff --git a/modules/log/event_writer_buffer.go b/modules/log/event_writer_buffer.go
new file mode 100644
index 0000000000..28857c2189
--- /dev/null
+++ b/modules/log/event_writer_buffer.go
@@ -0,0 +1,22 @@
+// Copyright 2025 The Forgejo Authors.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package log
+
+import (
+ "bytes"
+)
+
+type EventWriterBuffer struct {
+ *EventWriterBaseImpl
+ Buffer *bytes.Buffer
+}
+
+var _ EventWriter = (*EventWriterBuffer)(nil)
+
+func NewEventWriterBuffer(name string, mode WriterMode) *EventWriterBuffer {
+ w := &EventWriterBuffer{EventWriterBaseImpl: NewEventWriterBase(name, "buffer", mode)}
+ w.Buffer = new(bytes.Buffer)
+ w.OutputWriteCloser = nopCloser{w.Buffer}
+ return w
+}
diff --git a/modules/log/event_writer_buffer_test.go b/modules/log/event_writer_buffer_test.go
new file mode 100644
index 0000000000..5c0343b8a8
--- /dev/null
+++ b/modules/log/event_writer_buffer_test.go
@@ -0,0 +1,34 @@
+// Copyright 2025 The Forgejo Authors.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package log_test
+
+import (
+ "context"
+ "testing"
+
+ "code.gitea.io/gitea/modules/log"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestBufferLogger(t *testing.T) {
+ prefix := "TestPrefix "
+ level := log.INFO
+ expected := "something"
+
+ bufferWriter := log.NewEventWriterBuffer("test-buffer", log.WriterMode{
+ Level: level,
+ Prefix: prefix,
+ Expression: expected,
+ })
+
+ logger := log.NewLoggerWithWriters(context.Background(), "test", bufferWriter)
+
+ logger.SendLogEvent(&log.Event{
+ Level: log.INFO,
+ MsgSimpleText: expected,
+ })
+ logger.Close()
+ assert.Contains(t, bufferWriter.Buffer.String(), expected)
+}
diff --git a/modules/markup/orgmode/orgmode_test.go b/modules/markup/orgmode/orgmode_test.go
index f41d86a8a8..58fede7eb8 100644
--- a/modules/markup/orgmode/orgmode_test.go
+++ b/modules/markup/orgmode/orgmode_test.go
@@ -152,8 +152,8 @@ func HelloWorld() {
}
#+end_src
`, `
-
// HelloWorld prints "Hello World"
- func HelloWorld () {
+// HelloWorld prints "Hello World"
+func HelloWorld () {
fmt . Println ( "Hello World" )
}
`)
diff --git a/modules/migration/repo.go b/modules/migration/repo.go
index 22c2cf6fb3..a85d38084d 100644
--- a/modules/migration/repo.go
+++ b/modules/migration/repo.go
@@ -14,4 +14,5 @@ type Repository struct {
CloneURL string `yaml:"clone_url"` // SECURITY: This must be checked to ensure that is safe to be used
OriginalURL string `yaml:"original_url"`
DefaultBranch string
+ Website string
}
diff --git a/modules/packages/arch/metadata.go b/modules/packages/arch/metadata.go
index 6a044002a8..0a51472d9c 100644
--- a/modules/packages/arch/metadata.go
+++ b/modules/packages/arch/metadata.go
@@ -94,7 +94,7 @@ type FileMetadata struct {
// ParsePackage Function that receives arch package archive data and returns it's metadata.
func ParsePackage(r *packages.HashedBuffer) (*Package, error) {
- md5, _, sha256, _ := r.Sums()
+ md5, _, sha256, _, _ := r.Sums()
_, err := r.Seek(0, io.SeekStart)
if err != nil {
return nil, err
diff --git a/modules/packages/hashed_buffer.go b/modules/packages/hashed_buffer.go
index 4ab45edcec..70a086da30 100644
--- a/modules/packages/hashed_buffer.go
+++ b/modules/packages/hashed_buffer.go
@@ -75,7 +75,7 @@ func (b *HashedBuffer) Write(p []byte) (int, error) {
return b.combinedWriter.Write(p)
}
-// Sums gets the MD5, SHA1, SHA256 and SHA512 checksums of the data
-func (b *HashedBuffer) Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512 []byte) {
+// Sums gets the MD5, SHA1, SHA256, SHA512 and BLAKE2B checksums of the data
+func (b *HashedBuffer) Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b []byte) {
return b.hash.Sums()
}
diff --git a/modules/packages/hashed_buffer_test.go b/modules/packages/hashed_buffer_test.go
index ed5267cd6f..879038988f 100644
--- a/modules/packages/hashed_buffer_test.go
+++ b/modules/packages/hashed_buffer_test.go
@@ -21,9 +21,10 @@ func TestHashedBuffer(t *testing.T) {
HashSHA1 string
HashSHA256 string
HashSHA512 string
+ hashBlake2b string
}{
- {5, "test", "098f6bcd4621d373cade4e832627b4f6", "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff"},
- {5, "testtest", "05a671c66aefea124cc08b76ea6d30bb", "51abb9636078defbf888d8457a7c76f85c8f114c", "37268335dd6931045bdcdf92623ff819a64244b53d0e746d438797349d4da578", "125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc"},
+ {5, "test", "098f6bcd4621d373cade4e832627b4f6", "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff", "a71079d42853dea26e453004338670a53814b78137ffbed07603a41d76a483aa9bc33b582f77d30a65e6f29a896c0411f38312e1d66e0bf16386c86a89bea572"},
+ {5, "testtest", "05a671c66aefea124cc08b76ea6d30bb", "51abb9636078defbf888d8457a7c76f85c8f114c", "37268335dd6931045bdcdf92623ff819a64244b53d0e746d438797349d4da578", "125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc", "372a53b95f46e775b973031e40b844f24389657019f7b7540a9f0496f4ead4a2e4b050909664611fb0f4b7c7e92c3c04c84787be7f6b8edf7bf6bc31856b6c76"},
}
for _, c := range cases {
@@ -36,11 +37,12 @@ func TestHashedBuffer(t *testing.T) {
require.NoError(t, err)
assert.Equal(t, c.Data, string(data))
- hashMD5, hashSHA1, hashSHA256, hashSHA512 := buf.Sums()
+ hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b := buf.Sums()
assert.Equal(t, c.HashMD5, hex.EncodeToString(hashMD5))
assert.Equal(t, c.HashSHA1, hex.EncodeToString(hashSHA1))
assert.Equal(t, c.HashSHA256, hex.EncodeToString(hashSHA256))
assert.Equal(t, c.HashSHA512, hex.EncodeToString(hashSHA512))
+ assert.Equal(t, c.hashBlake2b, hex.EncodeToString(hashBlake2b))
require.NoError(t, buf.Close())
}
diff --git a/modules/packages/multi_hasher.go b/modules/packages/multi_hasher.go
index 83a4b5b7af..d2d9a759a8 100644
--- a/modules/packages/multi_hasher.go
+++ b/modules/packages/multi_hasher.go
@@ -12,28 +12,32 @@ import (
"errors"
"hash"
"io"
+
+ "golang.org/x/crypto/blake2b"
)
const (
- marshaledSizeMD5 = 92
- marshaledSizeSHA1 = 96
- marshaledSizeSHA256 = 108
- marshaledSizeSHA512 = 204
+ marshaledSizeMD5 = 92
+ marshaledSizeSHA1 = 96
+ marshaledSizeSHA256 = 108
+ marshaledSizeSHA512 = 204
+ marshaledSizeBlake2b = 213
- marshaledSize = marshaledSizeMD5 + marshaledSizeSHA1 + marshaledSizeSHA256 + marshaledSizeSHA512
+ marshaledSize = marshaledSizeMD5 + marshaledSizeSHA1 + marshaledSizeSHA256 + marshaledSizeSHA512 + marshaledSizeBlake2b
)
// HashSummer provide a Sums method
type HashSummer interface {
- Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512 []byte)
+ Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b []byte)
}
// MultiHasher calculates multiple checksums
type MultiHasher struct {
- md5 hash.Hash
- sha1 hash.Hash
- sha256 hash.Hash
- sha512 hash.Hash
+ md5 hash.Hash
+ sha1 hash.Hash
+ sha256 hash.Hash
+ sha512 hash.Hash
+ blake2b hash.Hash
combinedWriter io.Writer
}
@@ -44,14 +48,16 @@ func NewMultiHasher() *MultiHasher {
sha1 := sha1.New()
sha256 := sha256.New()
sha512 := sha512.New()
+ blake2b, _ := blake2b.New512(nil)
- combinedWriter := io.MultiWriter(md5, sha1, sha256, sha512)
+ combinedWriter := io.MultiWriter(md5, sha1, sha256, sha512, blake2b)
return &MultiHasher{
md5,
sha1,
sha256,
sha512,
+ blake2b,
combinedWriter,
}
}
@@ -74,12 +80,17 @@ func (h *MultiHasher) MarshalBinary() ([]byte, error) {
if err != nil {
return nil, err
}
+ blake2bBytes, err := h.blake2b.(encoding.BinaryMarshaler).MarshalBinary()
+ if err != nil {
+ return nil, err
+ }
b := make([]byte, 0, marshaledSize)
b = append(b, md5Bytes...)
b = append(b, sha1Bytes...)
b = append(b, sha256Bytes...)
b = append(b, sha512Bytes...)
+ b = append(b, blake2bBytes...)
return b, nil
}
@@ -104,7 +115,12 @@ func (h *MultiHasher) UnmarshalBinary(b []byte) error {
}
b = b[marshaledSizeSHA256:]
- return h.sha512.(encoding.BinaryUnmarshaler).UnmarshalBinary(b[:marshaledSizeSHA512])
+ if err := h.sha512.(encoding.BinaryUnmarshaler).UnmarshalBinary(b[:marshaledSizeSHA512]); err != nil {
+ return err
+ }
+
+ b = b[marshaledSizeSHA512:]
+ return h.blake2b.(encoding.BinaryUnmarshaler).UnmarshalBinary(b[:marshaledSizeBlake2b])
}
// Write implements io.Writer
@@ -113,10 +129,11 @@ func (h *MultiHasher) Write(p []byte) (int, error) {
}
// Sums gets the MD5, SHA1, SHA256 and SHA512 checksums of the data
-func (h *MultiHasher) Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512 []byte) {
+func (h *MultiHasher) Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b []byte) {
hashMD5 = h.md5.Sum(nil)
hashSHA1 = h.sha1.Sum(nil)
hashSHA256 = h.sha256.Sum(nil)
hashSHA512 = h.sha512.Sum(nil)
- return hashMD5, hashSHA1, hashSHA256, hashSHA512
+ hashBlake2b = h.blake2b.Sum(nil)
+ return hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b
}
diff --git a/modules/packages/multi_hasher_test.go b/modules/packages/multi_hasher_test.go
index ca333cb0a4..e5a32fc02c 100644
--- a/modules/packages/multi_hasher_test.go
+++ b/modules/packages/multi_hasher_test.go
@@ -12,10 +12,11 @@ import (
)
const (
- expectedMD5 = "e3bef03c5f3b7f6b3ab3e3053ed71e9c"
- expectedSHA1 = "060b3b99f88e96085b4a68e095bc9e3d1d91e1bc"
- expectedSHA256 = "6ccce4863b70f258d691f59609d31b4502e1ba5199942d3bc5d35d17a4ce771d"
- expectedSHA512 = "7f70e439ba8c52025c1f06cdf6ae443c4b8ed2e90059cdb9bbbf8adf80846f185a24acca9245b128b226d61753b0d7ed46580a69c8999eeff3bc13a4d0bd816c"
+ expectedMD5 = "e3bef03c5f3b7f6b3ab3e3053ed71e9c"
+ expectedSHA1 = "060b3b99f88e96085b4a68e095bc9e3d1d91e1bc"
+ expectedSHA256 = "6ccce4863b70f258d691f59609d31b4502e1ba5199942d3bc5d35d17a4ce771d"
+ expectedSHA512 = "7f70e439ba8c52025c1f06cdf6ae443c4b8ed2e90059cdb9bbbf8adf80846f185a24acca9245b128b226d61753b0d7ed46580a69c8999eeff3bc13a4d0bd816c"
+ expectedBlake2b = "b3c3ad15c7e6cca543d651add9427727ffb525120eb23264ee35f16f408a369b599d4404a52d29f642fc0d869f9b55581b60e4e8b9b74997182705d3dcb01edb"
)
func TestMultiHasherSums(t *testing.T) {
@@ -23,12 +24,13 @@ func TestMultiHasherSums(t *testing.T) {
h := NewMultiHasher()
h.Write([]byte("gitea"))
- hashMD5, hashSHA1, hashSHA256, hashSHA512 := h.Sums()
+ hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b := h.Sums()
assert.Equal(t, expectedMD5, hex.EncodeToString(hashMD5))
assert.Equal(t, expectedSHA1, hex.EncodeToString(hashSHA1))
assert.Equal(t, expectedSHA256, hex.EncodeToString(hashSHA256))
assert.Equal(t, expectedSHA512, hex.EncodeToString(hashSHA512))
+ assert.Equal(t, expectedBlake2b, hex.EncodeToString(hashBlake2b))
})
t.Run("State", func(t *testing.T) {
@@ -44,11 +46,12 @@ func TestMultiHasherSums(t *testing.T) {
h2.Write([]byte("ea"))
- hashMD5, hashSHA1, hashSHA256, hashSHA512 := h2.Sums()
+ hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b := h2.Sums()
assert.Equal(t, expectedMD5, hex.EncodeToString(hashMD5))
assert.Equal(t, expectedSHA1, hex.EncodeToString(hashSHA1))
assert.Equal(t, expectedSHA256, hex.EncodeToString(hashSHA256))
assert.Equal(t, expectedSHA512, hex.EncodeToString(hashSHA512))
+ assert.Equal(t, expectedBlake2b, hex.EncodeToString(hashBlake2b))
})
}
diff --git a/modules/packages/rpm/metadata.go b/modules/packages/rpm/metadata.go
index f4f78c2cab..02003aba3d 100644
--- a/modules/packages/rpm/metadata.go
+++ b/modules/packages/rpm/metadata.go
@@ -78,11 +78,12 @@ type FileMetadata struct {
}
type Entry struct {
- Name string `json:"name" xml:"name,attr"`
- Flags string `json:"flags,omitempty" xml:"flags,attr,omitempty"`
- Version string `json:"version,omitempty" xml:"ver,attr,omitempty"`
- Epoch string `json:"epoch,omitempty" xml:"epoch,attr,omitempty"`
- Release string `json:"release,omitempty" xml:"rel,attr,omitempty"`
+ Name string `json:"name" xml:"name,attr"`
+ Flags string `json:"flags,omitempty" xml:"flags,attr,omitempty"`
+ AltFlags uint32 `json:"alt_flags,omitempty" xml:"alt_flags,attr,omitempty"`
+ Version string `json:"version,omitempty" xml:"ver,attr,omitempty"`
+ Epoch string `json:"epoch,omitempty" xml:"epoch,attr,omitempty"`
+ Release string `json:"release,omitempty" xml:"rel,attr,omitempty"`
}
type File struct {
@@ -98,7 +99,7 @@ type Changelog struct {
}
// ParsePackage parses the RPM package file
-func ParsePackage(r io.Reader) (*Package, error) {
+func ParsePackage(r io.Reader, repoType string) (*Package, error) {
rpm, err := rpmutils.ReadRpm(r)
if err != nil {
return nil, err
@@ -138,10 +139,10 @@ func ParsePackage(r io.Reader) (*Package, error) {
InstalledSize: getUInt64(rpm.Header, rpmutils.SIZE),
ArchiveSize: getUInt64(rpm.Header, rpmutils.SIG_PAYLOADSIZE),
- Provides: getEntries(rpm.Header, rpmutils.PROVIDENAME, rpmutils.PROVIDEVERSION, rpmutils.PROVIDEFLAGS),
- Requires: getEntries(rpm.Header, rpmutils.REQUIRENAME, rpmutils.REQUIREVERSION, rpmutils.REQUIREFLAGS),
- Conflicts: getEntries(rpm.Header, rpmutils.CONFLICTNAME, rpmutils.CONFLICTVERSION, rpmutils.CONFLICTFLAGS),
- Obsoletes: getEntries(rpm.Header, rpmutils.OBSOLETENAME, rpmutils.OBSOLETEVERSION, rpmutils.OBSOLETEFLAGS),
+ Provides: getEntries(rpm.Header, rpmutils.PROVIDENAME, rpmutils.PROVIDEVERSION, rpmutils.PROVIDEFLAGS, repoType),
+ Requires: getEntries(rpm.Header, rpmutils.REQUIRENAME, rpmutils.REQUIREVERSION, rpmutils.REQUIREFLAGS, repoType),
+ Conflicts: getEntries(rpm.Header, rpmutils.CONFLICTNAME, rpmutils.CONFLICTVERSION, rpmutils.CONFLICTFLAGS, repoType),
+ Obsoletes: getEntries(rpm.Header, rpmutils.OBSOLETENAME, rpmutils.OBSOLETEVERSION, rpmutils.OBSOLETEFLAGS, repoType),
Files: getFiles(rpm.Header),
Changelogs: getChangelogs(rpm.Header),
},
@@ -170,7 +171,7 @@ func getUInt64(h *rpmutils.RpmHeader, tag int) uint64 {
return values[0]
}
-func getEntries(h *rpmutils.RpmHeader, namesTag, versionsTag, flagsTag int) []*Entry {
+func getEntries(h *rpmutils.RpmHeader, namesTag, versionsTag, flagsTag int, repoType string) []*Entry {
names, err := h.GetStrings(namesTag)
if err != nil || len(names) == 0 {
return nil
@@ -188,43 +189,54 @@ func getEntries(h *rpmutils.RpmHeader, namesTag, versionsTag, flagsTag int) []*E
}
entries := make([]*Entry, 0, len(names))
- for i := range names {
- e := &Entry{
- Name: names[i],
- }
- flags := flags[i]
- if (flags&rpmutils.RPMSENSE_GREATER) != 0 && (flags&rpmutils.RPMSENSE_EQUAL) != 0 {
- e.Flags = "GE"
- } else if (flags&rpmutils.RPMSENSE_LESS) != 0 && (flags&rpmutils.RPMSENSE_EQUAL) != 0 {
- e.Flags = "LE"
- } else if (flags & rpmutils.RPMSENSE_GREATER) != 0 {
- e.Flags = "GT"
- } else if (flags & rpmutils.RPMSENSE_LESS) != 0 {
- e.Flags = "LT"
- } else if (flags & rpmutils.RPMSENSE_EQUAL) != 0 {
- e.Flags = "EQ"
- }
-
- version := versions[i]
- if version != "" {
- parts := strings.Split(version, "-")
-
- versionParts := strings.Split(parts[0], ":")
- if len(versionParts) == 2 {
- e.Version = versionParts[1]
- e.Epoch = versionParts[0]
- } else {
- e.Version = versionParts[0]
- e.Epoch = "0"
+ switch repoType {
+ case "rpm":
+ for i := range names {
+ e := &Entry{
+ Name: names[i],
}
- if len(parts) > 1 {
- e.Release = parts[1]
+ flags := flags[i]
+ if (flags&rpmutils.RPMSENSE_GREATER) != 0 && (flags&rpmutils.RPMSENSE_EQUAL) != 0 {
+ e.Flags = "GE"
+ } else if (flags&rpmutils.RPMSENSE_LESS) != 0 && (flags&rpmutils.RPMSENSE_EQUAL) != 0 {
+ e.Flags = "LE"
+ } else if (flags & rpmutils.RPMSENSE_GREATER) != 0 {
+ e.Flags = "GT"
+ } else if (flags & rpmutils.RPMSENSE_LESS) != 0 {
+ e.Flags = "LT"
+ } else if (flags & rpmutils.RPMSENSE_EQUAL) != 0 {
+ e.Flags = "EQ"
}
- }
- entries = append(entries, e)
+ version := versions[i]
+ if version != "" {
+ parts := strings.Split(version, "-")
+
+ versionParts := strings.Split(parts[0], ":")
+ if len(versionParts) == 2 {
+ e.Version = versionParts[1]
+ e.Epoch = versionParts[0]
+ } else {
+ e.Version = versionParts[0]
+ e.Epoch = "0"
+ }
+
+ if len(parts) > 1 {
+ e.Release = parts[1]
+ }
+ }
+ entries = append(entries, e)
+ }
+ case "alt":
+ for i := range names {
+ e := &Entry{
+ AltFlags: uint32(flags[i]),
+ }
+ e.Version = versions[i]
+ entries = append(entries, e)
+ }
}
return entries
}
diff --git a/modules/packages/rpm/metadata_test.go b/modules/packages/rpm/metadata_test.go
index dc9b480723..05f53ea446 100644
--- a/modules/packages/rpm/metadata_test.go
+++ b/modules/packages/rpm/metadata_test.go
@@ -48,7 +48,7 @@ Mu0UFYgZ/bYnuvn/vz4wtCz8qMwsHUvP0PX3tbYFUctAPdrY6tiiDtcCddDECahx7SuVNP5dpmb5
zr, err := gzip.NewReader(bytes.NewReader(rpmPackageContent))
require.NoError(t, err)
- p, err := ParsePackage(zr)
+ p, err := ParsePackage(zr, "rpm")
assert.NotNil(t, p)
require.NoError(t, err)
diff --git a/modules/process/manager.go b/modules/process/manager.go
index 37098ad92f..062ee1482f 100644
--- a/modules/process/manager.go
+++ b/modules/process/manager.go
@@ -7,6 +7,7 @@ package process
import (
"context"
"runtime/pprof"
+ "runtime/trace"
"strconv"
"sync"
"sync/atomic"
@@ -126,6 +127,27 @@ func (pm *Manager) AddTypedContext(parent context.Context, description, processT
return ctx, cancel, finished
}
+// AddTypedContextTimeout creates a new context and adds it as a process. Once the process is finished, finished must be called
+// to remove the process from the process table. It should not be called until the process is finished but must always be called.
+//
+// cancel should be used to cancel the returned context, however it will not remove the process from the process table.
+// finished will cancel the returned context and remove it from the process table.
+//
+// Most processes will not need to use the cancel function but there will be cases whereby you want to cancel the process but not immediately remove it from the
+// process table.
+func (pm *Manager) AddTypedContextTimeout(parent context.Context, timeout time.Duration, description, processType string, currentlyRunning bool) (ctx context.Context, cancel context.CancelFunc, finished FinishedFunc) {
+ if timeout <= 0 {
+ // it's meaningless to use timeout <= 0, and it must be a bug! so we must panic here to tell developers to make the timeout correct
+ panic("the timeout must be greater than zero, otherwise the context will be cancelled immediately")
+ }
+
+ ctx, cancel = context.WithTimeout(parent, timeout)
+
+ ctx, _, finished = pm.Add(ctx, description, cancel, processType, currentlyRunning)
+
+ return ctx, cancel, finished
+}
+
// AddContextTimeout creates a new context and add it as a process. Once the process is finished, finished must be called
// to remove the process from the process table. It should not be called until the process is finished but must always be called.
//
@@ -135,16 +157,7 @@ func (pm *Manager) AddTypedContext(parent context.Context, description, processT
// Most processes will not need to use the cancel function but there will be cases whereby you want to cancel the process but not immediately remove it from the
// process table.
func (pm *Manager) AddContextTimeout(parent context.Context, timeout time.Duration, description string) (ctx context.Context, cancel context.CancelFunc, finished FinishedFunc) {
- if timeout <= 0 {
- // it's meaningless to use timeout <= 0, and it must be a bug! so we must panic here to tell developers to make the timeout correct
- panic("the timeout must be greater than zero, otherwise the context will be cancelled immediately")
- }
-
- ctx, cancel = context.WithTimeout(parent, timeout)
-
- ctx, _, finished = pm.Add(ctx, description, cancel, NormalProcessType, true)
-
- return ctx, cancel, finished
+ return pm.AddTypedContextTimeout(parent, timeout, description, NormalProcessType, true)
}
// Add create a new process
@@ -159,6 +172,8 @@ func (pm *Manager) Add(ctx context.Context, description string, cancel context.C
parentPID = ""
}
+ ctx, traceTask := trace.NewTask(ctx, processType)
+
process := &process{
PID: pid,
ParentPID: parentPID,
@@ -166,6 +181,7 @@ func (pm *Manager) Add(ctx context.Context, description string, cancel context.C
Start: start,
Cancel: cancel,
Type: processType,
+ TraceTrask: traceTask,
}
var finished FinishedFunc
@@ -218,6 +234,7 @@ func (pm *Manager) nextPID() (start time.Time, pid IDType) {
}
func (pm *Manager) remove(process *process) {
+ process.TraceTrask.End()
deleted := false
pm.mutex.Lock()
diff --git a/modules/process/manager_stacktraces.go b/modules/process/manager_stacktraces.go
index e260893113..a603e6a9f2 100644
--- a/modules/process/manager_stacktraces.go
+++ b/modules/process/manager_stacktraces.go
@@ -4,8 +4,8 @@
package process
import (
+ "bytes"
"fmt"
- "io"
"runtime/pprof"
"sort"
"time"
@@ -175,13 +175,12 @@ func (pm *Manager) ProcessStacktraces(flat, noSystem bool) ([]*Process, int, int
// Now from within the lock we need to get the goroutines.
// Why? If we release the lock then between between filling the above map and getting
// the stacktraces another process could be created which would then look like a dead process below
- reader, writer := io.Pipe()
- defer reader.Close()
- go func() {
- err := pprof.Lookup("goroutine").WriteTo(writer, 0)
- _ = writer.CloseWithError(err)
- }()
- stacks, err = profile.Parse(reader)
+ var buf bytes.Buffer
+ if err := pprof.Lookup("goroutine").WriteTo(&buf, 0); err != nil {
+ return nil, 0, 0, err
+ }
+
+ stacks, err = profile.ParseData(buf.Bytes())
if err != nil {
return nil, 0, 0, err
}
diff --git a/modules/process/manager_stacktraces_test.go b/modules/process/manager_stacktraces_test.go
new file mode 100644
index 0000000000..d00fbc5ec8
--- /dev/null
+++ b/modules/process/manager_stacktraces_test.go
@@ -0,0 +1,93 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package process
+
+import (
+ "context"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestProcessStacktraces(t *testing.T) {
+ _, _, finish := GetManager().AddContext(context.Background(), "Normal process")
+ defer finish()
+ parentCtx, _, finish := GetManager().AddContext(context.Background(), "Children normal process")
+ defer finish()
+ _, _, finish = GetManager().AddContext(parentCtx, "Children process")
+ defer finish()
+ _, _, finish = GetManager().AddTypedContext(context.Background(), "System process", SystemProcessType, true)
+ defer finish()
+
+ t.Run("No flat with no system process", func(t *testing.T) {
+ processes, processCount, _, err := GetManager().ProcessStacktraces(false, true)
+ require.NoError(t, err)
+ assert.EqualValues(t, 4, processCount)
+ assert.Len(t, processes, 2)
+
+ assert.EqualValues(t, "Children normal process", processes[0].Description)
+ assert.EqualValues(t, NormalProcessType, processes[0].Type)
+ assert.Empty(t, processes[0].ParentPID)
+ assert.Len(t, processes[0].Children, 1)
+
+ assert.EqualValues(t, "Children process", processes[0].Children[0].Description)
+ assert.EqualValues(t, processes[0].PID, processes[0].Children[0].ParentPID)
+
+ assert.EqualValues(t, "Normal process", processes[1].Description)
+ assert.EqualValues(t, NormalProcessType, processes[1].Type)
+ assert.Empty(t, processes[1].ParentPID)
+ assert.Empty(t, processes[1].Children)
+ })
+
+ t.Run("Flat with no system process", func(t *testing.T) {
+ processes, processCount, _, err := GetManager().ProcessStacktraces(true, true)
+ require.NoError(t, err)
+ assert.EqualValues(t, 4, processCount)
+ assert.Len(t, processes, 3)
+
+ assert.EqualValues(t, "Children process", processes[0].Description)
+ assert.EqualValues(t, NormalProcessType, processes[0].Type)
+ assert.EqualValues(t, processes[1].PID, processes[0].ParentPID)
+ assert.Empty(t, processes[0].Children)
+
+ assert.EqualValues(t, "Children normal process", processes[1].Description)
+ assert.EqualValues(t, NormalProcessType, processes[1].Type)
+ assert.Empty(t, processes[1].ParentPID)
+ assert.Empty(t, processes[1].Children)
+
+ assert.EqualValues(t, "Normal process", processes[2].Description)
+ assert.EqualValues(t, NormalProcessType, processes[2].Type)
+ assert.Empty(t, processes[2].ParentPID)
+ assert.Empty(t, processes[2].Children)
+ })
+
+ t.Run("System process", func(t *testing.T) {
+ processes, processCount, _, err := GetManager().ProcessStacktraces(false, false)
+ require.NoError(t, err)
+ assert.EqualValues(t, 4, processCount)
+ assert.Len(t, processes, 4)
+
+ assert.EqualValues(t, "System process", processes[0].Description)
+ assert.EqualValues(t, SystemProcessType, processes[0].Type)
+ assert.Empty(t, processes[0].ParentPID)
+ assert.Empty(t, processes[0].Children)
+
+ assert.EqualValues(t, "Children normal process", processes[1].Description)
+ assert.EqualValues(t, NormalProcessType, processes[1].Type)
+ assert.Empty(t, processes[1].ParentPID)
+ assert.Len(t, processes[1].Children, 1)
+
+ assert.EqualValues(t, "Normal process", processes[2].Description)
+ assert.EqualValues(t, NormalProcessType, processes[2].Type)
+ assert.Empty(t, processes[2].ParentPID)
+ assert.Empty(t, processes[2].Children)
+
+ // This is the "main" pid, testing code always runs in a goroutine.
+ assert.EqualValues(t, "(unassociated)", processes[3].Description)
+ assert.EqualValues(t, NoneProcessType, processes[3].Type)
+ assert.Empty(t, processes[3].ParentPID)
+ assert.Empty(t, processes[3].Children)
+ })
+}
diff --git a/modules/process/process.go b/modules/process/process.go
index 06a28c4a60..8947eb252f 100644
--- a/modules/process/process.go
+++ b/modules/process/process.go
@@ -5,12 +5,14 @@ package process
import (
"context"
+ "runtime/trace"
"time"
)
var (
SystemProcessType = "system"
RequestProcessType = "request"
+ GitProcessType = "git"
NormalProcessType = "normal"
NoneProcessType = "none"
)
@@ -23,6 +25,7 @@ type process struct {
Start time.Time
Cancel context.CancelFunc
Type string
+ TraceTrask *trace.Task
}
// ToProcess converts a process to a externally usable Process
diff --git a/modules/references/references.go b/modules/references/references.go
index c61d06d5dc..3b4bcb3706 100644
--- a/modules/references/references.go
+++ b/modules/references/references.go
@@ -32,7 +32,7 @@ var (
// issueNumericPattern matches string that references to a numeric issue, e.g. #1287
issueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\'|\")([#!][0-9]+)(?:\s|$|\)|\]|\'|\"|[:;,.?!]\s|[:;,.?!]$)`)
// issueAlphanumericPattern matches string that references to an alphanumeric issue, e.g. ABC-1234
- issueAlphanumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\"|\')([A-Z]{1,10}-[1-9][0-9]*)(?:\s|$|\)|\]|:|\.(\s|$)|\"|\')`)
+ issueAlphanumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\"|\')([A-Z]{1,10}-[1-9][0-9]*)(?:\s|$|\)|\]|:|\.(\s|$)|\"|\'|,)`)
// crossReferenceIssueNumericPattern matches string that references a numeric issue in a different repository
// e.g. org/repo#12345
crossReferenceIssueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([0-9a-zA-Z-_\.]+/[0-9a-zA-Z-_\.]+[#!][0-9]+)(?:\s|$|\)|\]|[:;,.?!]\s|[:;,.?!]$)`)
diff --git a/modules/references/references_test.go b/modules/references/references_test.go
index ffa7f993e3..d5f7c4b4c5 100644
--- a/modules/references/references_test.go
+++ b/modules/references/references_test.go
@@ -466,6 +466,7 @@ func TestRegExp_issueAlphanumericPattern(t *testing.T) {
"ABC-123:",
"\"ABC-123\"",
"'ABC-123'",
+ "ABC-123, unknown PR",
}
falseTestCases := []string{
"RC-08",
diff --git a/modules/secret/secret.go b/modules/secret/secret.go
index e70ae1839c..e3557b91b9 100644
--- a/modules/secret/secret.go
+++ b/modules/secret/secret.go
@@ -47,7 +47,7 @@ func AesDecrypt(key, text []byte) ([]byte, error) {
cfb.XORKeyStream(text, text)
data, err := base64.StdEncoding.DecodeString(string(text))
if err != nil {
- return nil, fmt.Errorf("AesDecrypt invalid decrypted base64 string: %w", err)
+ return nil, fmt.Errorf("AesDecrypt invalid decrypted base64 string: %w - it can be caused by a change of the [security].SECRET_KEY setting or a database corruption - `forgejo doctor check --run check-db-consistency --fix` will get rid of orphaned rows found in the `two_factor` table and may fix this problem if they are the one with the invalid content", err)
}
return data, nil
}
diff --git a/modules/setting/config_env.go b/modules/setting/config_env.go
index fa0100dba2..2bc1a5c341 100644
--- a/modules/setting/config_env.go
+++ b/modules/setting/config_env.go
@@ -168,3 +168,22 @@ func EnvironmentToConfig(cfg ConfigProvider, envs []string) (changed bool) {
}
return changed
}
+
+// InitGiteaEnvVars initializes the environment variables for gitea
+func InitGiteaEnvVars() {
+ // Ideally Gitea should only accept the environment variables which it clearly knows instead of unsetting the ones it doesn't want,
+ // but the ideal behavior would be a breaking change, and it seems not bringing enough benefits to end users,
+ // so at the moment we could still keep "unsetting the unnecessary environments"
+
+ // HOME is managed by Gitea, Gitea's git should use "HOME/.gitconfig".
+ // But git would try "XDG_CONFIG_HOME/git/config" first if "HOME/.gitconfig" does not exist,
+ // then our git.InitFull would still write to "XDG_CONFIG_HOME/git/config" if XDG_CONFIG_HOME is set.
+ _ = os.Unsetenv("XDG_CONFIG_HOME")
+
+ _ = os.Unsetenv("GIT_AUTHOR_NAME")
+ _ = os.Unsetenv("GIT_AUTHOR_EMAIL")
+ _ = os.Unsetenv("GIT_AUTHOR_DATE")
+ _ = os.Unsetenv("GIT_COMMITTER_NAME")
+ _ = os.Unsetenv("GIT_COMMITTER_EMAIL")
+ _ = os.Unsetenv("GIT_COMMITTER_DATE")
+}
diff --git a/modules/setting/cors.go b/modules/setting/cors.go
index 63daaad60b..5260887d9d 100644
--- a/modules/setting/cors.go
+++ b/modules/setting/cors.go
@@ -5,8 +5,6 @@ package setting
import (
"time"
-
- "code.gitea.io/gitea/modules/log"
)
// CORSConfig defines CORS settings
@@ -28,7 +26,4 @@ var CORSConfig = struct {
func loadCorsFrom(rootCfg ConfigProvider) {
mustMapSetting(rootCfg, "cors", &CORSConfig)
- if CORSConfig.Enabled {
- log.Info("CORS Service Enabled")
- }
}
diff --git a/modules/setting/federation.go b/modules/setting/federation.go
index aeb30683ea..edb18e0054 100644
--- a/modules/setting/federation.go
+++ b/modules/setting/federation.go
@@ -6,7 +6,7 @@ package setting
import (
"code.gitea.io/gitea/modules/log"
- "github.com/go-fed/httpsig"
+ "github.com/42wim/httpsig"
)
// Federation settings
diff --git a/modules/setting/indexer.go b/modules/setting/indexer.go
index 3c96b58740..4c4f63bc61 100644
--- a/modules/setting/indexer.go
+++ b/modules/setting/indexer.go
@@ -109,7 +109,7 @@ func IndexerGlobFromString(globstr string) []Glob {
expr = strings.TrimSpace(expr)
if expr != "" {
if g, err := glob.Compile(expr, '.', '/'); err != nil {
- log.Info("Invalid glob expression '%s' (skipped): %v", expr, err)
+ log.Warn("Invalid glob expression '%s' (skipped): %v", expr, err)
} else {
extarr = append(extarr, Glob{glob: g, pattern: expr})
}
diff --git a/modules/setting/mailer.go b/modules/setting/mailer.go
index 136d932b8d..0804fbd717 100644
--- a/modules/setting/mailer.go
+++ b/modules/setting/mailer.go
@@ -263,8 +263,6 @@ func loadMailerFrom(rootCfg ConfigProvider) {
MailService.OverrideEnvelopeFrom = true
MailService.EnvelopeFrom = parsed.Address
}
-
- log.Info("Mail Service Enabled")
}
func loadRegisterMailFrom(rootCfg ConfigProvider) {
@@ -275,7 +273,6 @@ func loadRegisterMailFrom(rootCfg ConfigProvider) {
return
}
Service.RegisterEmailConfirm = true
- log.Info("Register Mail Service Enabled")
}
func loadNotifyMailFrom(rootCfg ConfigProvider) {
@@ -286,7 +283,6 @@ func loadNotifyMailFrom(rootCfg ConfigProvider) {
return
}
Service.EnableNotifyMail = true
- log.Info("Notify Mail Service Enabled")
}
func tryResolveAddr(addr string) []net.IPAddr {
diff --git a/modules/setting/packages.go b/modules/setting/packages.go
index b3f50617d2..87e41fb5a0 100644
--- a/modules/setting/packages.go
+++ b/modules/setting/packages.go
@@ -42,6 +42,7 @@ var (
LimitSizePub int64
LimitSizePyPI int64
LimitSizeRpm int64
+ LimitSizeAlt int64
LimitSizeRubyGems int64
LimitSizeSwift int64
LimitSizeVagrant int64
@@ -106,6 +107,7 @@ func loadPackagesFrom(rootCfg ConfigProvider) (err error) {
Packages.LimitSizeSwift = mustBytes(sec, "LIMIT_SIZE_SWIFT")
Packages.LimitSizeVagrant = mustBytes(sec, "LIMIT_SIZE_VAGRANT")
Packages.DefaultRPMSignEnabled = sec.Key("DEFAULT_RPM_SIGN_ENABLED").MustBool(false)
+ Packages.LimitSizeAlt = mustBytes(sec, "LIMIT_SIZE_ALT")
return nil
}
diff --git a/modules/setting/server_test.go b/modules/setting/server_test.go
index 8db8168854..7054c474ff 100644
--- a/modules/setting/server_test.go
+++ b/modules/setting/server_test.go
@@ -9,6 +9,7 @@ import (
"code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestDisplayNameDefault(t *testing.T) {
@@ -34,3 +35,41 @@ func TestDisplayNameCustomFormat(t *testing.T) {
displayName := generateDisplayName()
assert.Equal(t, "Forgejo - Beyond coding. We Forge.", displayName)
}
+
+func TestMaxUserRedirectsDefault(t *testing.T) {
+ iniStr := ``
+ cfg, err := NewConfigProviderFromData(iniStr)
+ require.NoError(t, err)
+ loadServiceFrom(cfg)
+
+ assert.EqualValues(t, 0, Service.UsernameCooldownPeriod)
+ assert.EqualValues(t, 0, Service.MaxUserRedirects)
+
+ iniStr = `[service]
+MAX_USER_REDIRECTS = 8`
+ cfg, err = NewConfigProviderFromData(iniStr)
+ require.NoError(t, err)
+ loadServiceFrom(cfg)
+
+ assert.EqualValues(t, 0, Service.UsernameCooldownPeriod)
+ assert.EqualValues(t, 8, Service.MaxUserRedirects)
+
+ iniStr = `[service]
+USERNAME_COOLDOWN_PERIOD = 3`
+ cfg, err = NewConfigProviderFromData(iniStr)
+ require.NoError(t, err)
+ loadServiceFrom(cfg)
+
+ assert.EqualValues(t, 3, Service.UsernameCooldownPeriod)
+ assert.EqualValues(t, 5, Service.MaxUserRedirects)
+
+ iniStr = `[service]
+USERNAME_COOLDOWN_PERIOD = 3
+MAX_USER_REDIRECTS = 8`
+ cfg, err = NewConfigProviderFromData(iniStr)
+ require.NoError(t, err)
+ loadServiceFrom(cfg)
+
+ assert.EqualValues(t, 3, Service.UsernameCooldownPeriod)
+ assert.EqualValues(t, 8, Service.MaxUserRedirects)
+}
diff --git a/modules/setting/service.go b/modules/setting/service.go
index 5a6cc254e0..b76c2b46d1 100644
--- a/modules/setting/service.go
+++ b/modules/setting/service.go
@@ -85,6 +85,8 @@ var Service = struct {
DefaultOrgMemberVisible bool
UserDeleteWithCommentsMaxTime time.Duration
ValidSiteURLSchemes []string
+ UsernameCooldownPeriod int64
+ MaxUserRedirects int64
// OpenID settings
EnableOpenIDSignIn bool
@@ -138,6 +140,7 @@ func CompileEmailGlobList(sec ConfigSection, keys ...string) (globs []glob.Glob)
return globs
}
+
func loadServiceFrom(rootCfg ConfigProvider) {
sec := rootCfg.Section("service")
Service.ActiveCodeLives = sec.Key("ACTIVE_CODE_LIVE_MINUTES").MustInt(180)
@@ -257,6 +260,14 @@ func loadServiceFrom(rootCfg ConfigProvider) {
}
}
Service.ValidSiteURLSchemes = schemes
+ Service.UsernameCooldownPeriod = sec.Key("USERNAME_COOLDOWN_PERIOD").MustInt64(0)
+
+ // Only set a default if USERNAME_COOLDOWN_PERIOD's feature is active.
+ maxUserRedirectsDefault := int64(0)
+ if Service.UsernameCooldownPeriod > 0 {
+ maxUserRedirectsDefault = 5
+ }
+ Service.MaxUserRedirects = sec.Key("MAX_USER_REDIRECTS").MustInt64(maxUserRedirectsDefault)
mustMapSetting(rootCfg, "service.explore", &Service.Explore)
diff --git a/modules/setting/session.go b/modules/setting/session.go
index e9637fdfc5..29ee67914d 100644
--- a/modules/setting/session.go
+++ b/modules/setting/session.go
@@ -73,6 +73,4 @@ func loadSessionFrom(rootCfg ConfigProvider) {
SessionConfig.ProviderConfig = string(shadowConfig)
SessionConfig.OriginalProvider = SessionConfig.Provider
SessionConfig.Provider = "VirtualSession"
-
- log.Info("Session Service Enabled")
}
diff --git a/modules/setting/time.go b/modules/setting/time.go
index 39acba12ef..97988211a9 100644
--- a/modules/setting/time.go
+++ b/modules/setting/time.go
@@ -20,7 +20,6 @@ func loadTimeFrom(rootCfg ConfigProvider) {
if err != nil {
log.Fatal("Load time zone failed: %v", err)
}
- log.Info("Default UI Location is %v", zone)
}
if DefaultUILocation == nil {
DefaultUILocation = time.Local
diff --git a/modules/structs/action.go b/modules/structs/action.go
new file mode 100644
index 0000000000..df9f845adc
--- /dev/null
+++ b/modules/structs/action.go
@@ -0,0 +1,25 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package structs
+
+// ActionRunJob represents a job of a run
+// swagger:model
+type ActionRunJob struct {
+ // the action run job id
+ ID int64 `json:"id"`
+ // the repository id
+ RepoID int64 `json:"repo_id"`
+ // the owner id
+ OwnerID int64 `json:"owner_id"`
+ // the action run job name
+ Name string `json:"name"`
+ // the action run job needed ids
+ Needs []string `json:"needs"`
+ // the action run job labels to run on
+ RunsOn []string `json:"runs_on"`
+ // the action run job latest task id
+ TaskID int64 `json:"task_id"`
+ // the action run job status
+ Status string `json:"status"`
+}
diff --git a/modules/structs/repo_compare.go b/modules/structs/repo_compare.go
index 8a12498705..6e77a813d3 100644
--- a/modules/structs/repo_compare.go
+++ b/modules/structs/repo_compare.go
@@ -5,6 +5,7 @@ package structs
// Compare represents a comparison between two commits.
type Compare struct {
- TotalCommits int `json:"total_commits"` // Total number of commits in the comparison.
- Commits []*Commit `json:"commits"` // List of commits in the comparison.
+ TotalCommits int `json:"total_commits"` // Total number of commits in the comparison.
+ Commits []*Commit `json:"commits"` // List of commits in the comparison.
+ Files []*CommitAffectedFiles `json:"files"` // Total files modified in this comparison.
}
diff --git a/modules/templates/helper.go b/modules/templates/helper.go
index 55de85646c..023ba60fa9 100644
--- a/modules/templates/helper.go
+++ b/modules/templates/helper.go
@@ -103,6 +103,10 @@ func NewFuncMap() template.FuncMap {
"AppVer": func() string {
return setting.AppVer
},
+ "AppVerNoMetadata": func() string {
+ version, _, _ := strings.Cut(setting.AppVer, "+")
+ return version
+ },
"AppDomain": func() string { // documented in mail-templates.md
return setting.Domain
},
diff --git a/modules/translation/i18n/dummy.go b/modules/translation/i18n/dummy.go
index fe15c250f4..861672c619 100644
--- a/modules/translation/i18n/dummy.go
+++ b/modules/translation/i18n/dummy.go
@@ -22,20 +22,7 @@ func (k *KeyLocale) HasKey(trKey string) bool {
// TrHTML implements Locale.
func (k *KeyLocale) TrHTML(trKey string, trArgs ...any) template.HTML {
- args := slices.Clone(trArgs)
- for i, v := range args {
- switch v := v.(type) {
- case nil, bool, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64, template.HTML:
- // for most basic types (including template.HTML which is safe), just do nothing and use it
- case string:
- args[i] = template.HTMLEscapeString(v)
- case fmt.Stringer:
- args[i] = template.HTMLEscapeString(v.String())
- default:
- args[i] = template.HTMLEscapeString(fmt.Sprint(v))
- }
- }
- return template.HTML(k.TrString(trKey, args...))
+ return template.HTML(k.TrString(trKey, PrepareArgsForHTML(trArgs...)...))
}
// TrString implements Locale.
@@ -43,6 +30,11 @@ func (k *KeyLocale) TrString(trKey string, trArgs ...any) string {
return FormatDummy(trKey, trArgs...)
}
+// TrPluralString implements Locale.
+func (k *KeyLocale) TrPluralString(count any, trKey string, trArgs ...any) template.HTML {
+ return template.HTML(FormatDummy(trKey, PrepareArgsForHTML(trArgs...)...))
+}
+
func FormatDummy(trKey string, args ...any) string {
if len(args) == 0 {
return fmt.Sprintf("(%s)", trKey)
diff --git a/modules/translation/i18n/errors.go b/modules/translation/i18n/errors.go
index 7f64ccf908..ee9436a8f7 100644
--- a/modules/translation/i18n/errors.go
+++ b/modules/translation/i18n/errors.go
@@ -8,6 +8,8 @@ import (
)
var (
- ErrLocaleAlreadyExist = util.SilentWrap{Message: "lang already exists", Err: util.ErrAlreadyExist}
- ErrUncertainArguments = util.SilentWrap{Message: "arguments to i18n should not contain uncertain slices", Err: util.ErrInvalidArgument}
+ ErrLocaleAlreadyExist = util.SilentWrap{Message: "lang already exists", Err: util.ErrAlreadyExist}
+ ErrLocaleDoesNotExist = util.SilentWrap{Message: "lang does not exist", Err: util.ErrNotExist}
+ ErrTranslationDoesNotExist = util.SilentWrap{Message: "translation does not exist", Err: util.ErrNotExist}
+ ErrUncertainArguments = util.SilentWrap{Message: "arguments to i18n should not contain uncertain slices", Err: util.ErrInvalidArgument}
)
diff --git a/modules/translation/i18n/i18n.go b/modules/translation/i18n/i18n.go
index 1555cd961e..e447502a3b 100644
--- a/modules/translation/i18n/i18n.go
+++ b/modules/translation/i18n/i18n.go
@@ -8,11 +8,28 @@ import (
"io"
)
+type (
+ PluralFormIndex uint8
+ PluralFormRule func(int64) PluralFormIndex
+)
+
+const (
+ PluralFormZero PluralFormIndex = iota
+ PluralFormOne
+ PluralFormTwo
+ PluralFormFew
+ PluralFormMany
+ PluralFormOther
+)
+
var DefaultLocales = NewLocaleStore()
type Locale interface {
// TrString translates a given key and arguments for a language
TrString(trKey string, trArgs ...any) string
+ // TrPluralString translates a given pluralized key and arguments for a language.
+ // This function returns an error if new-style support for the given key is not available.
+ TrPluralString(count any, trKey string, trArgs ...any) template.HTML
// TrHTML translates a given key and arguments for a language, string arguments are escaped to HTML
TrHTML(trKey string, trArgs ...any) template.HTML
// HasKey reports if a locale has a translation for a given key
@@ -31,8 +48,10 @@ type LocaleStore interface {
Locale(langName string) (Locale, bool)
// HasLang returns whether a given language is present in the store
HasLang(langName string) bool
- // AddLocaleByIni adds a new language to the store
- AddLocaleByIni(langName, langDesc string, source, moreSource []byte) error
+ // AddLocaleByIni adds a new old-style language to the store
+ AddLocaleByIni(langName, langDesc string, pluralRule PluralFormRule, source, moreSource []byte) error
+ // AddLocaleByJSON adds new-style content to an existing language to the store
+ AddToLocaleFromJSON(langName string, source []byte) error
}
// ResetDefaultLocales resets the current default locales
diff --git a/modules/translation/i18n/i18n_test.go b/modules/translation/i18n/i18n_test.go
index 244f6ffbb3..41f85931aa 100644
--- a/modules/translation/i18n/i18n_test.go
+++ b/modules/translation/i18n/i18n_test.go
@@ -12,6 +12,26 @@ import (
"github.com/stretchr/testify/require"
)
+var MockPluralRule PluralFormRule = func(n int64) PluralFormIndex {
+ if n == 0 {
+ return PluralFormZero
+ }
+ if n == 1 {
+ return PluralFormOne
+ }
+ if n >= 2 && n <= 4 {
+ return PluralFormFew
+ }
+ return PluralFormOther
+}
+
+var MockPluralRuleEnglish PluralFormRule = func(n int64) PluralFormIndex {
+ if n == 1 {
+ return PluralFormOne
+ }
+ return PluralFormOther
+}
+
func TestLocaleStore(t *testing.T) {
testData1 := []byte(`
.dot.name = Dot Name
@@ -27,11 +47,48 @@ fmt = %[2]s %[1]s
[section]
sub = Changed Sub String
+commits = fallback value for commits
+`)
+
+ testDataJSON2 := []byte(`
+{
+ "section.json": "the JSON is %s",
+ "section.commits": {
+ "one": "one %d commit",
+ "few": "some %d commits",
+ "other": "lots of %d commits"
+ },
+ "section.incomplete": {
+ "few": "some %d objects (translated)"
+ },
+ "nested": {
+ "outer": {
+ "inner": {
+ "json": "Hello World",
+ "issue": {
+ "one": "one %d issue",
+ "few": "some %d issues",
+ "other": "lots of %d issues"
+ }
+ }
+ }
+ }
+}
+`)
+ testDataJSON1 := []byte(`
+{
+ "section.incomplete": {
+ "one": "[untranslated] some %d object",
+ "other": "[untranslated] some %d objects"
+ }
+}
`)
ls := NewLocaleStore()
- require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, nil))
- require.NoError(t, ls.AddLocaleByIni("lang2", "Lang2", testData2, nil))
+ require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", MockPluralRuleEnglish, testData1, nil))
+ require.NoError(t, ls.AddLocaleByIni("lang2", "Lang2", MockPluralRule, testData2, nil))
+ require.NoError(t, ls.AddToLocaleFromJSON("lang1", testDataJSON1))
+ require.NoError(t, ls.AddToLocaleFromJSON("lang2", testDataJSON2))
ls.SetDefaultLang("lang1")
lang1, _ := ls.Locale("lang1")
@@ -56,6 +113,45 @@ sub = Changed Sub String
result2 := lang2.TrHTML("section.mixed", "a&b")
assert.EqualValues(t, `test value; a&b `, result2)
+ result = lang2.TrString("section.json", "valid")
+ assert.Equal(t, "the JSON is valid", result)
+
+ result = lang2.TrString("nested.outer.inner.json")
+ assert.Equal(t, "Hello World", result)
+
+ result = lang2.TrString("section.commits")
+ assert.Equal(t, "lots of %d commits", result)
+
+ result2 = lang2.TrPluralString(1, "section.commits", 1)
+ assert.EqualValues(t, "one 1 commit", result2)
+
+ result2 = lang2.TrPluralString(3, "section.commits", 3)
+ assert.EqualValues(t, "some 3 commits", result2)
+
+ result2 = lang2.TrPluralString(8, "section.commits", 8)
+ assert.EqualValues(t, "lots of 8 commits", result2)
+
+ result2 = lang2.TrPluralString(0, "section.commits")
+ assert.EqualValues(t, "section.commits", result2)
+
+ result2 = lang2.TrPluralString(1, "nested.outer.inner.issue", 1)
+ assert.EqualValues(t, "one 1 issue", result2)
+
+ result2 = lang2.TrPluralString(3, "nested.outer.inner.issue", 3)
+ assert.EqualValues(t, "some 3 issues", result2)
+
+ result2 = lang2.TrPluralString(9, "nested.outer.inner.issue", 9)
+ assert.EqualValues(t, "lots of 9 issues", result2)
+
+ result2 = lang2.TrPluralString(3, "section.incomplete", 3)
+ assert.EqualValues(t, "some 3 objects (translated)", result2)
+
+ result2 = lang2.TrPluralString(1, "section.incomplete", 1)
+ assert.EqualValues(t, "[untranslated] some 1 object", result2)
+
+ result2 = lang2.TrPluralString(7, "section.incomplete", 7)
+ assert.EqualValues(t, "[untranslated] some 7 objects", result2)
+
langs, descs := ls.ListLangNameDesc()
assert.ElementsMatch(t, []string{"lang1", "lang2"}, langs)
assert.ElementsMatch(t, []string{"Lang1", "Lang2"}, descs)
@@ -77,7 +173,7 @@ c=22
`)
ls := NewLocaleStore()
- require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, testData2))
+ require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", MockPluralRule, testData1, testData2))
lang1, _ := ls.Locale("lang1")
assert.Equal(t, "11", lang1.TrString("a"))
assert.Equal(t, "21", lang1.TrString("b"))
@@ -118,7 +214,7 @@ func (e *errorPointerReceiver) Error() string {
func TestLocaleWithTemplate(t *testing.T) {
ls := NewLocaleStore()
- require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", []byte(`key=%s `), nil))
+ require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", MockPluralRule, []byte(`key=%s `), nil))
lang1, _ := ls.Locale("lang1")
tmpl := template.New("test").Funcs(template.FuncMap{"tr": lang1.TrHTML})
@@ -181,7 +277,7 @@ func TestLocaleStoreQuirks(t *testing.T) {
for _, testData := range testDataList {
ls := NewLocaleStore()
- err := ls.AddLocaleByIni("lang1", "Lang1", []byte("a="+testData.in), nil)
+ err := ls.AddLocaleByIni("lang1", "Lang1", nil, []byte("a="+testData.in), nil)
lang1, _ := ls.Locale("lang1")
require.NoError(t, err, testData.hint)
assert.Equal(t, testData.out, lang1.TrString("a"), testData.hint)
diff --git a/modules/translation/i18n/localestore.go b/modules/translation/i18n/localestore.go
index 0e6ddab401..e80b2592ae 100644
--- a/modules/translation/i18n/localestore.go
+++ b/modules/translation/i18n/localestore.go
@@ -8,8 +8,10 @@ import (
"html/template"
"slices"
+ "code.gitea.io/gitea/modules/json"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/util"
)
// This file implements the static LocaleStore that will not watch for changes
@@ -18,6 +20,9 @@ type locale struct {
store *localeStore
langName string
idxToMsgMap map[int]string // the map idx is generated by store's trKeyToIdxMap
+
+ newStyleMessages map[string]string
+ pluralRule PluralFormRule
}
var _ Locale = (*locale)(nil)
@@ -38,8 +43,19 @@ func NewLocaleStore() LocaleStore {
return &localeStore{localeMap: make(map[string]*locale), trKeyToIdxMap: make(map[string]int)}
}
+const (
+ PluralFormSeparator string = "\036"
+)
+
+// A note about pluralization rules.
+// go-i18n supports plural rules in theory.
+// In practice, it relies on another library that hardcodes a list of common languages
+// and their plural rules, and does not support languages not hardcoded there.
+// So we pretend that all languages are English and use our own function to extract
+// the correct plural form for a given count and language.
+
// AddLocaleByIni adds locale by ini into the store
-func (store *localeStore) AddLocaleByIni(langName, langDesc string, source, moreSource []byte) error {
+func (store *localeStore) AddLocaleByIni(langName, langDesc string, pluralRule PluralFormRule, source, moreSource []byte) error {
if _, ok := store.localeMap[langName]; ok {
return ErrLocaleAlreadyExist
}
@@ -47,7 +63,7 @@ func (store *localeStore) AddLocaleByIni(langName, langDesc string, source, more
store.langNames = append(store.langNames, langName)
store.langDescs = append(store.langDescs, langDesc)
- l := &locale{store: store, langName: langName, idxToMsgMap: make(map[int]string)}
+ l := &locale{store: store, langName: langName, idxToMsgMap: make(map[int]string), pluralRule: pluralRule, newStyleMessages: make(map[string]string)}
store.localeMap[l.langName] = l
iniFile, err := setting.NewConfigProviderForLocale(source, moreSource)
@@ -78,6 +94,98 @@ func (store *localeStore) AddLocaleByIni(langName, langDesc string, source, more
return nil
}
+func RecursivelyAddTranslationsFromJSON(locale *locale, object map[string]any, prefix string) error {
+ for key, value := range object {
+ var fullkey string
+ if prefix != "" {
+ fullkey = prefix + "." + key
+ } else {
+ fullkey = key
+ }
+
+ switch v := value.(type) {
+ case string:
+ // Check whether we are adding a plural form to the parent object, or a new nested JSON object.
+
+ if key == "zero" || key == "one" || key == "two" || key == "few" || key == "many" {
+ locale.newStyleMessages[prefix+PluralFormSeparator+key] = v
+ } else if key == "other" {
+ locale.newStyleMessages[prefix] = v
+ } else {
+ locale.newStyleMessages[fullkey] = v
+ }
+
+ case map[string]any:
+ err := RecursivelyAddTranslationsFromJSON(locale, v, fullkey)
+ if err != nil {
+ return err
+ }
+
+ case nil:
+ default:
+ return fmt.Errorf("Unrecognized JSON value '%s'", value)
+ }
+ }
+
+ return nil
+}
+
+func (store *localeStore) AddToLocaleFromJSON(langName string, source []byte) error {
+ locale, ok := store.localeMap[langName]
+ if !ok {
+ return ErrLocaleDoesNotExist
+ }
+
+ var result map[string]any
+ if err := json.Unmarshal(source, &result); err != nil {
+ return err
+ }
+
+ return RecursivelyAddTranslationsFromJSON(locale, result, "")
+}
+
+func (l *locale) LookupNewStyleMessage(trKey string) string {
+ if msg, ok := l.newStyleMessages[trKey]; ok {
+ return msg
+ }
+ return ""
+}
+
+func (l *locale) LookupPlural(trKey string, count any) string {
+ n, err := util.ToInt64(count)
+ if err != nil {
+ log.Error("Invalid plural count '%s'", count)
+ return ""
+ }
+
+ pluralForm := l.pluralRule(n)
+ suffix := ""
+ switch pluralForm {
+ case PluralFormZero:
+ suffix = PluralFormSeparator + "zero"
+ case PluralFormOne:
+ suffix = PluralFormSeparator + "one"
+ case PluralFormTwo:
+ suffix = PluralFormSeparator + "two"
+ case PluralFormFew:
+ suffix = PluralFormSeparator + "few"
+ case PluralFormMany:
+ suffix = PluralFormSeparator + "many"
+ case PluralFormOther:
+ // No suffix for the "other" string.
+ default:
+ log.Error("Invalid plural form index %d for count %d", pluralForm, count)
+ return ""
+ }
+
+ if result, ok := l.newStyleMessages[trKey+suffix]; ok {
+ return result
+ }
+
+ log.Error("Missing translation for plural form index %d for count %d", pluralForm, count)
+ return ""
+}
+
func (store *localeStore) HasLang(langName string) bool {
_, ok := store.localeMap[langName]
return ok
@@ -113,22 +221,37 @@ func (store *localeStore) Close() error {
func (l *locale) TrString(trKey string, trArgs ...any) string {
format := trKey
- idx, ok := l.store.trKeyToIdxMap[trKey]
- found := false
- if ok {
- if msg, ok := l.idxToMsgMap[idx]; ok {
- format = msg // use the found translation
- found = true
- } else if def, ok := l.store.localeMap[l.store.defaultLang]; ok {
- // try to use default locale's translation
- if msg, ok := def.idxToMsgMap[idx]; ok {
- format = msg
+ if msg := l.LookupNewStyleMessage(trKey); msg != "" {
+ format = msg
+ } else {
+ // First fallback: old-style translation
+ idx, ok := l.store.trKeyToIdxMap[trKey]
+ found := false
+ if ok {
+ if msg, ok := l.idxToMsgMap[idx]; ok {
+ format = msg // use the found translation
found = true
}
}
- }
- if !found {
- log.Error("Missing translation %q", trKey)
+
+ if !found {
+ // Second fallback: new-style default language
+ if defaultLang, ok := l.store.localeMap[l.store.defaultLang]; ok {
+ if msg := defaultLang.LookupNewStyleMessage(trKey); msg != "" {
+ format = msg
+ } else {
+ // Third fallback: old-style default language
+ if msg, ok := defaultLang.idxToMsgMap[idx]; ok {
+ format = msg
+ found = true
+ }
+ }
+ }
+
+ if !found {
+ log.Error("Missing translation %q", trKey)
+ }
+ }
}
msg, err := Format(format, trArgs...)
@@ -138,7 +261,7 @@ func (l *locale) TrString(trKey string, trArgs ...any) string {
return msg
}
-func (l *locale) TrHTML(trKey string, trArgs ...any) template.HTML {
+func PrepareArgsForHTML(trArgs ...any) []any {
args := slices.Clone(trArgs)
for i, v := range args {
switch v := v.(type) {
@@ -152,7 +275,30 @@ func (l *locale) TrHTML(trKey string, trArgs ...any) template.HTML {
args[i] = template.HTMLEscapeString(fmt.Sprint(v))
}
}
- return template.HTML(l.TrString(trKey, args...))
+ return args
+}
+
+func (l *locale) TrHTML(trKey string, trArgs ...any) template.HTML {
+ return template.HTML(l.TrString(trKey, PrepareArgsForHTML(trArgs...)...))
+}
+
+func (l *locale) TrPluralString(count any, trKey string, trArgs ...any) template.HTML {
+ message := l.LookupPlural(trKey, count)
+
+ if message == "" {
+ if defaultLang, ok := l.store.localeMap[l.store.defaultLang]; ok {
+ message = defaultLang.LookupPlural(trKey, count)
+ }
+ if message == "" {
+ message = trKey
+ }
+ }
+
+ message, err := Format(message, PrepareArgsForHTML(trArgs...)...)
+ if err != nil {
+ log.Error("Error whilst formatting %q in %s: %v", trKey, l.langName, err)
+ }
+ return template.HTML(message)
}
// HasKey returns whether a key is present in this locale or not
diff --git a/modules/translation/mock.go b/modules/translation/mock.go
index fe3a1502ea..4d9acce26f 100644
--- a/modules/translation/mock.go
+++ b/modules/translation/mock.go
@@ -31,6 +31,10 @@ func (l MockLocale) TrN(cnt any, key1, keyN string, args ...any) template.HTML {
return template.HTML(key1)
}
+func (l MockLocale) TrPluralString(count any, trKey string, trArgs ...any) template.HTML {
+ return template.HTML(trKey)
+}
+
func (l MockLocale) TrSize(s int64) ReadableSize {
return ReadableSize{fmt.Sprint(s), ""}
}
diff --git a/modules/translation/plural_rules.go b/modules/translation/plural_rules.go
new file mode 100644
index 0000000000..b8c00ceef7
--- /dev/null
+++ b/modules/translation/plural_rules.go
@@ -0,0 +1,253 @@
+// Copyright 2024 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+// Some useful links:
+// https://www.unicode.org/cldr/charts/46/supplemental/language_plural_rules.html
+// https://translate.codeberg.org/languages/$LANGUAGE_CODE/#information
+// https://github.com/WeblateOrg/language-data/blob/main/languages.csv
+// Note that in some cases there is ambiguity about the correct form for a given language. In this case, ask the locale's translators.
+
+package translation
+
+import (
+ "strings"
+
+ "code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/translation/i18n"
+)
+
+// The constants refer to indices below in `PluralRules` and also in i18n.js, keep them in sync!
+const (
+ PluralRuleDefault = 0
+ PluralRuleBengali = 1
+ PluralRuleIcelandic = 2
+ PluralRuleFilipino = 3
+ PluralRuleOneForm = 4
+ PluralRuleCzech = 5
+ PluralRuleRussian = 6
+ PluralRulePolish = 7
+ PluralRuleLatvian = 8
+ PluralRuleLithuanian = 9
+ PluralRuleFrench = 10
+ PluralRuleCatalan = 11
+ PluralRuleSlovenian = 12
+ PluralRuleArabic = 13
+)
+
+func GetPluralRuleImpl(langName string) int {
+ // First, check for languages with country-specific plural rules.
+ switch langName {
+ case "pt-BR":
+ return PluralRuleFrench
+
+ case "pt-PT":
+ return PluralRuleCatalan
+
+ default:
+ break
+ }
+
+ // Remove the country portion of the locale name.
+ langName = strings.Split(strings.Split(langName, "_")[0], "-")[0]
+
+ // When adding a new language not in the list, add its plural rule definition here.
+ switch langName {
+ case "en", "aa", "ab", "abr", "ada", "ae", "aeb", "af", "afh", "aii", "ain", "akk", "ale", "aln", "alt", "ami", "an", "ang", "anp", "apc", "arc", "arp", "arq", "arw", "arz", "asa", "ast", "av", "avk", "awa", "ayc", "az", "azb", "ba", "bal", "ban", "bar", "bas", "bbc", "bci", "bej", "bem", "ber", "bew", "bez", "bg", "bgc", "bgn", "bhb", "bhi", "bi", "bik", "bin", "bjj", "bjn", "bla", "bnt", "bqi", "bra", "brb", "brh", "brx", "bua", "bug", "bum", "byn", "cad", "cak", "car", "ce", "cgg", "ch", "chb", "chg", "chk", "chm", "chn", "cho", "chp", "chr", "chy", "ckb", "co", "cop", "cpe", "cpf", "cr", "crp", "cu", "cv", "da", "dak", "dar", "dcc", "de", "del", "den", "dgr", "din", "dje", "dnj", "dnk", "dru", "dry", "dua", "dum", "dv", "dyu", "ee", "efi", "egl", "egy", "eka", "el", "elx", "enm", "eo", "et", "eu", "ewo", "ext", "fan", "fat", "fbl", "ffm", "fi", "fj", "fo", "fon", "frk", "frm", "fro", "frr", "frs", "fuq", "fur", "fuv", "fvr", "fy", "gaa", "gay", "gba", "gbm", "gez", "gil", "gl", "glk", "gmh", "gn", "goh", "gom", "gon", "gor", "got", "grb", "gsw", "guc", "gum", "gur", "guz", "gwi", "ha", "hai", "haw", "haz", "hil", "hit", "hmn", "hnd", "hne", "hno", "ho", "hoc", "hoj", "hrx", "ht", "hu", "hup", "hus", "hz", "ia", "iba", "ibb", "ie", "ik", "ilo", "inh", "io", "jam", "jgo", "jmc", "jpr", "jrb", "ka", "kaa", "kac", "kaj", "kam", "kaw", "kbd", "kcg", "kfr", "kfy", "kg", "kha", "khn", "kho", "ki", "kj", "kk", "kkj", "kl", "kln", "kmb", "kmr", "kok", "kpe", "kr", "krc", "kri", "krl", "kru", "ks", "ksb", "ku", "kum", "kut", "kv", "kxm", "ky", "la", "lad", "laj", "lam", "lb", "lez", "lfn", "lg", "li", "lij", "ljp", "lki", "lmn", "lmo", "lol", "loz", "lrc", "lu", "lua", "lui", "lun", "luo", "lus", "luy", "luz", "mad", "mag", "mai", "mak", "man", "mas", "mdf", "mdh", "mdr", "men", "mer", "mfa", "mga", "mgh", "mgo", "mh", "mhr", "mic", "min", "mjw", "ml", "mn", "mnc", "mni", "mnw", "moe", "moh", "mos", "mr", "mrh", "mtr", "mus", "mwk", "mwl", "mwr", "mxc", "myv", "myx", "mzn", "na", "nah", "nap", "nb", "nd", "ndc", "nds", "ne", "new", "ng", "ngl", "nia", "nij", "niu", "nl", "nn", "nnh", "nod", "noe", "nog", "non", "nr", "nuk", "nv", "nwc", "ny", "nym", "nyn", "nyo", "nzi", "oj", "om", "or", "os", "ota", "otk", "ovd", "pag", "pal", "pam", "pap", "pau", "pbb", "pdt", "peo", "phn", "pi", "pms", "pon", "pro", "ps", "pwn", "qu", "quc", "qug", "qya", "raj", "rap", "rar", "rcf", "rej", "rhg", "rif", "rkt", "rm", "rmt", "rn", "rng", "rof", "rom", "rue", "rup", "rw", "rwk", "sad", "sai", "sam", "saq", "sas", "sc", "sck", "sco", "sd", "sdh", "sef", "seh", "sel", "sga", "sgn", "sgs", "shn", "sid", "sjd", "skr", "sm", "sml", "sn", "snk", "so", "sog", "sou", "sq", "srn", "srr", "ss", "ssy", "st", "suk", "sus", "sux", "sv", "sw", "swg", "swv", "sxu", "syc", "syl", "syr", "szy", "ta", "tay", "tcy", "te", "tem", "teo", "ter", "tet", "tig", "tiv", "tk", "tkl", "tli", "tly", "tmh", "tn", "tog", "tr", "trv", "ts", "tsg", "tsi", "tsj", "tts", "tum", "tvl", "tw", "ty", "tyv", "tzj", "tzl", "udm", "ug", "uga", "umb", "und", "unr", "ur", "uz", "vai", "ve", "vls", "vmf", "vmw", "vo", "vot", "vro", "vun", "wae", "wal", "war", "was", "wbq", "wbr", "wep", "wtm", "xal", "xh", "xnr", "xog", "yao", "yap", "yi", "yua", "za", "zap", "zbl", "zen", "zgh", "zun", "zza":
+ return PluralRuleDefault
+
+ case "ach", "ady", "ak", "am", "arn", "as", "bh", "bho", "bn", "csw", "doi", "fa", "ff", "frc", "frp", "gu", "gug", "gun", "guw", "hi", "hy", "kab", "kn", "ln", "mfe", "mg", "mi", "mia", "nso", "oc", "pa", "pcm", "pt", "qdt", "qtp", "si", "tg", "ti", "wa", "zu":
+ return PluralRuleBengali
+
+ case "is":
+ return PluralRuleIcelandic
+
+ case "fil":
+ return PluralRuleFilipino
+
+ case "ace", "ay", "bm", "bo", "cdo", "cpx", "crh", "dz", "gan", "hak", "hnj", "hsn", "id", "ig", "ii", "ja", "jbo", "jv", "kde", "kea", "km", "ko", "kos", "lkt", "lo", "lzh", "ms", "my", "nan", "nqo", "osa", "sah", "ses", "sg", "son", "su", "th", "tlh", "to", "tok", "tpi", "tt", "vi", "wo", "wuu", "yo", "yue", "zh":
+ return PluralRuleOneForm
+
+ case "cpp", "cs", "sk":
+ return PluralRuleCzech
+
+ case "be", "bs", "cnr", "hr", "ru", "sr", "uk", "wen":
+ return PluralRuleRussian
+
+ case "csb", "pl", "szl":
+ return PluralRulePolish
+
+ case "lv", "prg":
+ return PluralRuleLatvian
+
+ case "lt":
+ return PluralRuleLithuanian
+
+ case "fr":
+ return PluralRuleFrench
+
+ case "ca", "es", "it":
+ return PluralRuleCatalan
+
+ case "sl":
+ return PluralRuleSlovenian
+
+ case "ar":
+ return PluralRuleArabic
+
+ default:
+ break
+ }
+
+ log.Error("No plural rule defined for language %s", langName)
+ return PluralRuleDefault
+}
+
+var PluralRules = []i18n.PluralFormRule{
+ // [ 0] Common 2-form, e.g. English, German
+ func(n int64) i18n.PluralFormIndex {
+ if n != 1 {
+ return i18n.PluralFormOther
+ }
+ return i18n.PluralFormOne
+ },
+
+ // [ 1] Bengali
+ func(n int64) i18n.PluralFormIndex {
+ if n > 1 {
+ return i18n.PluralFormOther
+ }
+ return i18n.PluralFormOne
+ },
+
+ // [ 2] Icelandic
+ func(n int64) i18n.PluralFormIndex {
+ if n%10 != 1 || n%100 == 11 {
+ return i18n.PluralFormOther
+ }
+ return i18n.PluralFormOne
+ },
+
+ // [ 3] Filipino
+ func(n int64) i18n.PluralFormIndex {
+ if n != 1 && n != 2 && n != 3 && (n%10 == 4 || n%10 == 6 || n%10 == 9) {
+ return i18n.PluralFormOther
+ }
+ return i18n.PluralFormOne
+ },
+
+ // [ 4] OneForm
+ func(n int64) i18n.PluralFormIndex {
+ return i18n.PluralFormOther
+ },
+
+ // [ 5] Czech
+ func(n int64) i18n.PluralFormIndex {
+ if n == 1 {
+ return i18n.PluralFormOne
+ }
+ if n >= 2 && n <= 4 {
+ return i18n.PluralFormFew
+ }
+ return i18n.PluralFormOther
+ },
+
+ // [ 6] Russian
+ func(n int64) i18n.PluralFormIndex {
+ if n%10 == 1 && n%100 != 11 {
+ return i18n.PluralFormOne
+ }
+ if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
+ return i18n.PluralFormFew
+ }
+ return i18n.PluralFormMany
+ },
+
+ // [ 7] Polish
+ func(n int64) i18n.PluralFormIndex {
+ if n == 1 {
+ return i18n.PluralFormOne
+ }
+ if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
+ return i18n.PluralFormFew
+ }
+ return i18n.PluralFormMany
+ },
+
+ // [ 8] Latvian
+ func(n int64) i18n.PluralFormIndex {
+ if n%10 == 0 || n%100 >= 11 && n%100 <= 19 {
+ return i18n.PluralFormZero
+ }
+ if n%10 == 1 && n%100 != 11 {
+ return i18n.PluralFormOne
+ }
+ return i18n.PluralFormOther
+ },
+
+ // [ 9] Lithuanian
+ func(n int64) i18n.PluralFormIndex {
+ if n%10 == 1 && (n%100 < 11 || n%100 > 19) {
+ return i18n.PluralFormOne
+ }
+ if n%10 >= 2 && n%10 <= 9 && (n%100 < 11 || n%100 > 19) {
+ return i18n.PluralFormFew
+ }
+ return i18n.PluralFormMany
+ },
+
+ // [10] French
+ func(n int64) i18n.PluralFormIndex {
+ if n == 0 || n == 1 {
+ return i18n.PluralFormOne
+ }
+ if n != 0 && n%1000000 == 0 {
+ return i18n.PluralFormMany
+ }
+ return i18n.PluralFormOther
+ },
+
+ // [11] Catalan
+ func(n int64) i18n.PluralFormIndex {
+ if n == 1 {
+ return i18n.PluralFormOne
+ }
+ if n != 0 && n%1000000 == 0 {
+ return i18n.PluralFormMany
+ }
+ return i18n.PluralFormOther
+ },
+
+ // [12] Slovenian
+ func(n int64) i18n.PluralFormIndex {
+ if n%100 == 1 {
+ return i18n.PluralFormOne
+ }
+ if n%100 == 2 {
+ return i18n.PluralFormTwo
+ }
+ if n%100 == 3 || n%100 == 4 {
+ return i18n.PluralFormFew
+ }
+ return i18n.PluralFormOther
+ },
+
+ // [13] Arabic
+ func(n int64) i18n.PluralFormIndex {
+ if n == 0 {
+ return i18n.PluralFormZero
+ }
+ if n == 1 {
+ return i18n.PluralFormOne
+ }
+ if n == 2 {
+ return i18n.PluralFormTwo
+ }
+ if n%100 >= 3 && n%100 <= 10 {
+ return i18n.PluralFormFew
+ }
+ if n%100 >= 11 {
+ return i18n.PluralFormMany
+ }
+ return i18n.PluralFormOther
+ },
+}
diff --git a/modules/translation/translation.go b/modules/translation/translation.go
index 6687d3d817..7d1c627c84 100644
--- a/modules/translation/translation.go
+++ b/modules/translation/translation.go
@@ -32,6 +32,9 @@ type Locale interface {
TrString(string, ...any) string
Tr(key string, args ...any) template.HTML
+ // New-style pluralized strings
+ TrPluralString(count any, trKey string, trArgs ...any) template.HTML
+ // Old-style pseudo-pluralized strings, deprecated
TrN(cnt any, key1, keyN string, args ...any) template.HTML
TrSize(size int64) ReadableSize
@@ -100,8 +103,17 @@ func InitLocales(ctx context.Context) {
}
key := "locale_" + setting.Langs[i] + ".ini"
- if err = i18n.DefaultLocales.AddLocaleByIni(setting.Langs[i], setting.Names[i], localeDataBase, localeData[key]); err != nil {
- log.Error("Failed to set messages to %s: %v", setting.Langs[i], err)
+ if err = i18n.DefaultLocales.AddLocaleByIni(setting.Langs[i], setting.Names[i], PluralRules[GetPluralRuleImpl(setting.Langs[i])], localeDataBase, localeData[key]); err != nil {
+ log.Error("Failed to set old-style messages to %s: %v", setting.Langs[i], err)
+ }
+
+ key = "locale_next/locale_" + setting.Langs[i] + ".json"
+ if bytes, err := options.AssetFS().ReadFile(key); err == nil {
+ if err = i18n.DefaultLocales.AddToLocaleFromJSON(setting.Langs[i], bytes); err != nil {
+ log.Error("Failed to add new-style messages to %s: %v", setting.Langs[i], err)
+ }
+ } else {
+ log.Error("Failed to open new-style messages for %s: %v", setting.Langs[i], err)
}
}
if len(setting.Langs) != 0 {
diff --git a/modules/translation/translation_test.go b/modules/translation/translation_test.go
index bffbb155ca..5b3eefb355 100644
--- a/modules/translation/translation_test.go
+++ b/modules/translation/translation_test.go
@@ -48,3 +48,111 @@ func TestPrettyNumber(t *testing.T) {
assert.EqualValues(t, "1,000,000", l.PrettyNumber(1000000))
assert.EqualValues(t, "1,000,000.1", l.PrettyNumber(1000000.1))
}
+
+func TestGetPluralRule(t *testing.T) {
+ assert.Equal(t, PluralRuleDefault, GetPluralRuleImpl("en"))
+ assert.Equal(t, PluralRuleDefault, GetPluralRuleImpl("en-US"))
+ assert.Equal(t, PluralRuleDefault, GetPluralRuleImpl("en_UK"))
+ assert.Equal(t, PluralRuleDefault, GetPluralRuleImpl("nds"))
+ assert.Equal(t, PluralRuleDefault, GetPluralRuleImpl("de-DE"))
+
+ assert.Equal(t, PluralRuleOneForm, GetPluralRuleImpl("zh"))
+ assert.Equal(t, PluralRuleOneForm, GetPluralRuleImpl("ja"))
+
+ assert.Equal(t, PluralRuleBengali, GetPluralRuleImpl("bn"))
+
+ assert.Equal(t, PluralRuleIcelandic, GetPluralRuleImpl("is"))
+
+ assert.Equal(t, PluralRuleFilipino, GetPluralRuleImpl("fil"))
+
+ assert.Equal(t, PluralRuleCzech, GetPluralRuleImpl("cs"))
+
+ assert.Equal(t, PluralRuleRussian, GetPluralRuleImpl("ru"))
+
+ assert.Equal(t, PluralRulePolish, GetPluralRuleImpl("pl"))
+
+ assert.Equal(t, PluralRuleLatvian, GetPluralRuleImpl("lv"))
+
+ assert.Equal(t, PluralRuleLithuanian, GetPluralRuleImpl("lt"))
+
+ assert.Equal(t, PluralRuleFrench, GetPluralRuleImpl("fr"))
+
+ assert.Equal(t, PluralRuleCatalan, GetPluralRuleImpl("ca"))
+
+ assert.Equal(t, PluralRuleSlovenian, GetPluralRuleImpl("sl"))
+
+ assert.Equal(t, PluralRuleArabic, GetPluralRuleImpl("ar"))
+
+ assert.Equal(t, PluralRuleCatalan, GetPluralRuleImpl("pt-PT"))
+ assert.Equal(t, PluralRuleFrench, GetPluralRuleImpl("pt-BR"))
+
+ assert.Equal(t, PluralRuleDefault, GetPluralRuleImpl("invalid"))
+}
+
+func TestApplyPluralRule(t *testing.T) {
+ testCases := []struct {
+ expect i18n.PluralFormIndex
+ pluralRule int
+ values []int64
+ }{
+ {i18n.PluralFormOne, PluralRuleDefault, []int64{1}},
+ {i18n.PluralFormOther, PluralRuleDefault, []int64{0, 2, 10, 256}},
+
+ {i18n.PluralFormOther, PluralRuleOneForm, []int64{0, 1, 2}},
+
+ {i18n.PluralFormOne, PluralRuleBengali, []int64{0, 1}},
+ {i18n.PluralFormOther, PluralRuleBengali, []int64{2, 10, 256}},
+
+ {i18n.PluralFormOne, PluralRuleIcelandic, []int64{1, 21, 31}},
+ {i18n.PluralFormOther, PluralRuleIcelandic, []int64{0, 2, 11, 15, 256}},
+
+ {i18n.PluralFormOne, PluralRuleFilipino, []int64{0, 1, 2, 3, 5, 7, 8, 10, 11, 12, 257}},
+ {i18n.PluralFormOther, PluralRuleFilipino, []int64{4, 6, 9, 14, 16, 19, 256}},
+
+ {i18n.PluralFormOne, PluralRuleCzech, []int64{1}},
+ {i18n.PluralFormFew, PluralRuleCzech, []int64{2, 3, 4}},
+ {i18n.PluralFormOther, PluralRuleCzech, []int64{5, 0, 12, 78, 254}},
+
+ {i18n.PluralFormOne, PluralRuleRussian, []int64{1, 21, 31}},
+ {i18n.PluralFormFew, PluralRuleRussian, []int64{2, 23, 34}},
+ {i18n.PluralFormMany, PluralRuleRussian, []int64{0, 5, 11, 37, 111, 256}},
+
+ {i18n.PluralFormOne, PluralRulePolish, []int64{1}},
+ {i18n.PluralFormFew, PluralRulePolish, []int64{2, 23, 34}},
+ {i18n.PluralFormMany, PluralRulePolish, []int64{0, 5, 11, 21, 37, 256}},
+
+ {i18n.PluralFormZero, PluralRuleLatvian, []int64{0, 10, 11, 17}},
+ {i18n.PluralFormOne, PluralRuleLatvian, []int64{1, 21, 71}},
+ {i18n.PluralFormOther, PluralRuleLatvian, []int64{2, 7, 22, 23, 256}},
+
+ {i18n.PluralFormOne, PluralRuleLithuanian, []int64{1, 21, 31}},
+ {i18n.PluralFormFew, PluralRuleLithuanian, []int64{2, 5, 9, 23, 34, 256}},
+ {i18n.PluralFormMany, PluralRuleLithuanian, []int64{0, 10, 11, 18}},
+
+ {i18n.PluralFormOne, PluralRuleFrench, []int64{0, 1}},
+ {i18n.PluralFormMany, PluralRuleFrench, []int64{1000000, 2000000}},
+ {i18n.PluralFormOther, PluralRuleFrench, []int64{2, 4, 10, 256}},
+
+ {i18n.PluralFormOne, PluralRuleCatalan, []int64{1}},
+ {i18n.PluralFormMany, PluralRuleCatalan, []int64{1000000, 2000000}},
+ {i18n.PluralFormOther, PluralRuleCatalan, []int64{0, 2, 4, 10, 256}},
+
+ {i18n.PluralFormOne, PluralRuleSlovenian, []int64{1, 101, 201, 501}},
+ {i18n.PluralFormTwo, PluralRuleSlovenian, []int64{2, 102, 202, 502}},
+ {i18n.PluralFormFew, PluralRuleSlovenian, []int64{3, 103, 203, 503, 4, 104, 204, 504}},
+ {i18n.PluralFormOther, PluralRuleSlovenian, []int64{0, 5, 11, 12, 20, 256}},
+
+ {i18n.PluralFormZero, PluralRuleArabic, []int64{0}},
+ {i18n.PluralFormOne, PluralRuleArabic, []int64{1}},
+ {i18n.PluralFormTwo, PluralRuleArabic, []int64{2}},
+ {i18n.PluralFormFew, PluralRuleArabic, []int64{3, 4, 9, 10, 103, 104}},
+ {i18n.PluralFormMany, PluralRuleArabic, []int64{11, 12, 13, 14, 17, 111, 256}},
+ {i18n.PluralFormOther, PluralRuleArabic, []int64{100, 101, 102}},
+ }
+
+ for _, tc := range testCases {
+ for _, n := range tc.values {
+ assert.Equal(t, tc.expect, PluralRules[tc.pluralRule](n), "Testcase for plural rule %d, value %d", tc.pluralRule, n)
+ }
+ }
+}
diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini
index 924ce710e0..36c29f7bbd 100644
--- a/options/locale/locale_bg.ini
+++ b/options/locale/locale_bg.ini
@@ -111,6 +111,7 @@ new_migrate.link = Нова миграция
new_org.link = Нова организация
copy_generic = Копиране в клипборда
copy_error = Неуспешно копиране
+copy_path = Копиране на пътя
[settings]
ui = Тема
@@ -159,7 +160,7 @@ comment_type_group_milestone = Етап
manage_emails = Управление на адресите на ел. поща
permission_read = Четене
update_password = Обновяване на паролата
-biography_placeholder = Разкажете ни малко за себе си! (Можете да използвате Markdown)
+biography_placeholder = Разкажете на другите малко за себе си! (Можете да използвате Маркдаун)
orgs = Организации
continue = Продължаване
blocked_users = Блокирани потребители
@@ -224,7 +225,7 @@ key_signature_gpg_placeholder = Започва с „-----BEGIN PGP SIGNATURE---
key_signature_ssh_placeholder = Започва с „-----BEGIN SSH SIGNATURE-----“
saved_successfully = Настройките бяха запазени успешно.
no_activity = Няма скорошна дейност
-theme_desc = Това ще бъде вашата тема по подразбиране в целия сайт.
+theme_desc = Тази тема ще се използва за уеб интерфейса, когато сте влезли.
keep_activity_private = Скриване на дейността от профилната страница
lookup_avatar_by_mail = Търсене на профилна снимка по адреса на ел. поща
password_incorrect = Текущата парола е неправилна.
@@ -235,7 +236,7 @@ twofa_disabled = Двуфакторното удостоверяване е из
orgs_none = Не сте участник в никакви организации.
repos_none = Не притежавате никакви хранилища.
blocked_users_none = Няма блокирани потребители.
-profile_desc = Контролирайте как вашият профил се показва на другите потребители. Вашият основен адрес на ел. поща ще се използва за известия, възстановяване на паролата и уеб базирани Git операции.
+profile_desc = Вашият профил
permission_write = Четене и писане
twofa_disable = Изключване на двуфакторното удостоверяване
twofa_enroll = Включване на двуфакторно удостоверяване
@@ -252,6 +253,9 @@ gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig
language.title = Език по подразбиране
language.localization_project = Помогнете ни да преведем Forgejo на вашия език! Научете повече .
language.description = Този език ще бъде запазен във вашия акаунт и ще се използва като език по подразбиране, след като влезете.
+pronouns_custom = Персонализирани
+visibility.limited_tooltip = Видимо само за влезли потребители
+pronouns_custom_label = Персонализирани местоимения
[packages]
container.labels.value = Стойност
@@ -280,6 +284,9 @@ dependencies = Зависимости
published_by_in = Публикуван %[1]s от %[3]s в %[5]s
published_by = Публикуван %[1]s от %[3]s
generic.download = Изтеглете пакета от командния ред:
+container.details.type = Тип образ
+alpine.repository = За хранилището
+container.images.title = Образи
[tool]
hours = %d часа
@@ -397,7 +404,7 @@ issues.keyword_search_unavailable = В момента търсенето по к
repo_desc_helper = Въведете кратко описание (опционално)
mirror_address = Клониране от URL
owner_helper = Някои организации може да не се показват в падащото меню поради ограничение за максимален брой хранилища.
-new_repo_helper = Хранилището съдържа всички файлове на проекта, включително хронологията на ревизиите. Вече хоствате хранилище другаде? Мигрирайте хранилище.
+new_repo_helper = Хранилището съдържа всички файлове на проекта, включително хронологията на ревизиите. Вече хоствате хранилище другаде? Мигрирайте хранилище .
repo_name_helper = Добрите имена на хранилища използват кратки, запомнящи се и уникални ключови думи.
migrated_from = Мигрирано от %[2]s
visibility_description = Само притежателят или участниците в организацията, ако имат права, ще могат да го видят.
@@ -424,14 +431,14 @@ settings.add_webhook = Добавяне на уеб-кука
template.webhooks = Уеб-куки
issues.label_templates.info = Все още няма етикети. Създайте етикет с „Нов етикет“ или използвайте предварително зададен набор от етикети:
labels = Етикети
-license_helper_desc = Лицензът определя какво могат и какво не могат да правят другите с вашия код. Не сте сигурни кой е подходящ за вашия проект? Вижте Избиране на лиценз.
+license_helper_desc = Лицензът определя какво могат и какво не могат да правят другите с вашия код. Не сте сигурни кой е подходящ за вашия проект? Вижте Избиране на лиценз .
issues.choose.blank = По подразбиране
settings.hooks = Уеб-куки
issue_labels = Етикети
issue_labels_helper = Изберете набор от етикети
readme_helper_desc = Това е мястото, където можете да напишете пълно описание на вашия проект.
repo_gitignore_helper = Изберете .gitignore шаблони
-auto_init = Да се инициализира хранилище (Добавя .gitignore, License и README)
+auto_init = Да се инициализира хранилище
template.issue_labels = Етикети за задачите
migrate_items_labels = Етикети
issues.label_templates.title = Зареждане на предв. зададен набор от етикети
@@ -815,7 +822,7 @@ diff.browse_source = Разглеждане на изходния код
file_view_rendered = Преглед на визуализация
issues.lock_with_reason = заключи като %s и ограничи обсъждането до сътрудници %s
milestones.new_subheader = Етапите ви помагат да управлявате задачите и да проследявате напредъка им.
-release.edit = редактиране
+release.edit = Редактиране
activity.published_release_label = Издание
activity.navbar.contributors = Допринесли
pulls.recently_pushed_new_branches = Изтласкахте в клона %[1]s %[2]s
@@ -939,7 +946,7 @@ pulls.approve_count_1 = %d одобрение
pulls.can_auto_merge_desc = Тази заявка за сливане може да бъде слята автоматично.
pulls.num_conflicting_files_1 = %d конфликтен файл
activity.git_stats_commit_n = %d подавания
-settings.event_issues = Модификация
+settings.event_issues = Изменение
branch.delete_head = Изтриване
branch.delete = Изтриване на клона „%s“
branch.delete_html = Изтриване на клона
@@ -1113,7 +1120,7 @@ pulls.reject_count_1 = %d поискана промяна
issues.review.show_resolved = Показване на решено
issues.review.hide_resolved = Скриване на решено
issues.review.resolve_conversation = Решаване на обсъждането
-diff.comment.markdown_info = Поддържа се стилизиране с markdown.
+diff.comment.markdown_info = Поддържа се стилизиране с Маркдаун.
diff.file_suppressed = Разликите не са показани, защото са твърде много
pulls.reject_count_n = %d поискани промени
settings.pulls.default_allow_edits_from_maintainers = Позволяване на редакции от поддържащите по подразбиране
@@ -1195,6 +1202,94 @@ issues.all_title = Общо
issues.new.assign_to_me = Възлагане на мен
ext_wiki = Външно уики
ext_issues = Външни задачи
+readme_helper = Изберете шаблон за файл README
+settings.event_pull_request_review_desc = Заявка за сливане е одобрена, отхвърлена или са добавени рецензионни коментари.
+settings.event_pull_request_review = Рецензии
+issues.filter_sort.relevance = Съответствие
+settings.confirm_wiki_branch_rename = Преименуване на клона на уикито
+settings.webhook.request = Заявка
+settings.webhook.response = Отговор
+settings.event_create = Създаване
+settings.event_push_only = Събития при изтласкване
+settings.event_delete = Изтриване
+settings.event_header_repository = Събития за хранилището
+settings.event_fork_desc = Хранилище е разклонено.
+settings.event_fork = Разклоняване
+settings.event_wiki_desc = Уики страница е създадена, преименувана, редактирана или изтрита.
+settings.event_issue_milestone = Етапи
+settings.event_pull_request_milestone_desc = Етап е добавен, премахнат или изменен.
+settings.event_pull_request_label_desc = Етикети на заявка за сливане са добавени или премахнати.
+settings.event_pull_request_merge = Сливане на заявка за сливане
+settings.archive.tagsettings_unavailable = Настройките за маркери не са налични в архивирани хранилища.
+settings.event_desc = Задействане при:
+settings.event_create_desc = Клон или маркер е създаден.
+generate_from = Генериране от
+settings.event_push_desc = Git изтласкване към хранилище.
+settings.event_package = Пакет
+settings.event_pull_request_label = Етикети
+settings.event_pull_request_assign_desc = Заявка за сливане е възложена или отвъзложена.
+settings.event_choose = Персонализирани събития…
+settings.event_header_issue = Събития при задачи
+fork_no_valid_owners = Това хранилище не може да бъде разклонено, защото няма валидни притежатели.
+settings.unarchive.text = Разархивирането на хранилище ще възстанови способността му да получава подавания и изтласквания, както и нови задачи и заявки за сливане.
+settings.archive.branchsettings_unavailable = Настройките за клонове не са налични в архивирани хранилища.
+settings.event_send_everything = Всички събития
+settings.event_pull_request_approvals = Одобрения на заявка за сливане
+release.invalid_external_url = Невалиден външен URL адрес: "%s"
+settings.event_delete_desc = Клон или маркер е изтрит.
+settings.discord_icon_url = URL адрес на иконка
+settings.discord_icon_url.exceeds_max_length = URL адресът на иконката трябва да е по-малък или равен на 2048 знака
+settings.event_push = Изтласкване
+settings.event_repository_desc = Хранилище е създадено или изтрито.
+settings.slack_icon_url = URL адрес на иконка
+settings.event_issue_comment = Коментари
+settings.event_pull_request_desc = Заявка за сливане е отворена, затворена, отворена наново или редактирана.
+settings.event_issue_comment_desc = Коментар на задача е създаден, редактиран или изтрит.
+settings.event_release_desc = Издание е публикувано, обновено или изтрито в хранилище.
+settings.event_pull_request_review_request = Искания за рецензия
+settings.event_pull_request_enforcement = Принудително изпълнение
+diff.git-notes.remove-header = Премахване на бележката
+diff.git-notes.add = Добавяне на бележка
+settings.event_pull_request_assign = Възлагане
+new_advanced_expand = Щракнете за разгъване
+new_advanced = Разширени настройки
+new_from_template = Използване на шаблон
+new_from_template_description = Можете да изберете съществуващо шаблонно хранилище в тази инстанция и да приложите неговите настройки.
+settings.event_pull_request_comment = Коментари
+repo_gitignore_helper_desc = Изберете кои файлове да не се проследяват от списък с шаблони за обичайните езици. Типичните артефакти, генерирани от инструментите за изграждане, са включени в .gitignore по подразбиране.
+object_format_helper = Формат на обектите на хранилището. Не може да се променя по-късно. SHA1 е най-съвместим.
+issues.num_reviews_one = %d рецензия
+settings.event_pull_request = Изменение
+settings.event_issue_label = Етикети
+settings.event_issue_assign = Възлагане
+settings.event_header_pull_request = Събития при заявка за сливане
+settings.event_issue_milestone_desc = Етап е добавен, премахнат или изменен.
+settings.event_issue_label_desc = Етикети на задача са добавени или премахнати.
+settings.event_issues_desc = Задача е отворена, затворена, отворена наново или редактирана.
+settings.webhook.headers = Заглавки
+settings.webhook.body = Тяло
+settings.event_pull_request_sync = Синхронизирано
+settings.event_pull_request_sync_desc = Клонът е обновен автоматично с целевия клон.
+settings.event_package_desc = Пакет е създаден или изтрит в хранилище.
+template_description = Шаблонните хранилища позволяват на потребителите да генерират нови хранилища със същата структура на директориите, файлове и опционални настройки.
+auto_init_description = Поставете началото на Git историята с README и по избор добавете файлове License и .gitignore.
+pulls.sign_in_require = Влезте , за да създадете нова заявка за сливане.
+issues.num_reviews_few = %d рецензии
+diff.git-notes.remove-body = Тази бележка ще бъде премахната.
+issues.review.add_remove_review_requests = поиска рецензии от %[1]s и премахна заявки за рецензия за %[2]s %[3]s
+form.name_pattern_not_allowed = Шаблонът "%s" не е разрешен в име на хранилище.
+settings.wiki_rename_branch_main_notices_2 = Това ще преименува перманентно вътрешния клон на уикито на хранилището %s. Съществуващите изтегляния ще трябва да бъдат обновени.
+settings.event_pull_request_milestone = Етапи
+settings.event_pull_request_comment_desc = Заявка за сливане е създадена, редактирана или изтрита.
+settings.event_issue_assign_desc = Задача е възложена или отвъзложена.
+settings.event_pull_request_review_request_desc = Рецензия на заявка за сливане е поискана или е премахната.
+generate_repo = Генериране на хранилище
+default_branch_helper = Стандартният клон е основния клон за заявки за сливане и подавания на код.
+issues.reaction.add = Добавяне на реакция
+issues.reaction.alt_few = %[1]s реагира с %[2]s.
+issues.reaction.alt_many = %[1]s и още %[2]d реагираха с %[3]s.
+issues.reaction.alt_add = Добавяне на реакция %[1]s към коментара.
+issues.reaction.alt_remove = Премахване на реакция %[1]s от коментара.
[modal]
confirm = Потвърждаване
@@ -1218,6 +1313,12 @@ buttons.italic.tooltip = Добавяне на курсив текст
buttons.link.tooltip = Добавяне на връзка
buttons.disable_monospace_font = Изключване на равноширокия шрифт
buttons.ref.tooltip = Препратка към задача или заявка за сливане
+table_modal.label.columns = Колони
+table_modal.label.rows = Редове
+table_modal.placeholder.content = Съдържание
+table_modal.placeholder.header = Заглавка
+buttons.new_table.tooltip = Добавяне на таблица
+table_modal.header = Добавяне на таблица
[org]
teams.write_access = Писане
@@ -1249,7 +1350,7 @@ settings.visibility.public = Публична
settings.visibility.limited_shortname = Ограничена
settings.visibility.private_shortname = Частна
settings.permission = Разрешения
-settings.visibility.limited = Ограничена (видима само за удостоверени потребители)
+settings.visibility.limited = Ограничена (видима само за влезли потребители)
settings.visibility.private = Частна (видима само за участниците в организацията)
org_name_helper = Имената на организациите е добре да са кратки и запомнящи се.
org_full_name_holder = Пълно име на организацията
@@ -1330,6 +1431,9 @@ err_empty_admin_email = Администраторският адрес на е
password_algorithm = Алгоритъм за хеш. на паролите
default_keep_email_private = Скриване на адресите на ел. поща по подразбиране
invalid_password_algorithm = Невалиден алгоритъм за хеш. на паролите
+err_admin_name_is_reserved = Потребителското име на администратора е невалидно, потребителското име е резервирано
+err_admin_name_pattern_not_allowed = Потребителското име на администратора е невалидно, потребителското име съответства с резервиран шаблон
+err_admin_name_is_invalid = Потребителското име на администратора е невалидно
[filter]
string.asc = А - Я
@@ -1361,6 +1465,14 @@ activate_account.text_1 = Здравейте, %[1]s , благодарим
activate_email.text = Моля, щракнете върху следната връзка, за да потвърдите своя адрес на ел. поща в рамките на %s :
activate_email = Потвърдете своя адрес на ел. поща
activate_account.text_2 = Моля, щракнете върху следната връзка, за да активирате своя акаунт в рамките на %s :
+issue_assigned.issue = @%[1]s ви възложи задача %[2]s в хранилище %[3]s.
+issue.action.push_n = @%[1]s изтласка %[3]d подавания към %[2]s
+issue.action.push_1 = @%[1]s изтласка %[3]d подаване към %[2]s
+repo.transfer.subject_to_you = %s иска да прехвърли хранилище "%s" към вас
+issue.action.merge = @%[1]s сля #%[2]d в %[3]s.
+issue_assigned.pull = @%[1]s ви възложи заявката за сливане %[2]s в хранилище %[3]s.
+issue.action.ready_for_review = @%[1]s отбеляза тази заявка за сливане като готова за рецензиране.
+repo.transfer.subject_to = %s иска да прехвърли хранилище "%s" към %s
[user]
joined_on = Присъединени на %s
@@ -1392,6 +1504,9 @@ followers.title.one = Последовател
following.title.one = Следван
following.title.few = Следвани
public_activity.visibility_hint.self_public = Вашата дейност е видима за всички, с изключение на взаимодействията в частни пространства. Конфигуриране .
+form.name_pattern_not_allowed = Шаблонът "%s" не е разрешен в потребителско име.
+form.name_reserved = Потребителското име "%s" е резервирано.
+public_activity.visibility_hint.self_private_profile = Вашата дейност е видима само за вас и администраторите на инстанцията, тъй като вашият профил е частен. Конфигуриране .
[home]
filter = Други филтри
@@ -1661,6 +1776,7 @@ variables.creation = Добавяне на променлива
variables.deletion.failed = Неуспешно премахване на променлива.
runners.task_list.repository = Хранилище
runners.description = Описание
+runs.no_workflows.help_no_write_access = За да научите повече за Forgejo Actions, вижте документацията .
[heatmap]
less = По-малко
diff --git a/options/locale/locale_ca.ini b/options/locale/locale_ca.ini
index ec8ae32668..4231a68e8a 100644
--- a/options/locale/locale_ca.ini
+++ b/options/locale/locale_ca.ini
@@ -1,10 +1,10 @@
[common]
-home = inici
+home = Inici
dashboard = Panell de control
explore = Explorar
help = Ajuda
logo = Logo
-sign_in = Entrar
+sign_in = Iniciar sessió
sign_in_with_provider = Entra amb %s
sign_in_or = o
sign_out = Sortir
@@ -15,7 +15,7 @@ page = Pàgina
template = Plantilla
language = Idioma
notifications = Notificacions
-active_stopwatch = Registre de Temps Actiu
+active_stopwatch = Registre de temps actiu
create_new = Crear…
user_profile_and_more = Perfil i Configuració…
signed_in_as = Entrat com
@@ -139,6 +139,13 @@ filter.is_archived = Arxivats
filter.not_archived = No arxivats
filter.not_fork = No és fork
filter.is_fork = Són forks
+copy_path = Copiar ruta
+new_repo.title = Nou repositori
+new_migrate.title = Nova migració
+new_org.title = Nova organització
+new_repo.link = Nou repositori
+new_migrate.link = Nova migració
+new_org.link = Nova organització
[search]
milestone_kind = Cerca fites...
@@ -166,6 +173,8 @@ pull_kind = Cerca "pulls"...
exact = Exacte
exact_tooltip = Inclou només resultats que són exactament el terme de cerca
issue_kind = Cerca problemes...
+regexp = Expressió regular
+regexp_tooltip = Interpreta el terme de cerca com una expressió regular
[heatmap]
number_of_contributions_in_the_last_12_months = %s contribucions en els últims 12 mesos
@@ -336,6 +345,71 @@ disable_register_mail = Registre amb confirmació per correu deshabilitat.
manual_activation_only = Contacti amb l'administrador de lloc per a completar l'activació.
remember_me = Recordar aquest dispositiu
create_new_account = Registrar compte
+reset_password = Recuperació del compte
+reset_password_wrong_user = Heu iniciat sessió com a %s, però l'enllaç de recuperació pertany a %s
+allow_password_change = Requereix a l'usuari canviar la contrasenya (recomanat)
+invalid_code_forgot_password = El codi de confirmació és invàlid o ha caducat. Feu click aquí per a iniciar una sessió nova.
+twofa_scratch_used = Ja heu utilitzat el vostre codi de recuperació. Se us ha redirigit a la pàgina de configuració de l'autenticació de doble factor per tal d'eliminar el dispositiu o generar un codi de recuperació nou.
+login_userpass = Entra
+oauth.signin.error.temporarily_unavailable = Ha fallat l'autorització perquè el servidor d'autenticació no està disponible temporalment. Intenteu-ho de nou més tard.
+authorization_failed_desc = Ha fallat l'autorització perquè s'ha detectat una sol·licitud invàlida. Si us plau, contacteu amb el responsable de l'aplicació que heu intentat autoritzar.
+authorization_failed = Ha fallat l'autorització
+last_admin = No podeu eliminar l'últim usuari administrador. Com a mínim n'hi ha d'haver un.
+password_pwned_err = No s'ha pogut completar la sol·licitud a HaveIBeenPwned
+forgot_password = Contrasenya oblidada?
+reset_password_mail_sent_prompt = S'ha enviat un correu electrònic de confirmació a %s . Per tal de completar el procés de recuperació del compte, reviseu la safata d'entrada i seguiu l'enllaç que se us ha enviat en els següents %s.
+prohibit_login = El compte està en suspensió
+resent_limit_prompt = Fa poc que heu sol·licitat un correu electrònic d'activació. Si us plau, espereu 3 minuts i torneu a intentar-ho.
+has_unconfirmed_mail = Hola %s, la vostra adreça de correu no s'ha confirmat (%s ). Si no heu rebut un correu de confirmació o necessiteu que l'enviem de nou, feu clic al botó següent.
+change_unconfirmed_email_summary = Canvieu l'adreça de correu on s'envia el correu d'activació.
+invalid_code = El codi de confirmació no és vàlid o ha caducat.
+invalid_password = La contrasenya no coincideix amb la que es va utilitzar per a crear el compte.
+reset_password_helper = Recuperar compte
+verify = Verificar
+unauthorized_credentials = Les credencials són incorrectes o han caducat. Torneu a executar l'ordre o visiteu %s per a més informació
+scratch_code = Codi de recuperació
+use_scratch_code = Utilitzar un codi de recuperació
+twofa_scratch_token_incorrect = El codi de recuperació és incorrecte.
+oauth_signup_title = Completar compte nou
+oauth_signup_submit = Completar compte
+oauth.signin.error.access_denied = S'ha denegat la sol·licitud d'autorització.
+openid_connect_submit = Connectar
+openid_connect_title = Entreu a un compte existent
+openid_register_title = Crear un compte nou
+authorize_application = Autoritzar aplicació
+authorize_redirect_notice = Sereu redirigits a %s si autoritzeu aquesta aplicació.
+authorize_application_description = Si li concediu l'accés podrà accedir i escriure a tota la informació del vostre compte, inclòs repositoris privats i organitzacions.
+authorize_title = Autoritzeu "%s" a accedir al vostre compte?
+active_your_account = Activeu el compte
+sign_up_successful = S'ha creat el compte correctament. Benvingut!
+account_activated = El compte s'ha activat
+send_reset_mail = Enviar correu electrònic de recuperació del compte
+password_too_short = La longitud de la contrasenya no pot ser inferior a %d caràcters.
+oauth_signin_title = Entreu per a autoritzar el compte vinculat
+oauth_signin_submit = Vincular compte
+disable_forgot_password_mail = La recuperació de comptes està deshabilitada perquè no hi ha configuració de correu electrònic. Si us plau, contacteu amb l'administrador del lloc.
+email_domain_blacklisted = No podeu registrar-vos amb el correu electrònic.
+hint_login = Ja tens compte? Entra ara!
+hint_register = Necessites un compte? Registra't ara.
+sign_up_button = Registra't ara.
+must_change_password = Actualitza la contrasenya
+change_unconfirmed_email_error = No s'ha pogut canviar l'adreça de correu: %v
+oauth_signup_tab = Registrar compte nou
+back_to_sign_in = Torneu a entrar
+openid_signin_desc = Introduïu la URI OpenID. Per exemple: alice.openid.example.org o https://openid.example.org/alice.
+authorize_application_created_by = Aquesta aplicació l'ha creat %s.
+password_pwned = La contrasenya que heu introduït es troba en una llista de contrasenyes robades exposades en dades filtrades públicament. Si us plau, intenteu-ho de nou amb una contrasenya diferent i considereu modificar aquesta contrasenya a tot arreu on la utilitzeu.
+use_onetime_code = Utilitzar un codi d'un sol ús
+forgot_password_title = Contrasenya oblidada
+confirmation_mail_sent_prompt = S'ha enviat un correu electrònic de confirmació a %s . Per tal de completar el registre, reviseu la safata d'entrada i seguiu l'enllaç que se us ha enviat en els següents %s. Si l'adreça de correu és incorrecta, podreu accedir al compte i demanar d'enviar un altre correu de confirmació a una altra adreça.
+prohibit_login_desc = S'ha suspès la interacció del vostre compte amb la instància. Contacteu amb l'administrador per a recuperar-ne l'accés.
+change_unconfirmed_email = Si heu proporcionat una direcció de correu incorrecta durant el registre, la podeu canviar aquí baix i se us enviarà una confirmació a l'adreça nova.
+resend_mail = Feu clic aquí per tornar a enviar el correu electrònic d'activació
+twofa_passcode_incorrect = El codi d'accés és incorrecte. Si heu perdut el dispositiu, useu el codi de recuperació per a entrar.
+oauth_signin_tab = Vincular a un compte existent
+oauth.signin.error = Hi ha hagut un error processant la sol·licitud d'autorització. Si persisteix, poseu-vos en contacte amb l'administrador del lloc.
+disable_forgot_password_mail_admin = La recuperació de comptes només està disponible quan s'ha configurat el correu electrònic. Si us plau, configureu el correu electrònic per a habilitar la recuperació de comptes.
+non_local_account = Els usuaris no locals no poden actualitzar la seva contrasenya mitjançant l'interfície web de Forgejo
[editor]
buttons.indent.tooltip = Aniua els elements un nivell
@@ -354,6 +428,12 @@ buttons.list.unordered.tooltip = Afegir un llista de punts
buttons.list.ordered.tooltip = Afegir una llista enumerada
buttons.list.task.tooltip = Afegir una llista de tasques
buttons.mention.tooltip = Mencionar un usuari o equip
+buttons.new_table.tooltip = Afegir taula
+table_modal.header = Afegir taula
+table_modal.placeholder.header = Capçalera
+table_modal.placeholder.content = Contingut
+table_modal.label.rows = Files
+table_modal.label.columns = Columnes
[home]
my_orgs = Organitzacions
@@ -381,4 +461,15 @@ filter = Altres filtres
footer.software = Sobre aquest software
footer.links = Enllaços
navbar = Barra de navegació
-footer = Peu de pàgina
\ No newline at end of file
+footer = Peu de pàgina
+
+[mail]
+hi_user_x = Hola %s ,
+view_it_on = Veure a %s
+link_not_working_do_paste = No funciona l'enllaç? Proveu a copiar-lo i enganxar-lo al navegador web.
+activate_account = Si us plau, activeu el compte
+reply = o responeu directament a aquest correu
+activate_account.text_1 = Hola %[1]s , gràcies per registrar-te a %[2]s!
+register_notify = Benvinguts a %s
+admin.new_user.text = Si us plau, cliqueu aui per administrar aquest usuari des del panell d'administració.
+admin.new_user.user_info = Informació d'usuari
\ No newline at end of file
diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini
index bd983164b2..2c47093cea 100644
--- a/options/locale/locale_cs-CZ.ini
+++ b/options/locale/locale_cs-CZ.ini
@@ -517,8 +517,8 @@ issue_assigned.issue=@%[1]s vás přiřadil/a k problému %[2]s v repozitáři %
issue.x_mentioned_you=@%s vás zmínil/a:
issue.action.force_push=%[1]s vynutil/a nahrání %[2]s z %[3]s do %[4]s.
-issue.action.push_1=@%[1]s nahrál/a %[3]d commit do %[2]s
-issue.action.push_n=@%[1]s nahrál/a %[3]d commity do %[2]s
+issue.action.push_1=Uživatel @%[1]s nahrál %[3]d revizi do %[2]s
+issue.action.push_n=Uživatel @%[1]s nahrál %[3]d revizí do %[2]s
issue.action.close=@%[1]s uzavřel/a #%[2]d.
issue.action.reopen=@%[1]s znovu otevřel/a #%[2]d.
issue.action.merge=@%[1]s sloučil/a #%[2]d do %[3]s.
@@ -590,9 +590,9 @@ AuthName=Název ověření
AdminEmail=E-mailová adresa správce
NewBranchName=Název nové větve
-CommitSummary=Shrnutí commity
-CommitMessage=Zpráva commitu
-CommitChoice=Výběr commitu
+CommitSummary=Shrnutí revize
+CommitMessage=Zpráva revize
+CommitChoice=Výběr revize
TreeName=Cesta k souboru
Content=Obsah
@@ -747,7 +747,7 @@ webauthn=Dvoufázové ověření (bezpečnostní klíče)
public_profile=Veřejný profil
biography_placeholder=Řekněte ostatním něco o sobě! (Je podporován Markdown)
location_placeholder=Sdílejte svou přibližnou polohu s ostatními
-profile_desc=Nastavte, jak bude váš profil zobrazen ostatním uživatelům. Vaše hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla a operace Git.
+profile_desc=O vás
password_username_disabled=Externí uživatelé nemohou měnit svoje uživatelské jméno. Kontaktujte prosím svého administrátora pro více detailů.
full_name=Celé jméno
website=Web
@@ -767,7 +767,7 @@ language=Jazyk
ui=Motiv vzhledu
hidden_comment_types=Skryté typy komentářů
hidden_comment_types_description=Zde zkontrolované typy komentářů nebudou zobrazeny na stránkách problémů. Zaškrtnutí „Štítek“ například odstraní všechny komentáře „ přidal/odstranil “.
-hidden_comment_types.ref_tooltip=Komentáře, kde byl tento problém odkázán u jiného problému/commitu/…
+hidden_comment_types.ref_tooltip=Komentáře, kde byl tento problém odkázán z jiného problému/revize/…
hidden_comment_types.issue_ref_tooltip=Komentáře, kde uživatel změní větev/značku spojenou s problémem
comment_type_group_reference=Reference
comment_type_group_label=Štítek
@@ -780,7 +780,7 @@ comment_type_group_deadline=Uzávěrka
comment_type_group_dependency=Závislost
comment_type_group_lock=Stav zámku
comment_type_group_review_request=Žádost o posouzení
-comment_type_group_pull_request_push=Přidané commity
+comment_type_group_pull_request_push=Přidané revize
comment_type_group_project=Projekt
comment_type_group_issue_ref=Referenční číslo problému
saved_successfully=Vaše nastavení bylo úspěšně uloženo.
@@ -822,7 +822,7 @@ activations_pending=Čekající aktivace
can_not_add_email_activations_pending=Existuje čekající aktivace, zkuste to znovu za pár minut, pokud chcete přidat nový e-mail.
delete_email=Smazat
email_deletion=Odstranit e-mailovou adresu
-email_deletion_desc=E-mailová adresa a přidružené informace budou z vašeho účtu odstraněny. Commity Gitu s touto e-mailovou adresou zůstanou nezměněny. Pokračovat?
+email_deletion_desc=E-mailová adresa a přidružené informace budou z vašeho účtu odstraněny. Revize Gitu s touto e-mailovou adresou zůstanou nezměněny. Pokračovat?
email_deletion_success=E-mailová adresa byla odstraněna.
theme_update_success=Váš motiv vzhledu byl aktualizován.
theme_update_error=Vybraný motiv vzhledu neexistuje.
@@ -838,16 +838,16 @@ add_email_success=Nová e-mailová adresa byla přidána.
email_preference_set_success=Nastavení e-mailu bylo úspěšně nastaveno.
add_openid_success=Nová OpenID adresa byla přidána.
keep_email_private=Skrýt e-mailovou adresu
-keep_email_private_popup=Tímto skryjete svou e-mailovou adresu ze svého profilu. Nebude již výchozí adresou pro commity provedené skrze webové rozhraní, jako nahrávání a úpravy souborů, a nebude použita pro slučovací commity. Místo toho můžete použít speciální adresu %s pro spojení commitů s vaším účtem. Změna této funkce nebude mít vliv na stávající commity.
+keep_email_private_popup=Vaše e-mailová adresa nebude zobrazena na vašem profilu a nebude výchozí adresou pro revize provedené skrze webové rozhraní, jako nahrávání, úpravy a slučování. Namísto toho lze použít speciální adresu %s pro propojení revizí s vaším účtem. Tato možnost neovlivní existující revize.
openid_desc=OpenID vám umožní delegovat ověřování na externího poskytovatele.
manage_ssh_keys=Správa klíčů SSH
manage_ssh_principals=Spravovat SSH Principal certifikáty
manage_gpg_keys=Správa klíčů GPG
add_key=Přidat klíč
-ssh_desc=Tyto veřejné klíče SSH jsou propojeny s vaším účtem. Odpovídající soukromé klíče umožní plný přístup k vašim repozitářům. Klíče SSH, které byly ověřeny, mohou být použity pro ověření Git commitů podepsaných přes SSH.
+ssh_desc=Tyto veřejné klíče SSH jsou propojeny s vaším účtem. Odpovídající soukromé klíče umožní plný přístup k vašim repozitářům. Klíče SSH, které byly ověřeny, mohou být použity pro ověření Git revizí podepsaných přes SSH.
principal_desc=Tyto SSH Principal certifikáty jsou přidruženy k vašemu účtu a umožňují plný přístup do vašich repozitářů.
-gpg_desc=Tyto veřejné klíče GPG jsou propojeny s vaším účtem a používají se k ověření vašich commitů. Uložte je na bezpečné místo, jelikož umožňují podepsat commity vaší identitou.
+gpg_desc=Tyto veřejné klíče GPG jsou propojeny s vaším účtem a používají se k ověření vašich revizí. Uložte je na bezpečné místo, jelikož umožňují podepsat revize vaší identitou.
ssh_helper=Potřebujete pomoct? Podívejte se do příručky, jak vytvořit vlastní klíče SSH nebo vyřešte běžné problémy , se kterými se můžete potkat při použití SSH.
gpg_helper=Potřebujete pomoct? Podívejte se do příručky o GPG .
add_new_key=Přidat klíč SSH
@@ -861,9 +861,9 @@ ssh_principal_been_used=Tento SSH Principal certifikát již byl přidán na ser
gpg_key_id_used=Veřejný GPG klíč se stejným ID již existuje.
gpg_no_key_email_found=Tento GPG klíč neodpovídá žádné aktivované e-mailové adrese spojené s vaším účtem. Může být stále přidán, pokud podepíšete zadaný token.
gpg_key_matched_identities=Odpovídající identity:
-gpg_key_matched_identities_long=Vložené identity v tomto klíči odpovídají následujícím aktivovaným e-mailovým adresám tohoto uživatele. Commity odpovídající těmto e-mailovým adresám lze ověřit pomocí tohoto klíče.
+gpg_key_matched_identities_long=Vložené identity v tomto klíči odpovídají následujícím aktivovaným e-mailovým adresám tohoto uživatele. Revize odpovídající těmto e-mailovým adresám lze ověřit pomocí tohoto klíče.
gpg_key_verified=Ověřený klíč
-gpg_key_verified_long=Klíč byl ověřen pomocí tokenu a může být použit k ověření commitů shodujících se s libovolnou aktivovanou e-mailovou adresou pro tohoto uživatele navíc k jakékoli odpovídající identitě tohoto klíče.
+gpg_key_verified_long=Klíč byl ověřen pomocí tokenu a může být použit k ověření revizí shodujících se s libovolnou aktivovanou e-mailovou adresou pro tohoto uživatele navíc k jakékoli odpovídající identitě tohoto klíče.
gpg_key_verify=Ověřit
gpg_invalid_token_signature=Zadaný GPG klíč, podpis a token se neshodují nebo je token zastaralý.
gpg_token_required=Musíte zadat podpis pro níže uvedený token
@@ -874,7 +874,7 @@ gpg_token_signature=Zakódovaný podpis GPG
key_signature_gpg_placeholder=Začíná textem „-----BEGIN PGP SIGNATURE-----“
verify_gpg_key_success=GPG klíč „%s“ byl ověřen.
ssh_key_verified=Ověřený klíč
-ssh_key_verified_long=Klíč byl ověřen pomocí tokenu a může být použit k ověření commitů shodujících se s libovolnou vaší aktivovanou e-mailovou adresou pro tohoto uživatele.
+ssh_key_verified_long=Klíč byl ověřen pomocí tokenu a může být použit k ověření revizí shodujících se s libovolnou vaší aktivovanou e-mailovou adresou pro tohoto uživatele.
ssh_key_verify=Ověřit
ssh_invalid_token_signature=Zadaný SSH klíč, podpis nebo token se neshodují nebo je token zastaralý.
ssh_token_required=Musíte zadat podpis pro níže uvedený token
@@ -896,7 +896,7 @@ ssh_key_deletion=Odebrat klíč SSH
gpg_key_deletion=Odebrat klíč GPG
ssh_principal_deletion=Odstranit SSH Principal certifikát
ssh_key_deletion_desc=Odstranění SSH klíče zruší jeho přístup k vašemu účtu. Pokračovat?
-gpg_key_deletion_desc=Odstraněním klíče GPG zneplatníte ověření commitů, které jsou jím podepsány. Pokračovat?
+gpg_key_deletion_desc=Odstraněním klíče GPG zneplatníte ověření revizí, které jsou jím podepsány. Pokračovat?
ssh_principal_deletion_desc=Odstranění SSH Principal certifikátu zruší jeho přístup k vašemu účtu. Pokračovat?
ssh_key_deletion_success=SSH klíč byl odstraněn.
gpg_key_deletion_success=GPG klíč byl odstraněn.
@@ -914,7 +914,7 @@ principal_state_desc=Tento SSH Principal certifikát byl použit během posledn
show_openid=Zobrazit na profilu
hide_openid=Odstranit z profilu
ssh_disabled=SSH je zakázáno
-ssh_signonly=SSH je v současné době zakázáno, proto jsou tyto klíče použity pouze pro ověření podpisu.
+ssh_signonly=SSH je v současné době zakázáno, proto jsou tyto klíče použity pouze pro ověření podpisu revizí.
ssh_externally_managed=Tento SSH klíč je spravován externě pro tohoto uživatele
manage_social=Správa propojených účtů sociálních sítí
social_desc=Tyto účty sociálních sítí lze použít k přihlášení k vašemu účtu. Ujistěte se, že jsou všechny vaše.
@@ -966,7 +966,7 @@ oauth2_client_secret_hint=Tajný klíč se znovu nezobrazí po opuštění nebo
oauth2_application_edit=Upravit
oauth2_application_create_description=Aplikace OAuth2 poskytují přístup vašim aplikacím třetích stran k uživatelským účtům na této instanci.
oauth2_application_remove_description=Odebráním OAuth2 aplikace zabrání přístupu ověřeným uživatelům na této instanci. Pokračovat?
-oauth2_application_locked=Gitea předregistruje některé OAuth2 aplikace při spuštění, pokud je to povoleno v konfiguraci. Aby se zabránilo neočekávanému chování, nelze je upravovat ani odstranit. Více informací naleznete v dokumentaci OAuth2.
+oauth2_application_locked=Forgejo předem zaregistruje některé OAuth2 aplikace při spuštění, pokud je to povoleno v konfiguraci. Aby se zabránilo neočekávanému chování, nelze je upravovat ani odstranit. Více informací naleznete v dokumentaci OAuth2.
authorized_oauth2_applications=Autorizované aplikace OAuth2
authorized_oauth2_applications_description=Těmto aplikacím třetích stran jste udělili přístup ke svému osobnímu účtu Forgejo. Zrušte prosím přístup aplikacím, které již nejsou používány.
@@ -1010,7 +1010,7 @@ remove_account_link=Odstranit propojený účet
remove_account_link_desc=Odstraněním propojeného účtu zrušíte jeho přístup k vašemu Forgejo účtu. Pokračovat?
remove_account_link_success=Propojený účet byl odstraněn.
-hooks.desc=Přidat webhooky, které budou spouštěny pro všechny repozitáře vve vašem vlastnictví.
+hooks.desc=Přidejte webhooky, které budou spouštěny pro všechny repozitáře ve vašem vlastnictví.
orgs_none=Nejste členem žádné organizace.
repos_none=Nevlastníte žádné repozitáře.
@@ -1054,6 +1054,8 @@ language.title = Výchozí jazyk
keep_activity_private.description = Vaše veřejná aktivita bude viditelná pouze vám a správcům instance.
language.description = Tento jazyk bude uložen do vašeho účtu a po přihlášení bude použit jako výchozí.
language.localization_project = Pomozte nám s překladem Forgejo do vašeho jazyka! Více informací .
+user_block_yourself = Nemůžete zablokovat sami sebe.
+pronouns_custom_label = Vlastní zájmena
[repo]
new_repo_helper=Repozitář obsahuje všechny soubory projektu, včetně historie revizí. Už jej hostujete jinde? Migrovat repozitář .
@@ -1102,7 +1104,7 @@ object_format_helper = Objektový formát repozitáře. Později jej nelze změn
readme=README
readme_helper=Vyberte šablonu souboru README
readme_helper_desc=Do tohoto místa můžete zadat celý popis vašeho projektu.
-auto_init=Inicializovat repozitář (přidá soubory .gitignore, License a README)
+auto_init=Inicializovat repozitář
trust_model_helper=Vyberte model důvěry pro ověření podpisu. Možnosti jsou:
trust_model_helper_collaborator=Spolupracovník: Důvěřovat podpisům spolupracovníků
trust_model_helper_committer=Přispěvatel: Důvěřovat podpisům, které se shodují s přispěvateli
@@ -1111,12 +1113,12 @@ trust_model_helper_default=Výchozí: Použít výchozí model důvěry pro tuto
create_repo=Vytvořit repozitář
default_branch=Výchozí větev
default_branch_label=výchozí
-default_branch_helper=Výchozí větev je základní větev pro žádosti o sloučení a commity kódu.
+default_branch_helper=Výchozí větev je základní větev pro žádosti o sloučení a revize kódu.
mirror_prune=Vyčistit
mirror_prune_desc=Odstranit zastaralé reference na vzdálené sledování
mirror_interval=Interval zrcadlení (platné časové jednotky jsou „h“, „m“ a „s“). Nastavením na 0 zakážete periodickou synchronizaci. (Minimální interval: %s)
mirror_interval_invalid=Interval zrcadlení není platný.
-mirror_sync_on_commit=Synchronizovat při nahrávání commitů
+mirror_sync_on_commit=Synchronizovat při nahrávání revizí
mirror_address=Klonovat z URL
mirror_address_desc=Zadejte požadované přístupové údaje do sekce Ověření.
mirror_address_url_invalid=Poskytnutá URL je neplatná. Všechny části musíte správně nahradit escape sekvencí.
@@ -1149,7 +1151,7 @@ blame_prior=Zobrazit blame před touto změnou
blame.ignore_revs.failed=Nepodařilo se ignorovat revize v .git-blame-ignore-revs .
author_search_tooltip=Zobrazí maximálně 30 uživatelů
-tree_path_not_found_commit=Cesta %[1]s v commitu %[2]s neexistuje
+tree_path_not_found_commit=Cesta %[1]s v revizi %[2]s neexistuje
tree_path_not_found_branch=Cesta %[1]s ve větvi %[2]s neexistuje
tree_path_not_found_tag=Cesta %[1]s ve značce %[2]s neexistuje
@@ -1265,7 +1267,7 @@ empty_message=Tento repozitář nemá žádný obsah.
broken_message=Data gitu, která jsou základem tohoto repozitáře, nelze číst. Kontaktujte správce této instance nebo smažte tento repositář.
code=Zdrojový kód
-code.desc=Přístup ke zdrojovým kódům, souborům, commitům a větvím.
+code.desc=Přístup ke zdrojovým kódům, souborům, revizím a větvím.
branch=Větev
tree=Strom
clear_ref=Vymazat aktuální referenci
@@ -1283,8 +1285,8 @@ org_labels_desc=Štítky na úrovni organizace, které mohou být použity se %[1]s.
-editor.create_new_branch=Vytvořit novou větev pro tento commit a vytvořit žádost o sloučení.
-editor.create_new_branch_np=Vytvořte novou větev z tohoto commitu.
+editor.create_new_branch=Vytvořit novou větev pro tuto revizi a vytvořit žádost o sloučení.
+editor.create_new_branch_np=Vytvořit novou větev z této revize.
editor.propose_file_change=Navrhnout změnu souboru
-editor.new_branch_name=Pojmenujte novou větev pro tento commit
+editor.new_branch_name=Pojmenujte novou větev pro tuto revizi
editor.new_branch_name_desc=Název nové větve…
editor.cancel=Zrušit
editor.filename_cannot_be_empty=Jméno nemůže být prázdné.
@@ -1378,7 +1380,7 @@ editor.file_is_a_symlink=`„%s“ je symbolický odkaz. Symbolické odkazy nemo
editor.filename_is_a_directory=Jméno souboru „%s“ je již použito jako jméno adresáře v tomto repozitáři.
editor.file_editing_no_longer_exists=Upravovaný soubor „%s“ již není součástí tohoto repozitáře.
editor.file_deleting_no_longer_exists=Odstraňovaný soubor „%s“ již není součástí tohoto repozitáře.
-editor.file_changed_while_editing=Obsah souboru se od zahájení úprav změnil. Klikněte sem pro jejich zobrazení nebo proveďte commit změn ještě jednou pro jejich přepsání.
+editor.file_changed_while_editing=Obsah souboru se od zahájení úprav změnil. Klikněte sem pro jeho zobrazení nebo odešlete změny ještě jednou pro jeho přepsání.
editor.file_already_exists=Soubor „%s“ již existuje v tomto repozitáři.
editor.commit_empty_file_header=Odeslat prázdný soubor
editor.commit_empty_file_text=Soubor, který se chystáte odeslat, je prázdný. Pokračovat?
@@ -1392,16 +1394,16 @@ editor.add_subdir=Přidat adresář…
editor.unable_to_upload_files=Nepodařilo se nahrát soubory do „%s“. Chyba: %v
editor.upload_file_is_locked=Soubor „%s“ je uzamčen uživatelem %s.
editor.upload_files_to_dir=Nahrány soubory do „%s“
-editor.cannot_commit_to_protected_branch=Nelze vytvořit commit v chráněné větvi „%s“.
+editor.cannot_commit_to_protected_branch=Nelze vytvořit revizi v chráněné větvi „%s“.
editor.no_commit_to_branch=Nepodařilo se odeslat přímo do větve:
editor.user_no_push_to_branch=Uživatel nemůže nahrávat do větve
-editor.require_signed_commit=Větev vyžaduje podepsaný commit
+editor.require_signed_commit=Větev vyžaduje podepsanou revizi
editor.cherry_pick=Cherry-pick %s na:
editor.revert=Vrátit %s na:
commits.desc=Procházet historii změn zdrojového kódu.
-commits.commits=Commity
-commits.no_commits=Žádné společné commity. „%s“ a „%s“ mají zcela odlišnou historii.
+commits.commits=Revize
+commits.no_commits=Žádné společné revize. „%s“ a „%s“ mají zcela odlišnou historii.
commits.nothing_to_compare=Tyto větve jsou stejné.
commits.search=Hledání commitů…
commits.search.tooltip=Můžete předřadit klíčová slova s „author:“, „committer:“, „after:“ nebo „before:“, např. „revert author:Alice before:2019-01-03“.
@@ -1414,21 +1416,21 @@ commits.older=Starší
commits.newer=Novější
commits.signed_by=Podepsáno
commits.signed_by_untrusted_user=Podepsáno nedůvěryhodným uživatelem
-commits.signed_by_untrusted_user_unmatched=Podepsáno nedůvěryhodným uživatelem, který nesouhlasí s přispěvatelem
+commits.signed_by_untrusted_user_unmatched=Podepsáno nedůvěryhodným uživatelem, který neodpovídá přispěvateli
commits.gpg_key_id=ID klíče GPG
commits.ssh_key_fingerprint=Otisk klíče SSH
-commits.view_path=Zobrazit v tomto bodě v historii
+commits.view_path=Zobrazit tento bod v historii
commit.operations=Operace
commit.revert=Vrátit
commit.revert-header=Vrátit: %s
-commit.revert-content=Vyberte větev pro návrat na:
+commit.revert-content=Vyberte větev pro návrat:
commit.cherry-pick=Cherry-pick
commit.cherry-pick-header=Cherry-pick: %s
-commit.cherry-pick-content=Vyberte větev pro Cherry-pick na:
+commit.cherry-pick-content=Vyberte větev pro Cherry-pick:
commitstatus.error=Chyba
-commitstatus.failure=Chyba
+commitstatus.failure=Selhání
commitstatus.pending=Čekající
commitstatus.success=Úspěch
@@ -1611,15 +1613,15 @@ issues.context.edit=Upravit
issues.context.delete=Smazat
issues.no_content=K dispozici není žádný popis.
issues.close=Zavřít problém
-issues.comment_pull_merged_at=sloučený commit %[1]s do %[2]s %[3]s
-issues.comment_manually_pull_merged_at=ručně sloučený commit %[1]s do %[2]s %[3]s
+issues.comment_pull_merged_at=sloučena revize %[1]s do %[2]s %[3]s
+issues.comment_manually_pull_merged_at=ručně sloučena revize %[1]s do %[2]s %[3]s
issues.close_comment_issue=Zavřít s komentářem
issues.reopen_issue=Znovu otevřít
issues.reopen_comment_issue=Znovu otevřít s komentářem
issues.create_comment=Okomentovat
issues.closed_at=`uzavřel/a tento problém %[2]s `
issues.reopened_at=`znovu otevřel/a tento problém %[2]s `
-issues.commit_ref_at=`odkázal/a na tento problém z commitu %[2]s `
+issues.commit_ref_at=`odkázal/a na tento problém z revize %[2]s `
issues.ref_issue_from=`odkázal/a na tento problém %[4]s %[2]s `
issues.ref_pull_from=`odkázal/a na tuto žádost o sloučení %[4]s %[2]s `
issues.ref_closing_from=`odkazoval/a na tento problém ze žádosti o sloučení %[4]s, která jej uzavře , %[2]s `
@@ -1725,8 +1727,8 @@ issues.due_date=Termín dokončení
issues.invalid_due_date_format=Termín dokončení musí být ve formátu „rrrr-mm-dd“.
issues.error_modifying_due_date=Změna termínu dokončení selhala.
issues.error_removing_due_date=Odstranění termínu dokončení selhalo.
-issues.push_commit_1=přidal/a %d commit %s
-issues.push_commits_n=přidal/a %d commity %s
+issues.push_commit_1=přidal/a %d revizi %s
+issues.push_commits_n=přidal/a %d revize %s
issues.force_push_codes=`vynucené nahrání %[1]s od %[2]s
do %[4]s
%[6]s`
issues.force_push_compare=Porovnat
issues.due_date_form=rrrr-mm-dd
@@ -1831,13 +1833,13 @@ pulls.switch_comparison_type=Přepnout typ porovnání
pulls.switch_head_and_base=Prohodit hlavní a základní větev
pulls.filter_branch=Filtrovat větev
pulls.no_results=Nebyly nalezeny žádné výsledky.
-pulls.show_all_commits=Zobrazit všechny commity
+pulls.show_all_commits=Zobrazit všechny revize
pulls.show_changes_since_your_last_review=Zobrazit změny od vašeho posledního posouzení
-pulls.showing_only_single_commit=Zobrazuji pouze změny commitu %[1]s
+pulls.showing_only_single_commit=Zobrazuji pouze změny revize %[1]s
pulls.showing_specified_commit_range=Zobrazují se pouze změny mezi %[1]s..%[2]s
-pulls.select_commit_hold_shift_for_range=Vyberte commit. Podržte klávesu shift + klepněte pro výběr rozsahu
+pulls.select_commit_hold_shift_for_range=Vyberte revizi. Podržte klávesu Shift a klikněte pro výběr rozsahu
pulls.review_only_possible_for_full_diff=Posouzení je možné pouze při zobrazení plného rozlišení
-pulls.filter_changes_by_commit=Filtrovat podle commitu
+pulls.filter_changes_by_commit=Filtrovat podle revize
pulls.nothing_to_compare=Tyto větve jsou stejné. Není třeba vytvářet žádost o sloučení.
pulls.nothing_to_compare_have_tag = Vybraná větev a značka jsou shodné.
pulls.nothing_to_compare_and_allow_empty_pr=Tyto větve jsou stejné. Tato žádost o sloučení bude prázdná.
@@ -1847,7 +1849,7 @@ pulls.title_desc_few=chce sloučit %[1]d commity z větve %[2]s
do
pulls.merged_title_desc_few=sloučil %[1]d commity z větve %[2]s
do větve %[3]s
před %[4]s
pulls.change_target_branch_at=`změnil/a cílovou větev z %s na %s %s`
pulls.tab_conversation=Konverzace
-pulls.tab_commits=Commity
+pulls.tab_commits=Revize
pulls.tab_files=Změněné soubory
pulls.reopen_to_merge=Otevřete znovu tuto žádost pro provedení sloučení.
pulls.cant_reopen_deleted_branch=Tuto žádost o sloučení nelze znovu otevřít, protože větev byla smazána.
@@ -1866,7 +1868,7 @@ pulls.data_broken=Tato žádost o sloučení je rozbitá kvůli chybějícím in
pulls.files_conflicted=Tato žádost o sloučení obsahuje změny, které jsou v rozporu s cílovou větví.
pulls.is_checking=Právě probíhá kontrola konfliktů při sloučení. Zkuste to za chvíli.
pulls.is_ancestor=Tato větev je již součástí cílové větve. Není co sloučit.
-pulls.is_empty=Změny na této větvi jsou již na cílové větvi. Toto bude prázdný commit.
+pulls.is_empty=Změny na této větvi se již nacházejí na cílové větvi. Tato revize bude prázdná.
pulls.required_status_check_failed=Některé požadované kontroly nebyly úspěšné.
pulls.required_status_check_missing=Některé požadované kontroly chybí.
pulls.required_status_check_administrator=Jako administrátor stále můžete sloučit tuto žádost.
@@ -1887,25 +1889,25 @@ pulls.reject_count_1=%d žádost o změnu
pulls.reject_count_n=%d žádostí o změnu
pulls.waiting_count_1=%d čekající posouzení
pulls.waiting_count_n=%d čekajících posouzení
-pulls.wrong_commit_id=id commitu musí být id commitu v cílové větvi
+pulls.wrong_commit_id=id revize musí být id revize v cílové větvi
pulls.no_merge_desc=Tato žádost nemůže být sloučena, protože všechny možnosti repozitáře na sloučení jsou zakázány.
pulls.no_merge_helper=Povolte možnosti sloučení v nastavení repozitáře nebo proveďte sloučení žádosti ručně.
pulls.no_merge_wip=Tato žádost nemůže být sloučena, protože je označena jako rozpracovaná.
pulls.no_merge_not_ready=Tento žádost není připravena na sloučení, zkontrolujte stav posouzení a kontroly stavu.
pulls.no_merge_access=Nemáte oprávnění sloučit tuto žádost.
-pulls.merge_pull_request=Vytvořit slučovací commit
+pulls.merge_pull_request=Vytvořit slučovací revizi
pulls.rebase_merge_pull_request=Rebase pak fast-forward
-pulls.rebase_merge_commit_pull_request=Rebase a poté vytvořit slučovací commit
-pulls.squash_merge_pull_request=Vytvořit squash commit
+pulls.rebase_merge_commit_pull_request=Provést rebase a poté vytvořit slučovací revizi
+pulls.squash_merge_pull_request=Vytvořit squash revizi
pulls.merge_manually=Sloučeno ručně
-pulls.merge_commit_id=ID slučovacího commitu
-pulls.require_signed_wont_sign=Větev vyžaduje podepsané commity, ale toto sloučení nebude podepsáno
+pulls.merge_commit_id=ID slučovací revize
+pulls.require_signed_wont_sign=Větev vyžaduje podepsané revize, ale toto sloučení nebude podepsáno
pulls.invalid_merge_option=Pro tuto žádost nemůžete použít tuto možnost sloučení.
pulls.merge_conflict=Sloučení selhalo: při slučování došlo ke konfliktu. Tip: zkuste jinou strategii
pulls.merge_conflict_summary=Chybové hlášení
-pulls.rebase_conflict=Sloučení selhalo: došlo ke konfliktu při rebase commitu: %[1]s. Tip: zkuste jinou strategii
+pulls.rebase_conflict=Sloučení selhalo: došlo ke konfliktu při provádění rebase revize %[1]s. Tip: zkuste jinou strategii
pulls.rebase_conflict_summary=Chybové hlášení
pulls.unrelated_histories=Sloučení selhalo: hlava a základ revize nesdílí společnou historii. Tip: zkuste jinou strategii
pulls.merge_out_of_date=Sloučení selhalo: základ byl aktualizován při generování sloučení. Tip: zkuste to znovu.
@@ -1935,7 +1937,7 @@ pulls.reopened_at=`znovu otevřel/a tuto žádost o sloučení dokumentace . Příklady: main, release/**
settings.protect_patterns=Vzory
@@ -2457,11 +2459,11 @@ settings.block_on_official_review_requests=Blokovat sloučení při oficiální
settings.block_on_official_review_requests_desc=Slučování nebude možné, pokud mají oficiální požadavek na posouzení, i když mají k dispozici dostatek schválení.
settings.block_outdated_branch=Blokovat sloučení, pokud je požadavek na natažení zastaralý
settings.block_outdated_branch_desc=Slučování nebude možné, pokud je hlavní větev za základní větví.
-settings.default_branch_desc=Vybrat výchozí větev repozitáře pro požadavky na natažení a revize kódu:
+settings.default_branch_desc=Vybrat výchozí větev repozitáře pro žádosti o sloučení a příspěvky kódu:
settings.merge_style_desc=Sloučit styly
settings.default_merge_style_desc=Výchozí styl sloučení
settings.choose_branch=Vyberte větev…
-settings.no_protected_branch=Nejsou tu žádné chráněné větve.
+settings.no_protected_branch=Nemáte žádné chráněné větve.
settings.edit_protected_branch=Upravit
settings.protected_branch_required_rule_name=Požadovaný název pravidla
settings.protected_branch_duplicate_rule_name=Již existuje pravidlo pro tuto sadu větví
@@ -2484,7 +2486,7 @@ settings.matrix.room_id=ID místnosti
settings.matrix.message_type=Typ zprávy
settings.archive.button=Archivovat repozitář
settings.archive.header=Archivovat tento repozitář
-settings.archive.text = Archivováním repozitáře jej celý převedete do stavu pouze pro čtení. Bude skryt z nástěnky. Nikdo (ani vy!) nebude moci vytvářet nové commity ani otevírat problémy a žádosti o sloučení.
+settings.archive.text = Archivováním repozitáře jej celý převedete do stavu pouze pro čtení. Bude skryt z nástěnky. Nikdo (ani vy!) nebude moci vytvářet nové revize ani otevírat problémy a žádosti o sloučení.
settings.archive.success=Repozitář byl úspěšně archivován.
settings.archive.error=Nastala chyba při archivování repozitáře. Prohlédněte si záznam pro více detailů.
settings.archive.error_ismirror=Nemůžete archivovat zrcadlený repozitář.
@@ -2492,7 +2494,7 @@ settings.archive.branchsettings_unavailable=Nastavení větví není v archivova
settings.archive.tagsettings_unavailable=Nastavení značek nejsou v archivovaných repozitářích k dispozici.
settings.unarchive.button=Zrušit archivaci repozitáře
settings.unarchive.header=Obnovit tento repozitář
-settings.unarchive.text=Obnovení repozitáře vrátí možnost přijímání commitů a nahrávání. Stejně tak se obnoví i možnost vytváření nových problémů a žádostí o sloučení.
+settings.unarchive.text=Obnovení repozitáře vrátí možnost přijímání revizí a nahrávání. Stejně tak se obnoví i možnost vytváření nových problémů a žádostí o sloučení.
settings.unarchive.success=Repozitář byl úspěšně obnoven.
settings.unarchive.error=Nastala chyba při obnovování repozitáře. Prohlédněte si záznam pro více detailů.
settings.update_avatar_success=Avatar repozitáře byl aktualizován.
@@ -2500,7 +2502,7 @@ settings.lfs=LFS
settings.lfs_filelist=LFS soubory uložené v tomto repozitáři
settings.lfs_no_lfs_files=V tomto repozitáři nejsou uloženy žádné LFS soubory
settings.lfs_findcommits=Najít revize
-settings.lfs_lfs_file_no_commits=Pro tento soubor LFS nebyly nalezeny žádné commity
+settings.lfs_lfs_file_no_commits=Pro tento soubor LFS nebyly nalezeny žádné revize
settings.lfs_noattribute=Tato cesta nemá uzamykatelný atribut ve výchozí větvi
settings.lfs_delete=Odstranit LFS soubor s OID %s
settings.lfs_delete_warning=Odstranění souboru LFS může při kontrole způsobit chybu „objekt neexistuje“. Jste si jisti?
@@ -2576,7 +2578,7 @@ diff.review.approve=Schválit
diff.review.self_reject=Autoři požadavků na natažení nemohou požadovat změny na svém vlastním požadavku na natažení
diff.review.reject=Požadovat změny
diff.review.self_approve=Autoři požadavku na natažení nemohou schválit svůj vlastní požadavek na natažení
-diff.committed_by=odevzdal
+diff.committed_by=autor:
diff.protected=Chráněno
diff.image.side_by_side=Vedle sebe
diff.image.swipe=Posunout
@@ -2618,7 +2620,7 @@ release.edit_release=Aktualizovat vydání
release.delete_release=Smazat vydání
release.delete_tag=Smazat značku
release.deletion=Smazat vydání
-release.deletion_desc=Smazání vydání jej pouze odebere z Gitea. Nebude to mít vliv na značku Git, obsah vašeho repozitáře nebo jeho historii. Pokračovat?
+release.deletion_desc=Smazáním vydání jej pouze odeberete z Forgeja. Nebude to mít vliv na značku Gitu, obsah vašeho repozitáře nebo jeho historii. Pokračovat?
release.deletion_success=Vydání bylo odstraněno.
release.deletion_tag_desc=Odstraní tuto značku z repozitáře. Obsah repozitáře a historie zůstanou nezměněny. Pokračovat?
release.deletion_tag_success=Značka byla odstraněna.
@@ -2641,7 +2643,7 @@ branch.delete_html=Odstranit větev
branch.delete_desc=Smazání větve je trvalé. Přestože zrušená větev může existovat i po krátkou dobu, než bude skutečně odstraněna, NELZE ji většinou vrátit. Pokračovat?
branch.deletion_success=Větev „%s“ byla smazána.
branch.deletion_failed=Nepodařilo se odstranit větev „%s“.
-branch.delete_branch_has_new_commits=Větev „%s“ nemůže být smazána, protože byly přidány nové commity po sloučení.
+branch.delete_branch_has_new_commits=Větev „%s“ nelze odstranit, protože byly po sloučení přidány nové revize.
branch.create_branch=Vytvořit větev %s
branch.create_from=z „%s“
branch.create_success=Větev „%s“ byla vytvořena.
@@ -2708,12 +2710,12 @@ mirror_sync = synchronizováno
blame.ignore_revs = Ignorování revizí v souboru .git-blame-ignore-revs . Klikněte sem pro udělení výjimky a zobrazení normálního přehledu blame.
commits.browse_further = Procházet dále
issues.role.first_time_contributor = První přispěvatel
-editor.invalid_commit_mail = Neplatný e-mail pro vytvoření commitu.
+editor.invalid_commit_mail = Neplatný e-mail pro vytvoření revize.
commits.renamed_from = Přejmenováno z %s
-activity.navbar.recent_commits = Nedávné commity
+activity.navbar.recent_commits = Nedávné revize
settings.units.units = Jednotky
pulls.blocked_by_user = V tomto repozitáři nemůžete vytvořit žádost o sloučení, protože jste byli zablokováni jeho majitelem.
-pulls.clear_merge_message_hint = Vymazáním zprávy o sloučení pouze odstraníte obsah zprávy commitu a ponecháte vygenerované git trailery, jako „Co-Authored-By …“.
+pulls.clear_merge_message_hint = Vymazáním zprávy o sloučení pouze odstraníte obsah zprávy revize a ponecháte vygenerované git trailery, jako „Co-Authored-By …“.
pulls.agit_explanation = Vytvořeno pomocí workflow AGit. AGit umožňuje přispěvatelům navrhovat změny pomocí „git push“ bez vytváření forku nebo nové větve.
contributors.contribution_type.deletions = Odstranění
settings.pull_mirror_sync_in_progress = Probíhá načítání změn ze vzdáleného %s.
@@ -2722,7 +2724,7 @@ settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = Tuto ak
settings.new_owner_blocked_doer = Nový majitel vás zablokoval.
settings.mirror_settings.pushed_repository = Odeslaný repozitář
settings.add_collaborator_blocked_our = Nepodařilo se přidat spolupracovníka, jelikož byl zablokován majitelem repozitáře.
-pulls.commit_ref_at = `se odkázal na tuto žádost o sloučení z commitu %[2]s `
+pulls.commit_ref_at = `se odkázal/a na tuto žádost o sloučení z revize %[2]s `
settings.wiki_rename_branch_main = Normalizovat název větve Wiki
settings.wiki_rename_branch_main_desc = Přejmenovat větev interně používanou pro Wiki na „%s“. Tato změna je trvalá a nelze ji vrátit.
pulls.fast_forward_only_merge_pull_request = Pouze zrychlené
@@ -2746,24 +2748,24 @@ settings.add_collaborator_blocked_them = Nepodařilo se přidat spolupracovníka
settings.ignore_stale_approvals = Ignorovat zastaralá schválení
settings.event_pull_request_merge = Sloučení žádosti o sloučení
settings.event_pull_request_approvals = Schválení žádostí o sloučení
-settings.ignore_stale_approvals_desc = Nepočítat schválení udělená u starších commitů (zastaralá schválení) do celkového počtu schválení u ŽS. Není relevantní, pokud byla zastaralá schválení již zrušena.
+settings.ignore_stale_approvals_desc = Nepočítat schválení udělená u starších revizí (zastaralá schválení) do celkového počtu schválení u žádosti o sloučení. Není relevantní, pokud byla zastaralá schválení již zrušena.
file_follow = Následovat symbolický odkaz
settings.protect_status_check_patterns_desc = Zadejte vzorce pro upřesnění kontrol, které musí projít před sloučením větví do větve, která se shoduje s tímto pravidlem. Na každý řádek zadejte jeden vzorec. Vzorce nesmí být prázdné.
settings.archive.mirrors_unavailable = Zrcadla nejsou v archivovaných repozitářích k dispozici.
settings.protect_enable_merge_desc = Kdokoli s přístupem k zápisu bude moci slučovat žádosti o sloučení do této větve.
settings.event_pull_request_review_request_desc = Bylo požádáno o posouzení žádosti o sloučení nebo bylo toto požádání odstraněno.
-error.broken_git_hook = Zdá se, že u tohoto repozitáře jsou rozbité Git hooks. Pro jejich opravení se prosím řiďte pokyny v dokumentaci a poté odešlete několik commitů pro obnovení stavu.
+error.broken_git_hook = Zdá se, že u tohoto repozitáře jsou rozbité Git webhooky. Pro jejich opravení se prosím řiďte pokyny v dokumentaci a poté odešlete pár revizí pro obnovení stavu.
pulls.title_desc_one = žádá o sloučení %[1]d commitu z %[2]s
do %[3]s
pulls.merged_title_desc_one = sloučil %[1]d commit z %[2]s
do %[3]s
%[4]s
open_with_editor = Otevřít pomocí %s
commits.search_branch = Tato větev
-editor.commit_id_not_matching = Tento soubor se během úpravy změnil. Proveďte commit do nové větve a poté je slučte.
+editor.commit_id_not_matching = Tento soubor se během úpravy změnil. Odešlete změny do nové větve a poté je slučte.
pulls.ready_for_review = Připraveni na posouzení?
settings.rename_branch_failed_protected = Nepodařilo se přejmenovat větev %s, jelikož se jedná o chráněnou větev.
editor.push_out_of_date = Push je nejspíše zastaralý.
stars = Oblíbení
-n_commit_one = %s commit
-n_commit_few = %s commitů
+n_commit_one = %s revize
+n_commit_few = %s revizí
n_branch_one = %s větev
n_tag_one = %s značka
n_tag_few = %s značek
@@ -2809,7 +2811,7 @@ subscribe.issue.guest.tooltip = Přihlaste se pro odebírání tohoto problému.
subscribe.pull.guest.tooltip = Přihlaste se pro odebírání této žádosti o sloučení.
issues.author.tooltip.pr = Tento uživatel je autorem této žádosti o sloučení.
issues.author.tooltip.issue = Tento uživatel je autorem tohoto problému.
-activity.commit = Aktivita commitů
+activity.commit = Aktivita revizí
milestones.filter_sort.name = Název
release.type_attachment = Příloha
release.type_external_asset = Externí příloha
@@ -2849,13 +2851,28 @@ issues.num_reviews_one = %d kontrola
issues.num_reviews_few = %d kontrol
issues.summary_card_alt = Souhrn problému s názvem „%s“ v repozitáři %s
editor.add_tmpl.filename = nazevsouboru
+settings.default_update_style_desc = Výchozí způsob aktualizací používaný pro aktualizace žádostí o sloučení, které jsou pozadu oproti základní větvi.
+pulls.sign_in_require = Přihlaste se pro vytvoření nové žádosti o sloučení.
+new_from_template = Použít šablonu
+new_from_template_description = Můžete si vybrat existující šablonu repozitáře na této instanci a použít její nastavení.
+new_advanced = Pokročilá nastavení
+new_advanced_expand = Klikněte pro rozbalení
+auto_init_description = Vytvořit historii Gitu se souborem README a volitelně přidat soubory License a .gitignore.
+summary_card_alt = Karta se souhrnem repozitáře %s
+issues.reaction.alt_many = Uživatel %[1]s a %[2]d dalších zareagovali s %[3]s.
+release.summary_card_alt = Karta souhrnu vydání s názvem „%s“ v repozitáři %s
+issues.reaction.add = Přidat reakci
+issues.reaction.alt_few = Uživatel %[1]s zareagoval pomocí %[2]s.
+issues.context.menu = Nabídka komentáře
+issues.reaction.alt_remove = Odstranit %[1]s reakci z komentáře.
+issues.reaction.alt_add = Přidat %[1]s reakci na komentář.
[graphs]
component_loading_info = Tohle může chvíli trvat…
component_failed_to_load = Došlo k neočekávané chybě.
code_frequency.what = frekvence kódu
contributors.what = příspěvky
-recent_commits.what = nedávné commity
+recent_commits.what = nedávné revize
component_loading = Načítání %s...
component_loading_failed = Nepodařilo se načíst %s
@@ -3003,7 +3020,7 @@ last_page=Poslední
total=Celkem: %d
settings=Nastavení správce
-dashboard.new_version_hint=Gitea %s je nyní k dispozici, právě u vás běži %s. Podívej se na blogu pro více informací.
+dashboard.new_version_hint=Forgejo %s je nyní k dispozici, aktuálně používáte verzi %s. Pro více informací viz blog .
dashboard.statistic=Souhrn
dashboard.operations=Operace údržby
dashboard.system_status=Stav systému
@@ -3516,7 +3533,7 @@ self_check.database_collation_mismatch=Očekávejte, že databáze použije coll
self_check.database_inconsistent_collation_columns=Databáze používá collation %s, ale tyto sloupce používají chybné collation. To může způsobit neočekávané problémy.
self_check.database_fix_mysql=Pro uživatele MySQL/MariaDB můžete použít příkaz „forgejo doctor convert“, který opraví problémy s porovnáním. Problém také můžete ručně vyřešit příkazem „ALTER ... COLLATE ...“ SQL.
self_check = Vlastní kontrola
-self_check.database_collation_case_insensitive=Databáze používá collation %s, což je collation nerozlišující velká a malá písmena. Ačkoli s ní Gitea může pracovat, mohou se vyskytnout vzácné případy, kdy nebude fungovat podle očekávání.
+self_check.database_collation_case_insensitive=Databáze používá collation %s, což je collation nerozlišující velká a malá písmena. Ačkoli s ní Forgejo může pracovat, mohou se vyskytnout vzácné případy, kdy nebude fungovat podle očekávání.
auths.oauth2_map_group_to_team = Zmapovat zabrané skupiny u týmů organizací (volitelné - vyžaduje název claimu výše)
monitor.queue.settings.desc = Pooly dynamicky rostou podle blokování fronty jejich workerů.
@@ -3541,6 +3558,7 @@ emails.delete = Odstranit e-mail
emails.delete_desc = Opravdu chcete odstranit tuto e-mailovou adresu?
emails.deletion_success = E-mailová adresa byla odstraněna.
emails.delete_primary_email_error = Nemůžete odstranit primární e-mail.
+monitor.duration = Trvání (s)
[action]
create_repo=vytvořil/a repozitář %s
@@ -3563,7 +3581,7 @@ delete_branch=smazal/a větev %[2]s z %[3]s
compare_branch=Porovnat
compare_commits=Porovnat %d revizí
compare_commits_general=Porovnat revize
-mirror_sync_push=synchronizoval/a commity do %[3]s v %[4]s ze zrcadla
+mirror_sync_push=synchronizoval/a revize do %[3]s v %[4]s ze zrcadla
mirror_sync_create=synchronizoval/a novou referenci %[3]s do %[4]s ze zrcadla
mirror_sync_delete=synchronizoval/a a smazal/a referenci %[2]s
v %[3]s ze zrcadla
approve_pull_request=`schválil/a %[3]s#%[2]s `
@@ -3618,13 +3636,13 @@ no_subscriptions=Žádné odběry
[gpg]
default_key=Podepsáno výchozím klíčem
error.extract_sign=Selhalo získání podpisu
-error.generate_hash=Selhalo vygenerování hash revize
+error.generate_hash=Selhalo vygenerování hashe revize
error.no_committer_account=Žádný účet není propojen s e-mailovou adresou přispěvatele
error.no_gpg_keys_found=V databázi nebyl nalezen žádný známý klíč pro tento podpis
-error.not_signed_commit=Nepodepsaný commit
+error.not_signed_commit=Nepodepsaná revize
error.failed_retrieval_gpg_keys=Nepodařilo se získat žádný klíč propojený s účtem přispěvatele
-error.probable_bad_signature=VAROVÁNÍ! Přestože v databázi existuje klíč s tímto ID, tento commit neověřuje! Tento commit je PODEZŘELÝ.
-error.probable_bad_default_signature=VAROVÁNÍ! Ačkoli výchozí klíč má toto ID, neověřuje tento commit! Tento commit je PODEZŘELÝ.
+error.probable_bad_signature=VAROVÁNÍ! Přestože v databázi existuje klíč s tímto ID, tato revize jím není ověřena! Tato revize je PODEZŘELÁ.
+error.probable_bad_default_signature=VAROVÁNÍ! Přestože má výchozí klíč toto ID, tato revize jím není ověřena! Tato revize je PODEZŘELÁ.
[units]
unit=Jednotka
@@ -3801,6 +3819,14 @@ arch.version.conflicts = Konflikty
arch.version.replaces = Nahrazuje
arch.version.backup = Záloha
container.images.title = Obrázky
+search_in_external_registry = Hledat v %s
+alt.install = Instalovat balíček
+alt.setup = Přidejte repozitář do seznamu připojených repozitářů (místo „_arch_“ zvolte potřebnou architekturu):
+alt.repository = Informace o repozitáři
+alt.repository.architectures = Architektury
+alt.repository.multiple_groups = Tento balíček je dostupný v několika skupinách.
+alt.registry = Nastavit tento registr z příkazové řádky:
+alt.registry.install = Pro instalaci balíčku spusťte následující příkaz:
[secrets]
secrets=Tajné klíče
@@ -3846,7 +3872,7 @@ runners.task_list.no_tasks=Zatím zde nejsou žádné úlohy.
runners.task_list.run=Spustit
runners.task_list.status=Status
runners.task_list.repository=Repozitář
-runners.task_list.commit=Commit
+runners.task_list.commit=Revize
runners.task_list.done_at=Dokončeno v
runners.edit_runner=Upravit Runner
runners.update_runner=Aktualizovat změny
@@ -3866,7 +3892,7 @@ runners.reset_registration_token=Resetovat registrační token
runners.reset_registration_token_success=Registrační token runneru byl úspěšně obnoven
runs.all_workflows=Všechny workflowy
-runs.commit=Commit
+runs.commit=Revize
runs.scheduled=Naplánováno
runs.invalid_workflow_helper=Konfigurační soubor pracovního postupu je neplatný. Zkontrolujte prosím konfigurační soubor: %s
runs.no_matching_online_runner_helper=Žádný odpovídající online runner s popiskem: %s
@@ -3879,7 +3905,7 @@ runs.no_workflows=Zatím neexistují žádné pracovní postupy.
runs.no_workflows.quick_start = Nevíte jak začít s Gitea Action? Podívejte se na průvodce rychlým startem .
runs.no_workflows.documentation = Další informace o Gitea Action, viz dokumentace .
runs.no_runs=Pracovní postup zatím nebyl spuštěn.
-runs.empty_commit_message=(prázdná zpráva commitu)
+runs.empty_commit_message=(prázdná zpráva revize)
workflow.disable=Zakázat workflow
workflow.disable_success=Workflow „%s“ byl úspěšně deaktivován.
@@ -3952,7 +3978,7 @@ code_kind = Hledat kód...
package_kind = Hledat balíčky...
project_kind = Hledat projekty...
branch_kind = Hledat větve...
-commit_kind = Hledat commity...
+commit_kind = Hledat revize...
runner_kind = Hledat runnery...
no_results = Nenalezeny žádné odpovídající výsledky.
fuzzy_tooltip = Zahrnout také výsledky, které úzce odpovídají hledanému výrazu
diff --git a/options/locale/locale_da.ini b/options/locale/locale_da.ini
new file mode 100644
index 0000000000..2df385460b
--- /dev/null
+++ b/options/locale/locale_da.ini
@@ -0,0 +1,1769 @@
+
+
+
+[common]
+home = Hjem
+dashboard = Instrumentpanel
+explore = Udforsk
+help = Hjælp
+logo = Logo
+sign_in = Login
+sign_in_with_provider = Login med %s
+sign_in_or = eller
+sign_out = Logud
+sign_up = Register
+return_to_forgejo = Vend tilbage til Forgejo
+new_repo.title = Ny repository
+retry = Prøv igen
+link_account = Link konto
+register = Register
+powered_by = Baseret på %s
+version = Version
+create_new = Opret…
+user_profile_and_more = Profil og indstillinger…
+page = Side
+template = Skabelon
+language = Sprog
+notifications = Notifikationer
+active_stopwatch = Aktiv tidsregistrering
+enable_javascript = Dette websted kræver JavaScript.
+toc = Indholdsfortegnelse
+licenses = Licenser
+more_items = Flere genstande
+username = Brugernavn
+email = E-mailadresse
+password = Adgangskode
+access_token = Adgangstoken
+re_type = Bekræft adgangskode
+captcha = CAPTCHA
+twofa = To-faktor autentificering
+twofa_scratch = To-faktor skrabekode
+webauthn_sign_in = Tryk på knappen på din sikkerhedsnøgle. Hvis din sikkerhedsnøgle ikke har nogen knap, skal du indsætte den igen.
+webauthn_use_twofa = Brug en tofaktorkode fra din telefon
+webauthn_error = Kunne ikke læse din sikkerhedsnøgle.
+webauthn_unsupported_browser = Din browser understøtter i øjeblikket ikke WebAuthn.
+webauthn_error_unknown = Der opstod en ukendt fejl. Prøv venligst igen.
+webauthn_error_unable_to_process = Serveren kunne ikke behandle din anmodning.
+webauthn_error_duplicated = Sikkerhedsnøglen er ikke tilladt for denne anmodning. Sørg for, at nøglen ikke allerede er registreret.
+webauthn_error_empty = Du skal angive et navn for denne nøgle.
+organization = Organisation
+mirror = Mirror
+new_mirror = Ny mirror
+new_fork = Ny repository fork
+new_project = Nyt projekt
+new_project_column = Ny kolonne
+admin_panel = Side administration
+settings = Indstillinger
+your_profile = Profil
+your_starred = Stjernemarkeret
+your_settings = Indstillinger
+passcode = Passcode
+repository = Repository
+new_org.title = Ny organisation
+new_repo.link = Nyt repository
+new_migrate.link = Ny migration
+new_org.link = Ny organisation
+all = Alle
+sources = Kilder
+mirrors = Mirrors
+collaborative = Samarbejdende
+forks = Forks
+activities = Aktiviteter
+pull_requests = Pull anmodninger
+issues = Problemer
+milestones = Milepæle
+ok = OK
+cancel = Annuller
+rerun = Kør igen
+rerun_all = Kør alle jobs igen
+save = Gem
+add = Tilføj
+add_all = Tilføj alle
+remove = Slet
+remove_all = Slet alle
+remove_label_str = Slet genstand "%s"
+edit = Redigere
+view = Se
+test = Test
+disabled = Deaktiveret
+copy = Kopiér
+copy_generic = Kopiér til udklipsholder
+copy_url = Kopiér URL
+copy_path = Kopiér sti
+copy_content = Kopier indhold
+copy_branch = Kopiér branch navn
+copy_success = Kopieret!
+copy_error = Kopiering mislykkedes
+write = Skriv
+preview = Forhåndsvisning
+loading = Indlæser…
+error = Fejl
+error413 = Du har opbrugt din kvote.
+go_back = Gå tilbage
+never = Aldrig
+unknown = Ukendt
+rss_feed = RSS feed
+pin = Pin
+unpin = Frigør
+artifacts = Artefakter
+archived = Arkiveret
+concept_system_global = Global
+concept_user_individual = Individuel
+concept_code_repository = Repository
+concept_user_organization = Organisation
+show_timestamps = Vis tidsstempler
+show_log_seconds = Vis sekunder
+tracked_time_summary = Opsummering af sporet tid baseret på filtre af problemliste
+signed_in_as = Logget ind som
+webauthn_error_insecure = WebAuthn understøtter kun sikre forbindelser. Til test over HTTP kan du bruge oprindelsen "localhost" eller "127.0.0.1"
+invalid_data = Ugyldige data: %v
+webauthn_insert_key = Indsæt din sikkerhedsnøgle
+webauthn_press_button = Tryk venligst på knappen på din sikkerhedsnøgle…
+webauthn_error_timeout = Timeout nået, før din nøgle kunne læses. Genindlæs denne side og prøv igen.
+enabled = Aktiveret
+locked = Låst
+copy_hash = Kopiér hash
+error404 = Den side, du forsøger at nå, enten findes ikke eller du er ikke autoriseret til at se den.
+confirm_delete_artifact = Er du sikker på, at du vil slette artefakten "%s"?
+new_migrate.title = Ny migration
+copy_type_unsupported = Denne filtype kan ikke kopieres
+toggle_menu = TIl/Fra menu
+show_full_screen = Vis fuld skærm
+download_logs = Download logs
+confirm_delete_selected = Bekræft at slette alle valgte genstande?
+name = Navn
+value = Værdi
+filter = Filter
+filter.clear = Ryd filtre
+filter.is_archived = Arkiveret
+filter.not_archived = Ikke arkiveret
+filter.is_fork = Forks
+filter.not_fork = Ikke forks
+filter.is_mirror = Mirrors
+filter.not_mirror = Ikke mirrors
+filter.is_template = Skabeloner
+filter.not_template = Ikke skabeloner
+filter.public = Offentlig
+filter.private = Privat
+
+[search]
+search = Søg...
+type_tooltip = Søge type
+fuzzy = Fuzzy
+fuzzy_tooltip = Medtag resultater, der også matcher søgeordet tæt
+union = Almindelig
+union_tooltip = Inkluder resultater, der matcher et hvilket som helst af de mellemrumsadskilte søgeord
+exact = Nøjagtig
+exact_tooltip = Medtag kun resultater, der matcher den nøjagtige søgeterm
+regexp = RegExp
+regexp_tooltip = Fortolk søgetermen som et regulært udtryk
+org_kind = Søg i organisationer...
+team_kind = Søg efter hold...
+code_kind = Søg kode...
+code_search_by_git_grep = Aktuelle kodesøgeresultater leveres af "git grep". Der kan være bedre resultater, hvis webstedsadministratoren aktiverer kodeindeksering.
+package_kind = Søg pakker...
+project_kind = Søg efter projekter...
+commit_kind = Søg commits...
+branch_kind = Søg branches...
+runner_kind = Søg runners...
+issue_kind = Søg i problemer...
+milestone_kind = Søg milepæle...
+pull_kind = Søg pulls...
+repo_kind = Søg depoter...
+code_search_unavailable = Kodesøgning er ikke tilgængelig i øjeblikket. Kontakt venligst webstedets administrator.
+no_results = Ingen matchende resultater fundet.
+user_kind = Søg brugere...
+keyword_search_unavailable = Søgning efter nøgleord er ikke tilgængelig i øjeblikket. Kontakt venligst webstedets administrator.
+
+[aria]
+navbar = Navigationslinje
+footer = Sidefod
+footer.software = Omkring dette software
+footer.links = Links
+
+[heatmap]
+number_of_contributions_in_the_last_12_months = %s bidrag inden for de sidste 12 måneder
+contributions_zero = Ingen bidrag
+contributions_format = {contributions} på {month} {day}, {year}
+contributions_one = bidrag
+contributions_few = bidragene
+less = Mindre
+more = Mere
+
+[editor]
+buttons.heading.tooltip = Tilføj overskrift
+buttons.bold.tooltip = Tilføj fed tekst
+buttons.italic.tooltip = Tilføj kursiv tekst
+buttons.quote.tooltip = Citat tekst
+buttons.code.tooltip = Tilføj kode
+buttons.link.tooltip = Tilføj et link
+buttons.list.unordered.tooltip = Tilføj en punktliste
+buttons.list.task.tooltip = Tilføj en liste over opgaver
+buttons.list.ordered.tooltip = Tilføj en nummereret liste
+buttons.mention.tooltip = Nævn en bruger eller et hold
+buttons.ref.tooltip = Henvis til et problem eller pull-anmodning
+buttons.enable_monospace_font = Aktiver monospace-skrifttype
+buttons.disable_monospace_font = Deaktiver monospace-skrifttype
+buttons.new_table.tooltip = Tilføj tabel
+table_modal.header = Tilføj tabel
+table_modal.placeholder.header = Hoved
+table_modal.placeholder.content = Indhold
+table_modal.label.rows = Rækker
+table_modal.label.columns = Kolonner
+buttons.unindent.tooltip = Udsortere genstande med ét niveau
+buttons.indent.tooltip = Indlejring af genstande med ét niveau
+buttons.switch_to_legacy.tooltip = Brug den gamle editor i stedet
+
+[filter]
+string.asc = A - Z
+string.desc = Z - A
+
+[error]
+occurred = Der opstod en fejl
+not_found = Målet kunne ikke findes.
+network_error = Netværksfejl
+server_internal = Intern serverfejl
+report_message = Hvis du mener, at dette er en Forgejo-fejl, skal du søge efter problemer på Codeberg eller åbne et nyt problem, hvis det er nødvendigt.
+
+[startpage]
+app_desc = En smertefri, selv-hostet Git-tjeneste
+install = Nem at installere
+platform = På tværs af platforme
+platform_desc = Det er bekræftet, at Forgejo kører på frie operativsystemer som Linux og FreeBSD, samt forskellige CPU-arkitekturer. Vælg den du elsker!
+lightweight = Letvægtig
+lightweight_desc = Forgejo har lave minimale krav og kan køre på en billig Raspberry Pi. Spar din maskines energi!
+license = Åben kildekode
+license_desc = Få Forgejo ! Slut dig til os ved at bidrage til at gøre dette projekt endnu bedre. Vær ikke genert over at være en bidragyder!
+install_desc = Du skal blot køre binæren for din platform, send den med Docker , eller få det pakket .
+
+[install]
+install = Installation
+title = Indledende konfiguration
+docker_helper = Hvis du kører Forgejo inde i Docker, skal du læse dokumentationen , før du ændrer nogen indstillinger.
+require_db_desc = Forgejo kræver MySQL, PostgreSQL, SQLite3 eller TiDB (MySQL-protokol).
+db_title = Database indstillinger
+db_type = Database type
+host = Vært
+user = Brugernavn
+password = Adgangskode
+db_name = Database navn
+db_schema = Schema
+db_schema_helper = Lad stå tom for databasestandard ("offentlig").
+ssl_mode = SSL
+reinstall_error = Du forsøger at installere i en eksisterende Forgejo-database
+reinstall_confirm_check_1 = Dataene krypteret af SECRET_KEY i app.ini kan gå tabt: brugere kan muligvis ikke logge ind med 2FA/OTP, og mirrors fungerer muligvis ikke korrekt. Ved at markere dette felt bekræfter du, at den aktuelle app.ini-fil indeholder den korrekte SECRET_KEY.
+reinstall_confirm_check_3 = Du bekræfter, at du er helt sikker på, at denne Forgejo kører med den korrekte app.ini placering, og at du er sikker på, at du skal gen-installere. Du bekræfter, at du anerkender ovenstående risici.
+err_empty_db_path = SQLite3-databasestien må ikke være tom.
+no_admin_and_disable_registration = Du kan ikke deaktivere brugerens selvregistrering uden at oprette en administratorkonto.
+err_empty_admin_password = Administratoradgangskoden må ikke være tom.
+err_empty_admin_email = Administrator-e-mailen må ikke være tom.
+err_admin_name_is_reserved = Administratorbrugernavnet er ugyldigt, brugernavnet er reserveret
+err_admin_name_pattern_not_allowed = Administratorbrugernavnet er ugyldigt, brugernavnet matcher et reserveret mønster
+err_admin_name_is_invalid = Administratorbrugernavnet er ugyldigt
+general_title = Generelle indstillinger
+app_name = Instans titel
+app_slogan_helper = Indtast dit instans slogan her. Lad være tom for at deaktivere.
+lfs_path_helper = Filer sporet af Git LFS vil blive gemt i denne mappe. Lad være tom for at deaktivere.
+run_user = Bruger at køre som
+lfs_path = Git LFS rodsti
+repo_path = Depot rodsti
+domain = Server domæne
+domain_helper = Domæne eller værtsadresse for serveren.
+ssh_port = SSH server port
+ssh_port_helper = Portnummer, der vil blive brugt af SSH-serveren. Lad være tomt for at deaktivere SSH-serveren.
+http_port = HTTP lytte port
+http_port_helper = Portnummer, der vil blive brugt af Forgejo-webserveren.
+app_url = Base URL
+log_root_path = Log sti
+log_root_path_helper = Logfiler vil blive skrevet til denne mappe.
+optional_title = Valgfrie indstillinger
+email_title = E-mail-indstillinger
+smtp_addr = SMTP vært
+smtp_port = SMTP port
+smtp_from = Send e-mail som
+smtp_from_invalid = "Send e-mail som"-adressen er ugyldig
+mailer_user = SMTP brugernavn
+mailer_password = SMTP adgangskode
+register_confirm = Kræv e-mail-bekræftelse for at registrere
+mail_notify = Aktiver e-mailmeddelelser
+server_service_title = Server- og tredjeparts tjenesteindstillinger
+offline_mode = Aktiver lokal tilstand
+disable_gravatar = Deaktiver Gravatar
+disable_gravatar.description = Deaktiver brug af Gravatar eller andre tredjeparts avatar kilder. Standardbilleder vil blive brugt til bruger avatarer, medmindre de uploader deres egen avatar til instansen.
+federated_avatar_lookup = Aktiver fødererede avatarer
+federated_avatar_lookup.description = Slå avatarer op ved hjælp af Libravatar.
+disable_registration = Deaktiver selvregistrering
+allow_only_external_registration = Tillad kun registrering via eksterne tjenester
+allow_only_external_registration.description = Brugere vil kun være i stand til at oprette nye konti ved at bruge konfigurerede eksterne tjenester.
+openid_signin = Aktiver OpenID-logon
+openid_signin.description = Tillad brugere at logge ind via OpenID.
+app_slogan = Instans slogan
+repo_path_helper = Fjerne Git depoter vil blive gemt i denne mappe.
+smtp_from_helper = E-mailadresse Forgejo vil bruge. Indtast en almindelig e-mailadresse, eller brug formatet "Navn" .
+run_user_helper = Operativsystemets brugernavn, som Forgejo kører som. Bemærk, at denne bruger skal have adgang til depotets rodsti.
+app_name_helper = Indtast dit instans-navn her. Det vil blive vist på hver side.
+offline_mode.description = Deaktiver tredjeparts indholdsleverings netværk og server alle ressourcer lokalt.
+disable_registration.description = Kun instans administratoren vil være i stand til at oprette nye brugerkonti. Det anbefales stærkt at holde registreringen deaktiveret, medmindre du har til hensigt at være vært for en offentlig instans for alle og klar til at håndtere store mængder spamkonti.
+openid_signup = Aktiver OpenID-selvregistrering
+sqlite_helper = Filsti til SQLite3-databasen. Indtast en absolut sti, hvis du kører Forgejo som en tjeneste.
+path = Sti
+reinstall_confirm_message = Geninstallation med en eksisterende Forgejo-database kan forårsage flere problemer. I de fleste tilfælde bør du bruge din eksisterende "app.ini" til at køre Forgejo. Hvis du ved, hvad du laver, skal du bekræfte følgende:
+reinstall_confirm_check_2 = Depoterne og indstillingerne skal muligvis synkroniseres igen. Ved at markere dette felt bekræfter du, at du vil re-synkronisere hooks for depoter og authorized_keys-filen manuelt. Du bekræfter, at du vil sikre dig, at indstillingerne for depoter og mirror er korrekte.
+app_url_helper = Base adresse for HTTP(S)-klone-URL'er og e-mail-meddelelser.
+enable_captcha = Aktiver registrering CAPTCHA
+enable_captcha.description = Kræv brugere at bestå CAPTCHA for at oprette konti.
+require_sign_in_view = Kræv at logge ind for at se instansindhold
+default_keep_email_private = Skjul e-mailadresser som standard
+default_keep_email_private.description = Aktiver skjulning af e-mail-adresser for nye brugere som standard, så disse oplysninger ikke lækkes umiddelbart efter tilmelding.
+default_allow_create_organization = Tillad oprettelse af organisationer som standard
+default_enable_timetracking = Aktiver tidsregistrering som standard
+default_enable_timetracking.description = Tillad som standard brug af tidssporings-funktion for nye depoter.
+admin_title = Indstillinger for administratorkonto
+admin_setting.description = Det er valgfrit at oprette en administratorkonto. Den første registrerede bruger bliver automatisk administrator.
+admin_name = Administrator brugernavn
+admin_password = Adgangskode
+confirm_password = Bekræft adgangskode
+admin_email = E-mailadresse
+config_location_hint = Disse konfigurationsmuligheder vil blive gemt i:
+install_btn_confirm = Installer Forgejo
+invalid_db_setting = Databaseindstillingerne er ugyldige: %v
+invalid_db_table = Databasetabellen "%s" er ugyldig: %v
+invalid_repo_path = Depotets rodsti er ugyldig: %v
+invalid_app_data_path = Appens datasti er ugyldig: %v
+run_user_not_match = Brugernavnet som "bruger det skal køres som" er ikke det aktuelle brugernavn: %s -> %s
+internal_token_failed = Kunne ikke generere intern token: %v
+secret_key_failed = Kunne ikke generere hemmelig nøgle: %v
+save_config_failed = Konfigurationen kunne ikke gemmes: %v
+invalid_admin_setting = Administratorkonto indstillingen er ugyldig: %v
+invalid_log_root_path = Log stien er ugyldig: %v
+allow_dots_in_usernames = Tillad brugere at bruge prikker i deres brugernavne. Påvirker ikke eksisterende konti.
+no_reply_address = Skjult e-mail-domæne
+invalid_password_algorithm = Ugyldig hash-algoritme for adgangskode
+enable_update_checker = Aktiver opdateringskontrol
+env_config_keys = Miljøkonfiguration
+env_config_keys_prompt = Følgende miljøvariabler vil også blive anvendt på din konfigurationsfil:
+test_git_failed = Kunne ikke teste "git" kommandoen: %v
+sqlite3_not_available = Denne Forgejo-version understøtter ikke SQLite3. Download venligst den officielle binære version fra %s (ikke "gobuild"-versionen).
+no_reply_address_helper = Domænenavn til brugere med en skjult e-mailadresse. For eksempel vil brugernavnet "joe" blive logget i Git som "joe@noreply.example.org", hvis det skjulte e-mail-domæne er sat til "noreply.example.org".
+require_sign_in_view.description = Begræns indholdsadgang til ind-loggede brugere. Gæster vil kun kunne besøge autentificerings sider..
+default_allow_create_organization.description = Tillad nye brugere at oprette organisationer som standard. Når denne mulighed er deaktiveret, skal en administrator give tilladelse til at oprette organisationer til nye brugere.
+password_algorithm = Adgangskode hash algoritme
+enable_update_checker_helper_forgejo = Den vil med jævne mellemrum tjekke for nye Forgejo versioner ved at tjekke en TXT DNS-posten på release.forgejo.org.
+password_algorithm_helper = Indstil adgangskode-hash-algoritmen. Algoritmer har forskellige krav og styrke. Argon2-algoritmen er ret sikker, men bruger meget hukommelse og kan være upassende til små systemer.
+openid_signup.description = Tillad brugere at oprette konti via OpenID, hvis selvregistrering er aktiveret.
+
+[home]
+uname_holder = Brugernavn eller e-mailadresse
+switch_dashboard_context = Skift instrumentpanel-kontekst
+my_repos = Depoter
+my_orgs = Organisationer
+view_home = Se %s
+filter = Andre filtre
+filter_by_team_repositories = Filtrer efter holddepoter
+feed_of = Feed af "%s"
+show_archived = Arkiveret
+show_both_archived_unarchived = Viser både arkiveret og ikke-arkiveret
+show_only_archived = Viser kun arkiverede
+show_only_unarchived = Viser kun ikke-arkiveret
+show_private = Privat
+show_only_private = Viser kun privat
+show_only_public = Viser kun offentligt
+issues.in_your_repos = I dine depoter
+show_both_private_public = Viser både offentlige og private
+
+[explore]
+repos = Depoter
+users = Brugere
+stars_one = %d stjerne
+stars_few = %d stjerner
+forks_one = %d fork
+forks_few = %d forks
+organizations = Organisationer
+code = Kode
+code_last_indexed_at = Sidst indekseret %s
+relevant_repositories = Kun relevante depoter vises, vis ufiltrerede resultater .
+go_to = Gå til
+relevant_repositories_tooltip = Depoter som er forks, eller som ikke har noget emne, intet ikon og ingen beskrivelse, er skjult.
+
+[auth]
+create_new_account = Registrer konto
+disable_register_prompt = Registrering er deaktiveret. Kontakt venligst din side-administrator.
+disable_register_mail = E-mailbekræftelse for registrering er deaktiveret.
+manual_activation_only = Kontakt din side-administrator for at fuldføre aktiveringen.
+remember_me = Husk denne enhed
+forgot_password_title = Glemt adgangskode
+forgot_password = Glemt adgangskode?
+hint_register = Har du brug for en konto? Registrer dig nu.
+sign_up_button = Registrer nu.
+sign_up_successful = Kontoen blev oprettet. Velkommen!
+must_change_password = Opdater din adgangskode
+allow_password_change = Kræv, at brugeren ændrer adgangskode (anbefales)
+reset_password_mail_sent_prompt = En bekræftelses-e-mail er blevet sendt til %s . For at fuldføre kontogendannelses-processen skal du tjekke din indbakke og følge det medfølgende link inden for de næste %s.
+active_your_account = Aktiver din konto
+account_activated = Kontoen er blevet aktiveret
+prohibit_login = Kontoen er suspenderet
+prohibit_login_desc = Din konto er blevet suspenderet fra interaktion med instansen. Kontakt instans-administratoren for at få adgang igen.
+change_unconfirmed_email_summary = Skift den e-mailadresse, aktiveringsmail sendes til.
+change_unconfirmed_email_error = Kan ikke ændre e-mailadressen: %v
+resend_mail = Klik her for at sende din aktiverings-e-mail igen
+send_reset_mail = Send gendannelses-e-mail
+reset_password = Kontogendannelse
+invalid_code = Din bekræftelseskode er ugyldig eller er udløbet.
+invalid_code_forgot_password = Din bekræftelseskode er ugyldig eller er udløbet. Klik her for at starte en ny session.
+invalid_password = Din adgangskode stemmer ikke overens med den adgangskode, der blev brugt til at oprette kontoen.
+reset_password_helper = Gendan konto
+resent_limit_prompt = Du har allerede anmodet om en aktiverings-e-mail for nylig. Vent venligst 3 minutter, og prøv igen.
+reset_password_wrong_user = Du er logget ind som %s, men linket til kontogendannelse er beregnet til %s
+confirmation_mail_sent_prompt = En ny bekræftelses-e-mail er blevet sendt til %s . For at fuldføre registreringsprocessen skal du tjekke din indbakke og følge det medfølgende link inden for de næste %s. Hvis e-mailen er forkert, kan du logge ind og anmode om, at endnu en bekræftelses-e-mail sendes til en anden adresse.
+change_unconfirmed_email = Hvis du har opgivet den forkerte e-mailadresse under tilmeldingen, kan du ændre den nedenfor, og der vil i stedet blive sendt en bekræftelse til den nye adresse.
+hint_login = Har du allerede en konto? Log ind nu!
+has_unconfirmed_mail = Hej %s, du har en ubekræftet e-mailadresse (%s ). Hvis du ikke har modtaget en bekræftelses-e-mail eller har brug for at sende en ny, bedes du klikke på knappen nedenfor.
+password_too_short = Adgangskodelængden må ikke være mindre end %d tegn.
+non_local_account = Ikke-lokale brugere kan ikke opdatere deres adgangskode via Forgejo-webgrænsefladen.
+verify = Verificere
+unauthorized_credentials = Legitimationsoplysningerne er forkerte eller er udløbet. Prøv din kommando igen, eller se %s for at få flere oplysninger
+scratch_code = Skrabekode
+use_scratch_code = Brug en skrabekode
+use_onetime_code = Brug en engangskode
+twofa_scratch_used = Du har brugt din skrabekode. Du er blevet omdirigeret til siden med to-faktorindstillinger, så du kan fjerne din enhedstilmelding eller generere en ny skrabekode.
+twofa_passcode_incorrect = Din passcode er forkert. Hvis du har forlagt din enhed, skal du bruge din skrabekode til at logge ind.
+twofa_scratch_token_incorrect = Din skrabekode er forkert.
+login_userpass = Login
+oauth_signup_tab = Registrer ny konto
+oauth_signup_title = Fuldfør ny konto
+oauth_signup_submit = Gennemfør konto
+oauth_signin_tab = Link til en eksisterende konto
+oauth_signin_title = Log ind for at godkende linket konto
+oauth_signin_submit = Link konto
+oauth.signin.error = Der opstod en fejl under behandling af godkendelsesanmodningen. Hvis denne fejl fortsætter, bedes du kontakte webstedets administrator.
+oauth.signin.error.access_denied = Godkendelsesanmodningen blev afvist.
+oauth.signin.error.temporarily_unavailable = Godkendelse mislykkedes, fordi godkendelsesserveren midlertidigt ikke er tilgængelig. Prøv venligst igen senere.
+openid_connect_submit = Forbind
+openid_connect_title = Opret forbindelse til en eksisterende konto
+openid_register_title = Opret ny konto
+openid_register_desc = Den valgte OpenID URI er ukendt. Knyt den til en ny konto her.
+disable_forgot_password_mail = Kontogendannelse er deaktiveret, fordi der ikke er konfigureret nogen e-mail. Kontakt venligst din webstedsadministrator.
+email_domain_blacklisted = Du kan ikke registrere dig med din e-mailadresse.
+authorize_application = Godkend Applikation
+authorize_redirect_notice = Du vil blive omdirigeret til %s, hvis du godkender denne applikation.
+authorize_application_created_by = Denne applikation blev oprettet af %s.
+authorize_application_description = Hvis du giver adgangen, vil den være i stand til at få adgang til og skrive til alle dine kontooplysninger, inklusive private depoter og organisationer.
+authorize_title = Tillad "%s" at få adgang til din konto?
+authorization_failed = Godkendelse mislykkedes
+password_pwned_err = Kunne ikke fuldføre anmodningen til HaveIBeenPwned
+last_admin = Du kan ikke fjerne den sidste admin. Der skal være mindst én administrator.
+back_to_sign_in = Tilbage til Log ind
+sign_in_openid = Fortsæt med OpenID
+openid_signin_desc = Indtast din OpenID URI. For eksempel: alice.openid.example.org eller https://openid.example.org/alice.
+disable_forgot_password_mail_admin = Kontogendannelse er kun tilgængelig, når e-mail er konfigureret. Konfigurer venligst e-mail for at aktivere kontogendannelse.
+password_pwned = Den adgangskode, du valgte, er på en liste over stjålne adgangskoder , der tidligere er blevet afsløret i forbindelse med offentlige databrud. Prøv venligst igen med en anden adgangskode, og overvej også at ændre denne adgangskode et andet sted.
+openid_connect_desc = Den valgte OpenID URI er ukendt. Knyt den til en ny konto her.
+authorization_failed_desc = Godkendelsen mislykkedes, fordi vi har registreret en ugyldig anmodning. Kontakt venligst vedligeholderen af den app, du har forsøgt at godkende.
+
+[mail]
+view_it_on = Se det på %s
+reply = eller svar direkte på denne e-mail
+link_not_working_do_paste = Virker linket ikke? Prøv at kopiere og indsætte det i din browsers URL-linje.
+hi_user_x = Hej %s ,
+activate_account = Aktiver venligst din konto
+activate_account.text_1 = Hej %[1]s , tak, fordi du registrerede dig hos %[2]s!
+activate_account.text_2 = Klik venligst på følgende link for at aktivere din konto inden for %s :
+activate_email = Bekræft din e-mailadresse
+admin.new_user.subject = Ny bruger %s har lige tilmeldt sig
+admin.new_user.user_info = Brugeroplysninger
+admin.new_user.text = Venligst klik her for at administrere denne bruger fra administrationspanelet.
+register_notify = Velkommen til %s
+register_notify.text_1 = dette er din registreringsbekræftelses-e-mail for %s!
+register_notify.text_3 = Hvis en anden har lavet denne konto for dig, skal du først indstille din adgangskode .
+reset_password = Gendan din konto
+password_change.subject = Din adgangskode er blevet ændret
+password_change.text_1 = Adgangskoden til din konto er lige blevet ændret.
+primary_mail_change.subject = Din primære mail er blevet ændret
+totp_disabled.subject = TOTP er blevet deaktiveret
+totp_disabled.text_1 = Tidsbaseret engangsadgangskode (TOTP) på din konto er netop blevet deaktiveret.
+totp_disabled.no_2fa = Der er ikke længere konfigureret andre 2FA-metoder, hvilket betyder, at det ikke længere er nødvendigt at logge ind på din konto hos 2FA.
+removed_security_key.subject = En sikkerhedsnøgle er blevet fjernet
+removed_security_key.text_1 = Sikkerhedsnøglen "%[1]s" er lige blevet fjernet fra din konto.
+account_security_caution.text_1 = Hvis dette var dig, så kan du roligt ignorere denne mail.
+totp_enrolled.subject = Du har aktiveret TOTP som 2FA-metode
+totp_enrolled.text_1.has_webauthn = Du har lige aktiveret TOTP for din konto. Dette betyder, at du for alle fremtidige login til din konto kan bruge TOTP som en 2FA-metode eller bruge en af dine sikkerhedsnøgler.
+register_success = Registreringen lykkedes
+issue_assigned.pull = @%[1]s har tildelt dig at trække anmodning %[2]s i depotet %[3]s.
+issue_assigned.issue = @%[1]s har tildelt dig et problem %[2]s i depotet %[3]s.
+register_notify.text_2 = Du kan logge ind på din konto med dit brugernavn: %s
+primary_mail_change.text_1 = Din kontos primære mail er lige blevet ændret til %[1]s. Det betyder, at denne e-mailadresse ikke længere vil modtage e-mail-meddelelser for din konto.
+account_security_caution.text_2 = Hvis dette ikke var dig, er din konto kompromitteret. Kontakt venligst administratorerne af dette websted.
+activate_email.text = Klik venligst på følgende link for at bekræfte din e-mailadresse inden for %s :
+reset_password.text = Hvis dette var dig, skal du klikke på følgende link for at gendanne din konto inden for %s :
+removed_security_key.no_2fa = Der er ikke længere konfigureret andre 2FA-metoder, hvilket betyder, at det ikke længere er nødvendigt at logge ind på din konto hos 2FA.
+totp_enrolled.text_1.no_webauthn = Du har lige aktiveret TOTP for din konto. Det betyder, at du for alle fremtidige login til din konto skal bruge TOTP som 2FA-metode.
+issue.x_mentioned_you = @%s nævnte dig:
+issue.action.force_push = %[1]s tvangs pushed %[2]s fra %[3]s til %[4]s.
+issue.action.push_1 = @%[1]s pushed %[3]d commit til %[2]s
+issue.action.push_n = @%[1]s pushed %[3]d commits til %[2]s
+issue.action.close = @%[1]s lukket #%[2]d.
+issue.action.reopen = @%[1]s genåbnet #%[2]d.
+issue.action.merge = @%[1]s merged #%[2]d ind i %[3]s.
+issue.action.approve = @%[1]s godkendte denne pull-anmodning.
+issue.action.reject = @%[1]s anmodede om ændringer på denne pull-anmodning.
+issue.action.review = @%[1]s kommenterede denne pull-anmodning.
+issue.action.review_dismissed = @%[1]s afviste den seneste kontrol fra %[2]s for denne pull-anmodning.
+issue.action.ready_for_review = @%[1]s markerede denne pull-anmodning klar til gennemgang.
+issue.action.new = @%[1]s oprettede #%[2]d.
+issue.in_tree_path = I %s:
+release.new.subject = %s i %s udgivet
+release.new.text = @%[1]s udgivet %[2]s i %[3]s
+release.title = Title: %s
+release.note = Note:
+release.downloads = Downloads:
+release.download.zip = Kildekode (ZIP)
+release.download.targz = Kildekode (TAR.GZ)
+repo.transfer.subject_to = %s ønsker at overføre depotet "%s" til %s
+repo.transfer.subject_to_you = %s ønsker at overføre depotet "%s" til dig
+repo.transfer.to_you = dig
+repo.transfer.body = For at acceptere eller afvise det, besøg %s eller ignorer det.
+repo.collaborator.added.subject = %s føjede dig til %s som samarbejdspartner
+repo.collaborator.added.text = Du er blevet tilføjet som samarbejdspartner til depotet:
+team_invite.subject = %[1]s har inviteret dig til at deltage i %[2]s organisationen
+team_invite.text_1 = %[1]s har inviteret dig til at deltage i teamet %[2]s i organisationen %[3]s.
+team_invite.text_2 = Klik venligst på følgende link for at blive medlem af holdet:
+team_invite.text_3 = Note: Denne invitation var beregnet til %[1]s. Hvis du ikke forventede denne invitation, kan du ignorere denne e-mail.
+
+[modal]
+yes = Ja
+no = Nej
+confirm = Bekærft
+cancel = Annuller
+modify = Updatere
+
+[form]
+UserName = Brugernavn
+FullName = Fulde navn
+Description = Beskrivelse
+Pronouns = Stedord
+Biography = Biografi
+Website = Websted
+Location = Lokation
+RepoName = Depot navn
+Email = E-mailadresse
+Password = Adgangskode
+Retype = Bekræft adgangskode
+PayloadUrl = Payload URL
+TeamName = Holdnavn
+AuthName = Autorisationsnavn
+AdminEmail = Admin email
+To = Gren navn
+AccessToken = Adgangstoken
+NewBranchName = Nyt gren navn
+CommitSummary = Commit oversigt
+CommitMessage = Commit besked
+CommitChoice = Commit valg
+TreeName = Fil sti
+Content = Indhold
+SSPISeparatorReplacement = Separator
+SSPIDefaultLanguage = Standard sprog
+require_error = ` må ikke være tomt.`
+alpha_dash_error = ` bør kun indeholde alfanumeriske, bindestreg ("-") og understregningstegn ("_").`
+alpha_dash_dot_error = ` bør kun indeholde alfanumeriske tegn, bindestreg ("-"), understregning ("_") og prik ("".").`
+git_ref_name_error = ` skal være et veludformet Git-referencenavn.`
+size_error = ` skal være størrelse %s.`
+min_size_error = ` skal indeholde mindst %s tegn.`
+email_error = ` er ikke en gyldig e-mailadresse.`
+url_error = `"%s" er ikke en gyldig URL.`
+include_error = ` skal indeholde understreng "%s".`
+glob_pattern_error = ` globmønster er ugyldigt: %s.`
+regex_pattern_error = ` regex-mønster er ugyldigt: %s.`
+invalid_group_team_map_error = ` mapping er ugyldig: %s`
+unknown_error = Ukendt fejl:
+captcha_incorrect = CAPTCHA-koden er forkert.
+password_not_match = Adgangskoderne stemmer ikke overens.
+lang_select_error = Vælg et sprog fra listen.
+username_been_taken = Brugernavnet er allerede taget.
+username_change_not_local_user = Ikke-lokale brugere må ikke ændre deres brugernavn.
+repo_name_been_taken = Depotnavnet er allerede brugt.
+repository_force_private = Tving Privat er aktiveret: private depoter kan ikke gøres offentlige.
+repository_files_already_exist = Der findes allerede filer for dette depot. Kontakt systemadministratoren.
+repository_files_already_exist.delete = Der findes allerede filer for dette depot. Du skal slette dem.
+visit_rate_limit = Fjernbesøg adresseret takstbegrænsning.
+2fa_auth_required = Fjernbesøg krævede godkendelse af to faktorer.
+org_name_been_taken = Organisationsnavnet er allerede taget.
+team_name_been_taken = Holdnavnet er allerede taget.
+team_no_units_error = Tillad adgang til mindst én depotsektion.
+email_been_used = E-mailadressen er allerede brugt.
+email_invalid = E-mailadressen er ugyldig.
+openid_been_used = OpenID-adressen "%s" er allerede brugt.
+password_complexity = Adgangskoden opfylder ikke kompleksitetskravene:
+password_lowercase_one = Mindst ét lille bogstav
+password_uppercase_one = Mindst ét stort tegn
+password_digit_one = Mindst ét ciffer
+enterred_invalid_repo_name = Det depotnavn, du indtastede, er forkert.
+enterred_invalid_org_name = Det organisationsnavn, du har indtastet, er forkert.
+enterred_invalid_owner_name = Det nye ejernavn er ikke gyldigt.
+enterred_invalid_password = Den adgangskode, du indtastede, er forkert.
+unset_password = Login-brugeren har ikke angivet adgangskoden.
+user_not_exist = Brugeren eksisterer ikke.
+team_not_exist = Holdet eksisterer ikke.
+last_org_owner = Du kan ikke fjerne den sidste bruger fra "ejere"-teamet. Der skal være mindst én ejer for en organisation.
+duplicate_invite_to_team = Brugeren var allerede inviteret som et holdmedlem.
+organization_leave_success = Du har forladt organisationen %s.
+invalid_ssh_key = Kan ikke bekræfte din SSH-nøgle: %s
+invalid_gpg_key = Kan ikke bekræfte din GPG-nøgle: %s
+invalid_ssh_principal = Ugyldig principal: %s
+unable_verify_ssh_key = Kan ikke bekræfte SSH-nøglen, dobbelttjek den for fejl.
+auth_failed = Godkendelse mislykkedes: %v
+still_own_repo = Din konto ejer et eller flere depoter, slet eller overfør dem først.
+still_has_org = Din konto er medlem af en eller flere organisationer, forlad dem først.
+still_own_packages = Din konto ejer en eller flere pakker, slet dem først.
+org_still_own_packages = Denne organisation ejer stadig en eller flere pakker, slet dem først.
+target_branch_not_exist = Gren målet eksisterer ikke.
+admin_cannot_delete_self = Du kan ikke slette dig selv, når du er administrator. Fjern venligst dine administratorrettigheder først.
+required_prefix = Input skal starte med "%s"
+username_error = ` kan kun indeholde alfanumeriske tegn ("0-9","a-z","A-Z"), bindestreg ("-"), understregning ("_") og prik ("."). Det kan ikke begynde eller slutte med ikke-alfanumeriske tegn, og på hinanden følgende ikke-alfanumeriske tegn er også forbudt.`
+max_size_error = ` må højst indeholde %s tegn.`
+repository_files_already_exist.adopt_or_delete = Der findes allerede filer for dette depot. Enten adopter dem eller slet dem.
+org_still_own_repo = Denne organisation ejer stadig et eller flere depoter, slet eller overfør dem først.
+username_error_no_dots = ` kan kun indeholde alfanumeriske tegn ("0-9","a-z","A-Z"), bindestreg ("-") og understregning ("_"). Det kan ikke begynde eller slutte med ikke-alfanumeriske tegn, og på hinanden følgende ikke-alfanumeriske tegn er også forbudt.`
+username_password_incorrect = Brugernavn eller adgangskode er forkert.
+repository_files_already_exist.adopt = Filer findes allerede for dette depot og kan kun adopteres.
+password_special_one = Mindst ét specialtegn (tegnsætning, parenteser, anførselstegn osv.)
+unsupported_login_type = Login typen understøttes ikke for at slette kontoen.
+cannot_add_org_to_team = En organisation kan ikke tilføjes som et holdmedlem.
+must_use_public_key = Nøglen du har angivet er en privat nøgle. Lad være med at uploade din private nøgle nogen steder. Brug din offentlige nøgle i stedet.
+
+[user]
+change_avatar = Skift din avatar…
+joined_on = Tilmeldte sig den %s
+repositories = Depoter
+activity = Offentlig aktivitet
+followers.title.one = Følger
+followers.title.few = Følgere
+following.title.one = Følger
+following.title.few = Følger
+followers_one = %d følger
+followers_few = %d følgere
+following_one = %d følger
+following_few = %d følger
+follow = Følg
+unfollow = Fjern følg
+block_user = Bloker bruger
+block_user.detail = Bemærk venligst, at blokering af en bruger har andre effekter, såsom:
+block_user.detail_1 = I vil holde op med at følge hinanden og vil ikke være i stand til at følge hinanden.
+block_user.detail_2 = Denne bruger vil ikke være i stand til at interagere med de depoter, du ejer, eller de problemer og kommentarer, du har oprettet.
+block_user.detail_3 = I vil ikke være i stand til at tilføje hinanden som depot-samarbejdspartnere.
+follow_blocked_user = Du kan ikke følge denne bruger, fordi du har blokeret denne bruger, eller denne bruger har blokeret dig.
+starred = Stjernemarkerede depoter
+watched = Overvågede depoter
+code = Kode
+overview = Oversigt
+block = Block
+user_bio = Biografi
+email_visibility.limited = Din e-mailadresse er synlig for alle godkendte brugere
+show_on_map = Vis dette sted på et kort
+settings = Brugerindstillinger
+public_activity.visibility_hint.admin_public = Denne aktivitet er synlig for alle, men som administrator kan du også se interaktioner i private rum.
+public_activity.visibility_hint.self_private = Din aktivitet er kun synlig for dig og instans-administratorerne. Konfigurer .
+public_activity.visibility_hint.admin_private = Denne aktivitet er synlig for dig, fordi du er administrator, men brugeren ønsker, at den forbliver privat.
+form.name_reserved = Brugernavnet "%s" er reserveret.
+form.name_pattern_not_allowed = Mønsteret "%s" er ikke tilladt i et brugernavn.
+form.name_chars_not_allowed = Brugernavnet "%s" indeholder ugyldige tegn.
+unblock = Fjern blokering
+projects = Projekter
+disabled_public_activity = Denne bruger har deaktiveret den offentlige synlighed af aktiviteten.
+public_activity.visibility_hint.self_public = Din aktivitet er synlig for alle, undtagen interaktioner i private rum. Konfigurer .
+public_activity.visibility_hint.self_private_profile = Din aktivitet er kun synlig for dig og instans-administratorerne, fordi din profil er privat. Konfigurer .
+
+[settings]
+profile = Profil
+account = Konto
+appearance = Udseende
+password = Adgangskode
+security = Sikkerhed
+avatar = Avatar
+ssh_gpg_keys = SSH / GPG nøgler
+applications = Applikationer
+orgs = Organisationer
+repos = Depoter
+delete = Slet konto
+twofa = To-faktor-godkendelse (TOTP)
+organization = Organisationer
+uid = UID
+webauthn = To-faktor-godkendelse (sikkerhedsnøgler)
+blocked_users = Blokerede brugere
+public_profile = Offentlig profil
+location_placeholder = Del din omtrentlige placering med andre
+password_username_disabled = Ikke-lokale brugere må ikke ændre deres brugernavn. Kontakt venligst din webstedsadministrator for flere detaljer.
+full_name = Fulde navn
+website = Websted
+location = Lokation
+pronouns = Stedord
+pronouns_custom = Brugerdefineret
+pronouns_unspecified = Uspecificeret
+update_theme = Skift tema
+update_language = Skift sprog
+update_language_success = Sproget er blevet opdateret.
+update_profile_success = Din profil er blevet opdateret.
+change_username = Dit brugernavn er blevet ændret.
+change_username_redirect_prompt = Det gamle brugernavn vil omdirigere, indtil nogen gør krav på det.
+continue = Fortsæt
+cancel = Annuller
+language = Sprog
+language.title = Standard sprog
+language.description = Dette sprog gemmes på din konto og bruges som standard, når du logger ind.
+ui = Tema
+additional_repo_units_hint = Foreslå at aktivere yderligere depotenheder
+additional_repo_units_hint_description = Vis et "Aktiver mere"-tip for depoter, der ikke har alle tilgængelige enheder aktiveret.
+update_hints = Opdater tips
+hints = Tips
+update_hints_success = Tips er blevet opdateret.
+hidden_comment_types = Skjulte kommentartyper
+hidden_comment_types.ref_tooltip = Kommentarer, hvor dette problem blev refereret fra en anden problem/commit/…
+hidden_comment_types.issue_ref_tooltip = Kommentarer, hvor brugeren ændrer grenen/taget, der er knyttet til problemet
+comment_type_group_reference = Reference
+comment_type_group_label = Etiket
+comment_type_group_milestone = Milepæl
+comment_type_group_assignee = Udpegningsmodtager
+comment_type_group_title = Title
+comment_type_group_branch = Gren
+comment_type_group_time_tracking = Tidsregistrering
+comment_type_group_deadline = Tidsfrist
+comment_type_group_dependency = Dependency
+comment_type_group_lock = Lås status
+comment_type_group_review_request = Gennemgå anmodning
+comment_type_group_pull_request_push = Tilføjet commits
+comment_type_group_project = Projekt
+comment_type_group_issue_ref = Problem henvisning
+privacy = Privatliv
+keep_activity_private = Skjul aktivitet fra profilsiden
+lookup_avatar_by_mail = Slå avatar up efter e-mailadresse
+enable_custom_avatar = Brug tilpasset avatar
+delete_current_avatar = Slet nuværende avatar
+uploaded_avatar_not_a_image = Den uploadede fil er ikke et billede.
+update_avatar_success = Din avatar er blevet opdateret.
+update_user_avatar_success = Brugerens avatar er blevet opdateret.
+change_password = Skift adgangskode
+update_password = Opdater adgangskode
+old_password = Nuværende adgangskode
+new_password = Ny adgangskode
+retype_new_password = Bekræft ny adgangskode
+password_incorrect = Den aktuelle adgangskode er forkert.
+password_change_disabled = Ikke-lokale brugere kan ikke opdatere deres adgangskode via Forgejo-webgrænsefladen.
+manage_emails = Administrer e-mailadresser
+manage_themes = Standard tema
+manage_openid = OpenID-adresser
+theme_desc = Dette tema vil blive brugt til webgrænsefladen, når du er logget ind.
+primary = Primær
+activated = Aktiveret
+requires_activation = Kræver aktivering
+primary_email = Gør til primær
+activate_email = Send aktivering
+activations_pending = Aktiveringer afventer
+can_not_add_email_activations_pending = Der er en afventende aktivering, prøv igen om et par minutter, hvis du vil tilføje en ny e-mail.
+delete_email = Slet
+email_deletion = Fjern e-mailadresse
+email_deletion_success = E-mailadressen er blevet fjernet.
+theme_update_success = Dit tema blev opdateret.
+theme_update_error = Det valgte tema findes ikke.
+openid_deletion = Fjern OpenID-adresse
+openid_deletion_desc = Fjernelse af denne OpenID-adresse fra din konto vil forhindre dig i at logge ind med den. Fortsætte?
+openid_deletion_success = OpenID-adressen er blevet fjernet.
+add_new_email = Tilføj e-mailadresse
+add_new_openid = Tilføj ny OpenID URI
+language.localization_project = Hjælp os med at oversætte Forgejo til dit sprog! Få flere oplysninger .
+update_language_not_found = Sprog "%s" er ikke tilgængeligt.
+hidden_comment_types_description = Kommentartyper, der er markeret her, vil ikke blive vist på problemsider. Hvis du f.eks. markerer "Etiket", fjernes alle " tilføjede/fjernede " kommentarer.
+update_profile = Opdater profil
+change_username_prompt = Note: Ændring af dit brugernavn ændrer også din konto-URL.
+biography_placeholder = Fortæl andre lidt om dig selv! (Markdown understøttes)
+profile_desc = Om dig
+saved_successfully = Dine indstillinger blev gemt.
+keep_activity_private.description = Din offentlige aktivitet vil kun være synlig for dig og instans-administratorerne.
+email_desc = Din primære e-mailadresse vil blive brugt til meddelelser, gendannelse af adgangskode og, forudsat at den ikke er skjult, webbaserede Git-operationer.
+uploaded_avatar_is_too_big = Den uploadede filstørrelse (%d KiB) overstiger den maksimale størrelse (%d KiB).
+email_deletion_desc = E-mailadressen og relaterede oplysninger vil blive fjernet fra din konto. Git commits af denne e-mailadresse forbliver uændret. Fortsætte?
+choose_new_avatar = Vælg ny avatar
+update_avatar = Opdater avatar
+change_password_success = Din adgangskode er blevet opdateret. Log ind med din nye adgangskode fra nu af.
+add_email = Tilføj e-mailadresse
+add_openid = Tilføj OpenID URI
+add_email_confirmation_sent = En bekræftelses-e-mail er blevet sendt til "%s". For at bekræfte din e-mailadresse, tjek venligst din indbakke og følg det medfølgende link inden for de næste %s.
+add_openid_success = Den nye OpenID-adresse er blevet tilføjet.
+keep_email_private = Skjul e-mailadresse
+openid_desc = OpenID lader dig uddelegere godkendelse til en ekstern udbyder.
+manage_ssh_keys = Administrer SSH-nøgler
+manage_ssh_principals = Administrer SSH-certifikatprincippere
+manage_gpg_keys = Administrer GPG-nøgler
+add_key = Tilføj nøgle
+ssh_desc = Disse offentlige SSH-nøgler er knyttet til din konto. De tilsvarende private nøgler giver fuld adgang til dine depoter. SSH-nøgler, der er blevet bekræftet, kan bruges til at bekræfte SSH-signerede Git-commits.
+principal_desc = Disse SSH-certifikatprincipper er knyttet til din konto og giver fuld adgang til dine depoter.
+ssh_helper = Har du brug for hjælp? Se vejledningen til at oprette dine egne SSH-nøgler eller løse almindelige problemer a> du kan støde på når du bruger SSH.
+gpg_helper = Har du brug for hjælp? Se vejledningen om GPG .
+key_content_gpg_placeholder = Begynder med "-----BEGIN PGP PUBLIC KEY BLOCK-----"
+add_new_principal = Tilføj principal
+ssh_key_been_used = Denne SSH-nøgle er allerede blevet tilføjet til serveren.
+ssh_key_name_used = En SSH-nøgle med samme navn findes allerede på din konto.
+ssh_principal_been_used = Denne principal er allerede blevet tilføjet til serveren.
+gpg_key_id_used = Der findes allerede en offentlig GPG-nøgle med samme id.
+gpg_no_key_email_found = Denne GPG-nøgle matcher ikke nogen aktiveret e-mail-adresse tilknyttet din konto. Det kan stadig tilføjes, hvis du underskriver det medfølgende token.
+gpg_key_matched_identities = Matchede identiteter:
+gpg_key_verified = Verificeret nøgle
+gpg_key_verified_long = Nøglen er blevet bekræftet med et token og kan bruges til at bekræfte commits, der matcher alle aktiverede e-mailadresser for denne bruger ud over eventuelle matchede identiteter for denne nøgle.
+gpg_key_verify = Bekræft
+gpg_invalid_token_signature = Den medfølgende GPG-nøgle, signatur og token stemmer ikke overens, eller token er forældet.
+gpg_token_required = Du skal angive en underskrift for nedenstående token
+gpg_token = Token
+gpg_token_signature = Pansret GPG-signatur
+key_signature_gpg_placeholder = Begynder med "-----BEGIN PGP SIGNATURE-----"
+verify_gpg_key_success = GPG-nøglen "%s" er blevet bekræftet.
+ssh_key_verified = Verificeret nøgle
+ssh_token_required = Du skal angive en underskrift for nedenstående token
+ssh_token = Token
+ssh_token_help = Du kan generere en signatur ved at bruge:
+ssh_token_signature = Pansret SSH signatur
+key_signature_ssh_placeholder = Begynder med "-----BEGIN SSH SIGNATURE-----"
+verify_ssh_key_success = SSH-nøglen "%s" er blevet bekræftet.
+subkeys = Undernøgler
+key_name = Nøglenavn
+key_id = Nøgle ID
+key_content = Indhold
+principal_content = Indhold
+add_key_success = SSH-nøglen "%s" er blevet tilføjet.
+add_principal_success = SSH-certifikatprincippet "%s" er blevet tilføjet.
+delete_key = Slet
+ssh_key_deletion = Slet SSH-nøgle
+gpg_key_deletion = Slet GPG-nøglen
+ssh_principal_deletion = Slet SSH Certificate Principal
+gpg_key_deletion_desc = Fjernelse af en GPG-nøgle afbekræfter commits, der er underskrevet af den. Fortsætte?
+ssh_principal_deletion_desc = Fjernelse af en SSH Certificate Principal tilbagekalder dens adgang til din konto. Fortsætte?
+ssh_key_deletion_success = SSH-nøglen er blevet fjernet.
+ssh_principal_deletion_success = Principal er blevet fjernet.
+added_on = Tilføjet den %s
+valid_until_date = Gyldig indtil %s
+last_used = Sidst brugt på
+no_activity = Ingen nylig aktivitet
+can_read_info = Læs
+can_write_info = Skriv
+token_state_desc = Dette token er blevet brugt inden for de sidste 7 dage
+principal_state_desc = Denne principal er blevet brugt inden for de sidste 7 dage
+show_openid = Vis på profil
+hide_openid = Skjul fra profil
+ssh_externally_managed = Denne SSH-nøgle administreres eksternt for denne bruger
+manage_access_token = Adgangstoken
+generate_new_token = Generer nyt token
+tokens_desc = Disse tokens giver adgang til din konto ved hjælp af Forgejo API.
+token_name = Token navn
+generate_token = Generer token
+generate_token_success = Dit nye token er blevet genereret. Kopier den nu, da den ikke vises igen.
+delete_token = Slet
+access_token_deletion = Slet adgangstoken
+access_token_deletion_desc = Sletning af et token vil tilbagekalde adgangen til din konto for applikationer, der bruger den. Dette kan ikke fortrydes. Fortsætte?
+repo_and_org_access = Depot og organisationsadgang
+permissions_public_only = Kun offentlig
+permissions_access_all = Alle (offentlige, private og begrænsede)
+select_permissions = Vælg tilladelser
+permission_no_access = Ingen adgang
+permission_read = Læs
+permission_write = Læs og skriv
+permissions_list = Tilladelser:
+manage_oauth2_applications = Administrer OAuth2-applikationer
+edit_oauth2_application = Rediger OAuth2-applikation
+add_email_success = Den nye e-mailadresse er blevet tilføjet.
+key_content_ssh_placeholder = Begynder med "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", eller "sk-ssh-ed25519@openssh.com"
+gpg_key_matched_identities_long = De indlejrede identiteter i denne nøgle matcher de følgende aktiverede e-mailadresser for denne bruger. Commits, der matcher disse e-mailadresser, kan bekræftes med denne nøgle.
+gpg_key_deletion_success = GPG-nøglen er blevet fjernet.
+email_preference_set_success = E-mail-præference er blevet indstillet.
+keep_email_private_popup = Din e-mailadresse vil ikke blive vist på din profil og vil ikke være standard for commits foretaget via webgrænsefladen, som f.eks. filupload, redigeringer og merge commits. I stedet kan en speciel adresse %s bruges til at linke commits til din konto. Denne mulighed vil ikke påvirke eksisterende commits.
+gpg_desc = Disse offentlige GPG-nøgler er knyttet til din konto og bruges til at bekræfte dine commits. Opbevar dine private nøgler sikkert, da de giver dig mulighed for at underskrive commits med din identitet.
+gpg_token_help = Du kan generere en signatur ved at bruge:
+ssh_key_verified_long = Nøglen er blevet bekræftet med et token og kan bruges til at bekræfte commits, der matcher enhver aktiveret e-mail-adresse for denne bruger.
+ssh_key_deletion_desc = Fjernelse af en SSH-nøgle tilbagekalder dens adgang til din konto. Fortsætte?
+ssh_signonly = SSH er i øjeblikket deaktiveret, så disse nøgler bruges kun til bekræftelse af commit signatur.
+at_least_one_permission = Du skal vælge mindst én tilladelse for at oprette et token
+ssh_key_verify = Bekræft
+ssh_invalid_token_signature = Den angivne SSH-nøgle, signatur eller token stemmer ikke overens, eller token er forældet.
+add_gpg_key_success = GPG-nøglen "%s" er blevet tilføjet.
+valid_forever = Gyldig for evigt
+ssh_disabled = SSH er deaktiveret
+key_state_desc = Denne nøgle er blevet brugt inden for de sidste 7 dage
+generate_token_name_duplicate = %s er allerede blevet brugt som applikationsnavn. Brug venligst en ny.
+delete_token_success = Tokenet er blevet slettet. Applikationer, der bruger den, har ikke længere adgang til din konto.
+access_token_desc = Valgte tokentilladelser begrænser kun autorisation til de tilsvarende API -ruter. Læs dokumentationen for at få flere oplysninger.
+oauth2_applications_desc = OAuth2-applikationer gør det muligt for din tredjepartsapplikation at godkende brugere sikkert i denne Forgejo-instans.
+remove_oauth2_application = Slet OAuth2-applikation
+remove_oauth2_application_desc = Sletning af en OAuth2-applikation vil tilbagekalde adgangen til alle signerede adgangstokens. Vil du fortsætte?
+remove_oauth2_application_success = Ansøgningen er blevet slettet.
+create_oauth2_application = Opret en ny OAuth2-applikation
+create_oauth2_application_button = Opret applikation
+create_oauth2_application_success = Du har oprettet en ny OAuth2-applikation.
+update_oauth2_application_success = Du har opdateret OAuth2-applikationen.
+oauth2_application_name = Applikationsnavn
+oauth2_redirect_uris = Omdiriger URI'er. Brug venligst en ny linje for hver URI.
+save_application = Gem
+oauth2_client_id = Klient ID
+oauth2_client_secret = Klient hemmelighed
+oauth2_regenerate_secret = Genskab hemmeligheden
+oauth2_regenerate_secret_hint = Har du mistet din hemmelighed?
+oauth2_client_secret_hint = Hemmeligheden vil ikke blive vist igen, når du forlader eller opdaterer denne side. Sørg for, at du har gemt den.
+oauth2_application_edit = Redigere
+oauth2_confidential_client = Fortrolig klient. Vælg for apps, der holder hemmeligheden fortrolig, såsom webapps. Vælg ikke for indbyggede apps, herunder desktop- og mobilapps.
+oauth2_application_create_description = OAuth2-applikationer giver din tredjepartsapplikation adgang til brugerkonti på denne instans.
+oauth2_application_remove_description = Fjernelse af en OAuth2-applikation forhindrer den i at få adgang til autoriserede brugerkonti på denne instans. Vil du fortsætte?
+authorized_oauth2_applications = Autoriserede OAuth2-applikationer
+revoke_key = Tilbagekald
+revoke_oauth2_grant = Tilbagekald adgang
+revoke_oauth2_grant_description = Tilbagekaldelse af adgang for denne tredjepartsapplikation forhindrer denne applikation i at få adgang til dine data. Er du sikker?
+revoke_oauth2_grant_success = Adgangen blev tilbagekaldt.
+twofa_desc = For at beskytte din konto mod adgangskodetyveri kan du bruge en smartphone eller en anden enhed til at modtage tidsbaserede engangsadgangskoder ("TOTP").
+twofa_is_enrolled = Din konto er i øjeblikket tilmeldt til tofaktorgodkendelse.
+twofa_not_enrolled = Din konto er i øjeblikket ikke tilmeldt to-faktor-godkendelse.
+twofa_disable = Deaktiver to-faktor-godkendelse
+twofa_scratch_token_regenerate = Gendan engangsgendannelsesnøgle
+twofa_scratch_token_regenerated = Din gendannelsesnøgle til engangsbrug er nu %s. Opbevar det et sikkert sted, da det ikke vil blive vist igen.
+twofa_enroll = Tilmeld dig to-faktor-godkendelse
+twofa_recovery_tip = Hvis du mister din enhed, vil du være i stand til at bruge en gendannelsesnøgle til engangsbrug for at få adgang til din konto igen.
+oauth2_application_locked = Forgejo forhåndsregistrerer nogle OAuth2-applikationer ved opstart, hvis det er aktiveret i config. For at forhindre uventet adfærd kan disse hverken redigeres eller fjernes. Se venligst OAuth2-dokumentationen for at få flere oplysninger.
+authorized_oauth2_applications_description = Du har givet adgang til din personlige Forgejo-konto til disse tredjepartsapplikationer. Tilbagekald venligst adgangen for applikationer, der ikke længere er i brug.
+manage_account_links = Tilknyttede konti
+manage_account_links_desc = Disse eksterne konti er knyttet til din Forgejo-konto.
+link_account = Link konto
+remove_account_link = Slet linket konto
+remove_account_link_desc = Fjernelse af en tilknyttet konto vil tilbagekalde dens adgang til din Forgejo-konto. Vil du fortsætte?
+remove_account_link_success = Den tilknyttede konto er blevet fjernet.
+twofa_disable_note = Du kan deaktivere to-faktor-godkendelse, hvis det er nødvendigt.
+twofa_disable_desc = Deaktivering af to-faktor-godkendelse vil gøre din konto mindre sikker. Vil du fortsætte?
+regenerate_scratch_token_desc = Hvis du har forlagt din gendannelsesnøgle eller allerede har brugt den til at logge på, kan du nulstille den her.
+twofa_disabled = To-faktor-godkendelse er blevet deaktiveret.
+scan_this_image = Scan dette billede med din godkendelsesapplikation:
+then_enter_passcode = Og indtast adgangskoden vist i applikationen:
+passcode_invalid = Passkoden er forkert. Prøv igen.
+twofa_enrolled = Din konto er blevet tilmeldt. Opbevar din gendannelsesnøgle til engangsbrug (%s) et sikkert sted, da den ikke vil blive vist igen.
+twofa_failed_get_secret = Det lykkedes ikke at få hemmelig-koden.
+or_enter_secret = Eller indtast hemmelig-koden: %s
+webauthn_desc = Sikkerhedsnøgler er hardwareenheder, der indeholder kryptografiske nøgler. De kan bruges til to-faktor-godkendelse. Sikkerhedsnøgler skal understøtte WebAuthn Authenticator -standarden.
+webauthn_register_key = Tilføj sikkerhedsnøgle
+webauthn_nickname = Kaldenavn
+webauthn_delete_key = Slet sikkerhedsnøglen
+webauthn_delete_key_desc = Hvis du sletter en sikkerhedsnøgle, kan du ikke længere logge ind med den. Vil du fortsætte?
+webauthn_key_loss_warning = Hvis du mister dine sikkerhedsnøgler, mister du adgangen til din konto.
+webauthn_alternative_tip = Du vil måske gerne konfigurere en ekstra godkendelsesmetode.
+hooks.desc = Tilføj webhooks, som vil blive udløst for alle depoter , som du ejer.
+orgs_none = Du er ikke medlem af nogen organisationer.
+repos_none = Du ejer ikke nogen depoter.
+delete_account = Slet din konto
+delete_prompt = Denne handling vil permanent slette din brugerkonto. Det KAN IKKE fortrydes.
+confirm_delete_account = Bekræft sletning
+email_notifications.enable = Aktiver e-mail-notifikationer
+email_notifications.onmention = Kun e-mail ved omtale
+email_notifications.disable = Deaktiver e-mail-notifikationer
+email_notifications.submit = Indstil e-mail-præference
+email_notifications.andyourown = Og dine egne notifikationer
+visibility = Brugersynlighed
+visibility.public = Offentlig
+visibility.public_tooltip = Synlig for alle
+visibility.limited_tooltip = Kun synlig for brugere, der er logget ind
+visibility.private = Privat
+blocked_since = Blokeret siden %s
+user_unblock_success = Blokeringen af brugeren er blevet fjernet.
+user_block_success = Brugeren er blevet blokeret.
+blocked_users_none = Der er ingen blokerede brugere.
+visibility.limited = Begrænset
+delete_account_desc = Er du sikker på, at du vil slette denne brugerkonto permanent?
+visibility.private_tooltip = Kun synlig for medlemmer af organisationer, du har tilsluttet dig
+delete_with_all_comments = Din konto er yngre end %s. For at undgå spøgelseskommentarer slettes alle problemer/PR-kommentarer med kontoen.
+delete_account_title = Slet brugerkonto
+user_block_yourself = Du kan ikke blokere dig selv.
+pronouns_custom_label = Brugerdefinerede stedord
+
+[repo]
+rss.must_be_on_branch = Du skal være på en gren for at have et RSS-feed.
+admin.manage_flags = Administrer flag
+admin.enabled_flags = Flag aktiveret for depotet:
+admin.update_flags = Opdater flag
+admin.flags_replaced = Depot flag udskiftet
+owner = Ejer
+owner_helper = Nogle organisationer vises muligvis ikke i dropdown-menuen på grund af en maksimal grænse for optælling af depoter.
+repo_name = Depot navn
+repo_name_helper = Gode depotnavne bruger korte, mindeværdige og unikke nøgleord.
+repo_size = Depotstørrelse
+size_format = %[1]s: %[2]s, %[3]s: %[4]s
+template = Skabelon
+template_select = Vælg en skabelon
+template_helper = Gør depot til en skabelon
+visibility = Synlighed
+visibility_helper = Gør depotet privat
+visibility_helper_forced = Din webstedsadministrator tvinger nye depoter til at være private.
+clone_helper = Har du brug for hjælp til kloning? Besøg Hjælp .
+fork_repo = Fork depot
+fork_from = Fork fra
+already_forked = Du har allerede forked %s
+fork_to_different_account = Fork til en anden konto
+fork_branch = Gren, der skal klones til fork
+all_branches = Alle grene
+fork_no_valid_owners = Dette depot kan ikke blive forked, fordi der ikke er nogen gyldige ejere.
+use_template = Brug denne skabelon
+open_with_editor = Åben med %s
+download_zip = Download ZIP
+download_tar = Download TAR.GZ
+download_bundle = Download BUNDLE
+generate_repo = Generer depot
+generate_from = Generer fra
+repo_desc = Beskrivelse
+repo_lang = Sprog
+repo_gitignore_helper = Vælg .gitignore skabeloner
+issue_labels = Etiketter
+issue_labels_helper = Vælg et etiketsæt
+license = Licens
+object_format = Objektformat
+object_format_helper = Objektformatet for depotet. Kan ikke ændres senere. SHA1 er den mest kompatible.
+readme = LÆSMIG
+readme_helper = Vælg en LÆSMIG-filskabelon
+readme_helper_desc = Dette er stedet, hvor du kan skrive en komplet beskrivelse af dit projekt.
+auto_init = Initialiser depot
+create_repo = Opret depot
+default_branch = Standard gren
+default_branch_label = standard
+default_branch_helper = Standardgrenen er basegrenen for pull-anmodninger og kode-commits.
+mirror_prune = Prune
+mirror_prune_desc = Slet forældede referencer til fjernsporing
+mirror_interval = Spejlinterval (gyldige tidsenheder er "h", "m", "s"). 0 for at deaktivere periodisk synkronisering. (Minimumsinterval: %s)
+mirror_interval_invalid = Spejlintervallet er ikke gyldigt.
+mirror_use_ssh.text = Brug SSH-godkendelse
+mirror_use_ssh.not_available = SSH-godkendelse er ikke tilgængelig.
+mirror_denied_combination = Kan ikke bruge offentlig nøgle- og adgangskodebaseret godkendelse i kombination.
+mirror_sync = synkroniseret
+mirror_sync_on_commit = Synkroniser når commits er pushed
+mirror_address = Klon fra URL
+mirror_address_desc = Angiv eventuelle nødvendige legitimationsoplysninger i sektionen Autorisation.
+mirror_address_url_invalid = Den angivne URL er ugyldig. Du skal escape alle komponenter i URL'en korrekt.
+mirror_lfs = Stort fillager (LFS)
+mirror_lfs_desc = Aktiver spejling af LFS-data.
+mirror_lfs_endpoint = LFS-endepunkt
+mirror_last_synced = Sidst synkroniseret
+mirror_password_placeholder = (Uændret)
+mirror_password_blank_placeholder = (Usat)
+mirror_password_help = Skift brugernavn for at slette en gemt adgangskode.
+watchers = Observatører
+stargazers = Stjernekiggere
+stars_remove_warning = Dette vil fjerne alle stjerner fra dette depot.
+forks = Forks
+stars = Stjerner
+reactions_more = og %d mere
+unit_disabled = Webstedsadministratoren har deaktiveret denne depotsektion.
+adopt_preexisting_label = Adopter filer
+adopt_preexisting = Adopter allerede eksisterende filer
+adopt_preexisting_content = Opret depot fra %s
+adopt_preexisting_success = Adopterede filer og oprettet depot fra %s
+delete_preexisting_label = Slet
+delete_preexisting = Slet allerede eksisterende filer
+delete_preexisting_content = Slet filer i %s
+delete_preexisting_success = Slettede ikke-adopterede filer i %s
+blame_prior = Se skylden før denne ændring
+blame.ignore_revs.failed = Kunne ikke ignorere revisioner i .git-blame-ignore-revs .
+author_search_tooltip = Viser maksimalt 30 brugere
+tree_path_not_found_commit = Sti %[1]s eksisterer ikke i commit %[2]s
+tree_path_not_found_branch = Sti %[1]s findes ikke i gren %[2]s
+tree_path_not_found_tag = Sti %[1]s findes ikke i tag %[2]s
+transfer.accept = Accepter overførsel
+transfer.accept_desc = Overfør til "%s"
+transfer.reject = Afvis overførsel
+transfer.no_permission_to_accept = Du har ikke tilladelse til at acceptere denne overførsel.
+transfer.no_permission_to_reject = Du har ikke tilladelse til at afvise denne overførsel.
+desc.private = Privat
+desc.public = Offentlig
+desc.template = Skabelon
+desc.archived = Arkiveret
+desc.sha256 = SHA256
+template.items = Skabelonelementer
+template.git_content = Git-indhold (standardgren)
+template.git_hooks = Git hooks
+template.webhooks = Webhooks
+template.topics = Emner
+template.avatar = Avatar
+template.issue_labels = Problem etiketter
+template.one_item = Skal vælge mindst ét skabelonelement
+template.invalid = Skal vælge et skabelondepot
+admin.failed_to_replace_flags = Det lykkedes ikke at erstatte depot flag
+repo_desc_helper = Indtast en kort beskrivelse (valgfrit)
+mirror_use_ssh.helper = Forgejo vil spejle depotet via Git over SSH og oprette et nøglepar til dig, når du vælger denne mulighed. Du skal sikre dig, at den genererede offentlige nøgle er autoriseret til at pushe til destinationsdepotet. Du kan ikke bruge adgangskodebaseret godkendelse, når du vælger dette.
+adopt_search = Indtast brugernavn for at søge efter ikke-adopterede depoter... (lad stå tomt for at finde alle)
+fork_visibility_helper = Synligheden af et forked depot kan ikke ændres.
+license_helper = Vælg en licensfil
+language_other = Andre
+desc.internal = Internt
+visibility_description = Kun ejeren eller organisationens medlemmer, hvis de har rettigheder, vil kunne se det.
+new_repo_helper = Et depot indeholder alle projektfiler, inklusive revisionshistorik. Er du allerede vært for en et andet sted? Migrer depot .
+visibility_fork_helper = (Hvis du ændrer dette, vil det påvirke synligheden af alle forks.)
+mirror_lfs_endpoint_desc = Synkronisering vil forsøge at bruge klon-url'en til at bestemme LFS-serveren . Du kan også angive et brugerdefineret endepunkt, hvis depots LFS-data er gemt et andet sted.
+template_description = Skabelondepoter lader brugere generere nye depoter med samme mappestruktur, filer og valgfri indstillinger.
+repo_gitignore_helper_desc = Vælg, hvilke filer der ikke skal spores, fra en liste over skabeloner til almindelige sprog. Typiske artefakter genereret af hvert sprogs byggeværktøjer er inkluderet på .gitignore som standard.
+license_helper_desc = En licens styrer, hvad andre kan og ikke kan gøre med din kode. Er du i tvivl om, hvilken der passer til dit projekt? Se Vælg en licens .
+template.git_hooks_tooltip = Du er i øjeblikket ikke i stand til at ændre eller fjerne Git hooks, når først de er tilføjet. Vælg kun dette, hvis du har tillid til skabelondepotet.
+mirror_public_key = Offentlig SSH-nøgle
+blame.ignore_revs = Ignorerer revisioner i .git-blame-ignore-revs . Klik her for at omgå og se den normale skyldvisning.
+mirror_address_protocol_invalid = Den angivne URL er ugyldig. Kun http(s):// eller git:// placeringer kan bruges til spejling.
+transfer.reject_desc = Annuller overførsel til "%s"
+archive.title = Dette depot er arkiveret. Du kan se filer og klone dem, men du kan ikke pushe eller åbne problemer eller pull-anmodninger.
+archive.title_date = Dette depot er blevet arkiveret på %s. Du kan se filer og klone dem, men du kan ikke pushe eller åbne problemer eller pull-anmodninger.
+archive.issue.nocomment = Denne depot er arkiveret. Du kan ikke kommentere på problemer.
+form.reach_limit_of_creation_1 = Ejeren har allerede nået grænsen på %d depot.
+form.reach_limit_of_creation_n = Ejeren har allerede nået grænsen på %d depoterne.
+form.name_reserved = Depotnavnet "%s" er reserveret.
+form.string_too_long = Den givne streng er længere end %d tegn.
+need_auth = Autorisation
+migrate_options = Migrationsmuligheder
+migrate_options_mirror_helper = Dette depot vil være et spejl
+migrate_options_lfs = Migrer LFS-filer
+migrate_options_lfs_endpoint.label = LFS endepunkt
+migrate_options_lfs_endpoint.description.local = En lokal serversti understøttes også.
+migrate_items = Migration Elementer
+migrate_items_wiki = Wiki
+migrate_items_milestones = Milepæle
+migrate_items_labels = Etiketter
+migrate_items_issues = Problemmer
+migrate_items_pullrequests = Pull-anmodninger
+migrate_items_merge_requests = Flet anmodninger
+migrate_items_releases = Udgivelser
+migrate_repo = Migrer depot
+migrate.clone_address_desc = HTTP(S) eller Git "klone" URL'en for et eksisterende lager
+migrate.clone_local_path = eller en lokal serversti
+migrate.permission_denied = Du har ikke tilladelse til at importere lokale depoter.
+migrate.permission_denied_blocked = Du kan ikke importere fra ikke-tilladte værter. Bed venligst administratoren om at kontrollere ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS indstillingerne.
+migrate.invalid_local_path = Den lokale sti er ugyldig. Den eksisterer ikke eller er ikke en mappe.
+migrate.invalid_lfs_endpoint = LFS-endepunktet er ikke gyldigt.
+migrate.failed = Migrering mislykkedes: %v
+migrate.migrate_items_options = Adgangstoken er påkrævet for at migrere yderligere elementer
+migrated_from_fake = Migreret fra %[1]s
+migrate.migrate = Migrer fra %s
+migrate.migrating = Migrerer fra %s ...
+migrate.migrating_failed = Migrering fra %s mislykkedes.
+migrate.migrating_failed.error = Kunne ikke migrere: %s
+migrate.migrating_failed_no_addr = Migration mislykkedes.
+migrate.git.description = Migrer kun et depot fra enhver Git-tjeneste.
+migrate.gitlab.description = Migrer data fra gitlab.com eller andre GitLab-instanser.
+migrate.forgejo.description = Migrer data fra codeberg.org eller andre Forgejo-instanser.
+migrate.gogs.description = Migrer data fra notabug.org eller andre Gogs-instanser.
+migrate.codebase.description = Migrer data fra codebasehq.com.
+migrate.migrating_git = Migrering af Git-data
+migrate.migrating_topics = Migrering af emner
+migrate.migrating_milestones = Migrerende milepæle
+migrate.migrating_labels = Migrering af etiketter
+migrate.migrating_releases = Migrering af udgivelser
+migrate.migrating_issues = Migrering af problemer
+migrate.migrating_pulls = Migrering af pull-anmodninger
+migrate.cancel_migrating_title = Annuller migrering
+mirror_from = spejl af
+forked_from = forked fra
+generated_from = genereret fra
+fork_from_self = Du kan ikke forke et depot, du ejer.
+migrate.onedev.description = Migrer data fra code.onedev.io eller andre OneDev-instanser.
+archive.pull.nocomment = Denne depot er arkiveret. Du kan ikke kommentere på pull-anmodninger.
+migrated_from = Migreret fra %[2]s
+migrate.gitea.description = Migrer data fra gitea.com eller andre Gitea-instanser.
+migrate.gitbucket.description = Migrer data fra GitBucket-instanser.
+migrate.github_token_desc = Du kan sætte et eller flere tokens med kommasepareret her for at gøre migreringen hurtigere på grund af GitHub API-hastighedsgrænsen. ADVARSEL: Misbrug af denne funktion kan overtræde tjenesteudbyderens politik og føre til kontoblokering.
+migrate_options_lfs_endpoint.description = Migration vil forsøge at bruge din fjern-Git til at bestemme LFS-serveren . Du kan også angive et brugerdefineret slutpunkt, hvis lagerets LFS-data er gemt et andet sted.
+form.name_pattern_not_allowed = Mønsteret "%s" er ikke tilladt i et depotnavn.
+migrate_options_lfs_endpoint.placeholder = Hvis det efterlades tomt, vil endepunktet blive afledt fra klonens URL
+migrate.clone_address = Migrer / Klon fra URL
+migrate.github.description = Migrer data fra github.com eller GitHub Enterprise server.
+migrate.cancel_migrating_confirm = Vil du annullere denne migrering?
+more_operations = Flere operationer
+new_from_template = Brug en skabelon
+new_from_template_description = Du kan vælge en eksisterende depotskabelon på denne instans og anvende dens indstillinger.
+new_advanced = Avancerede indstillinger
+new_advanced_expand = Klik for at udvide
+auto_init_description = Start Git-historikken med en LÆSMIG og tilføj eventuelt licens- og .gitignore-filer.
+unwatch = Fjern overvågning
+star = Stjerne
+unstar = Fjern stjerne
+fork = Fork
+download_archive = Download depot
+no_desc = Ingen beskrivelse
+code = Kode
+audio_not_supported_in_browser = Din browser understøtter ikke HTML5 "audio"-tagget.
+clone_this_repo = Klon dette depot
+create_new_repo_command = Oprettelse af et nyt depot på kommandolinjen
+push_exist_repo = Push et eksisterende depot fra kommandolinjen
+empty_message = Dette depot indeholder ikke noget indhold.
+code.desc = Få adgang til kildekode, filer, commits og grene.
+branch = Gren
+tree = Træ
+clear_ref = `Ryd nuværende reference`
+find_tag = Find tag
+branches = Grene
+tag = Tag
+tags = Tags
+issues = Problemer
+pulls = Pull-anmodninger
+project = Projekter
+file_permalink = Permalink
+file_too_large = Filen er for stor til at blive vist.
+ambiguous_runes_header = `Denne fil indeholder tvetydige Unicode-tegn`
+ambiguous_runes_description = `Denne fil indeholder Unicode-tegn, der kan forveksles med andre tegn. Hvis du tror, at dette er med vilje, kan du roligt ignorere denne advarsel. Brug Escape-knappen til at afsløre dem.`
+invisible_runes_line = `Denne linje har usynlige Unicode-tegn`
+ambiguous_runes_line = `Denne linje har tvetydige Unicode-tegn`
+ambiguous_character = `%[1]c [U+%04[1]X] kan forveksles med %[2]c [U+%04[2]X]`
+escape_control_characters = Escape
+unescape_control_characters = Unescape
+file_copy_permalink = Kopiér permalink
+view_git_blame = Se git skyld
+video_not_supported_in_browser = Din browser understøtter ikke HTML5 "video"-tagget.
+stored_lfs = Lagret med Git LFS
+symbolic_link = Symbolsk link
+executable_file = Eksekverbar fil
+vendored = Vendored
+generated = Genereret
+commit_graph = Commit graf
+commit_graph.select = Vælg grene
+commit_graph.hide_pr_refs = Skjul pull-anmodninger
+commit_graph.monochrome = Mono
+commit_graph.color = Farve
+commit.contained_in = Denne commit er indeholdt i:
+commit.contained_in_default_branch = Denne commit er en del af standardgrenen
+commit.load_referencing_branches_and_tags = Indlæs grene og tags, der refererer til denne commit
+blame = Skyld
+download_file = Download fil
+normal_view = Normal visning
+line = linje
+lines = linjer
+from_comment = (kommentar)
+no_eol.text = Ingen EOL
+no_eol.tooltip = Denne fil indeholder ikke et afsluttende linjesluttegn.
+editor.add_file = Tilføj fil
+editor.new_file = Ny fil
+editor.upload_file = Upload fil
+editor.edit_file = Rediger fil
+editor.preview_changes = Forhåndsvisning af ændringer
+editor.cannot_edit_lfs_files = LFS-filer kan ikke redigeres i webgrænsefladen.
+editor.cannot_edit_non_text_files = Binære filer kan ikke redigeres i webgrænsefladen.
+editor.edit_this_file = Rediger fil
+editor.this_file_locked = Filen er låst
+editor.must_be_on_a_branch = Du skal være på en gren for at foretage eller foreslå ændringer til denne fil.
+editor.fork_before_edit = Du skal fork dette depot for at foretage eller foreslå ændringer til denne fil.
+editor.delete_this_file = Slet fil
+editor.must_have_write_access = Du skal have skriveadgang for at foretage eller foreslå ændringer til denne fil.
+filter_branch_and_tag = Filtrer gren eller tag
+quick_guide = Hurtig guide
+broken_message = Git-dataene, der ligger til grund for dette depot, kan ikke læses. Kontakt administratoren af denne instans eller slet dette depot.
+invisible_runes_header = `Denne fil indeholder usynlige Unicode-tegn`
+cite_this_repo = Citér dette depot
+invisible_runes_description = `Denne fil indeholder usynlige Unicode-tegn, der ikke kan skelnes for mennesker, men som kan behandles anderledes af en computer. Hvis du tror, at dette er med vilje, kan du roligt ignorere denne advarsel. Brug Escape-knappen til at afsløre dem.`
+fork_guest_user = Log ind for at forke dette depot.
+watch_guest_user = Log ind for at overvåge dette depot.
+watch = Overvåg
+star_guest_user = Log ind for at stjernemarkere dette depot.
+subscribe.issue.guest.tooltip = Log ind for at abonnere på dette problem.
+subscribe.pull.guest.tooltip = Log ind for at abonnere på denne pull-anmodning.
+release = Udgivelse
+releases = Udgivelser
+packages = Pakker
+actions = Handlinger
+labels = Etiketter
+milestones = Milepæle
+n_commit_few = %s commits
+n_branch_one = %s gren
+n_branch_few = %s grene
+org_labels_desc_manage = Styr
+commits = Commits
+commit = Commit
+org_labels_desc = Etiketter på organisationsniveau, der kan bruges med alle depoter under denne organisation
+n_commit_one = %s commit
+n_release_few = %s udgivelser
+released_this = udgivet dette
+file.title = %s ved %s
+file_raw = Rå
+file_follow = Følg symbollink
+editor.or = eller
+editor.fail_to_update_file_summary = Fejlmeddelelse:
+editor.push_rejected_summary = Fuldstændig afvisningsmeddelelse:
+editor.add_subdir = Tilføj en mappe…
+editor.unable_to_upload_files = Kunne ikke uploade filer til "%s" med fejl: %v
+n_tag_one = %s tag
+n_tag_few = %s tags
+n_release_one = %s udgivelse
+file_history = Historie
+file_view_source = Se kilde
+file_view_rendered = Vis gengivet
+file_view_raw = Vis rå
+editor.file_delete_success = Filen "%s" er blevet slettet.
+editor.name_your_file = Navngiv din fil…
+editor.filename_help = Tilføj en mappe ved at skrive dens navn efterfulgt af en skråstreg ("/"). Fjern en mappe ved at skrive backspace i begyndelsen af inputfeltet.
+editor.cancel_lower = Annuller
+editor.commit_signed_changes = Commit underskrevne ændringer
+editor.file_is_a_symlink = `"%s" er et symbolsk link. Symbolske links kan ikke redigeres i webeditoren`
+editor.filename_is_a_directory = Filnavnet "%s" er allerede brugt som et mappenavn i dette depot.
+editor.upload_file_is_locked = Filen "%s" er låst af %s.
+editor.upload_files_to_dir = Upload filer til "%s"
+editor.cannot_commit_to_protected_branch = Kan ikke commit til den beskyttede gren "%s".
+editor.no_commit_to_branch = Kan ikke commit direkte til grenen fordi:
+editor.user_no_push_to_branch = Brugeren kan ikke push til gren
+editor.require_signed_commit = Gren kræver en underskrevet commit
+editor.cherry_pick = Kirsebær-pluk %s på:
+editor.revert = Vend %s tilbage til:
+commits.desc = Gennemse kildekodens ændringshistorik.
+commits.commits = Commits
+commits.no_commits = Ingen commits til fælles. "%s" og "%s" har helt forskellige historier.
+commits.nothing_to_compare = Disse grene er ens.
+commits.search.tooltip = Du kan præfikse nøgleord med "forfatter:", "committer:", "efter:" eller "før:", f.eks. "vend forfatter:Alice før:2019-01-13".
+commits.search_branch = Denne gren
+commits.search_all = Alle grene
+commits.author = Forfatter
+commits.gpg_key_id = GPG nøgle-id
+commits.ssh_key_fingerprint = SSH nøgle fingeraftryk
+commits.view_path = Se på dette tidspunkt i historien
+commit.operations = Operationer
+commit.revert = Revert
+commit.revert-header = Revert: %s
+commit.revert-content = Vælg gren for at revert til:
+editor.directory_is_a_file = Katalognavnet "%s" er allerede brugt som et filnavn i dette depot.
+editor.branch_already_exists = Gren "%s" findes allerede i dette depot.
+editor.filename_cannot_be_empty = Filnavnet må ikke være tomt.
+editor.commit_changes = Commit ændringer
+editor.signoff_desc = Tilføj en Signed-off-by trailer af committeren i slutningen af commit log-meddelelsen.
+editor.commit_directly_to_this_branch = Commit direkte til %[1]s -grenen.
+editor.add_tmpl = Tilføj "<%s>"
+editor.add_tmpl.filename = filnavn
+editor.add = Tilføj %s
+editor.update = Opdater %s
+editor.delete = Slet %s
+editor.patch = Påfør patch
+editor.patching = Patching:
+editor.fail_to_apply_patch = Kan ikke anvende patch "%s"
+editor.new_patch = Nyt patch
+editor.commit_message_desc = Tilføj en valgfri udvidet beskrivelse…
+editor.create_new_branch = Opret en ny gren til denne commit og start en pull-anmodning.
+editor.create_new_branch_np = Opret en ny gren til denne commit.
+editor.propose_file_change = Foreslå filændring
+editor.new_branch_name = Navngiv den nye gren for denne commit
+editor.new_branch_name_desc = Ny gren navn…
+editor.cancel = Annuller
+commits.signed_by_untrusted_user_unmatched = Signeret af ikke-pålidelig bruger, der ikke matcher committer
+commits.signed_by = Signeret af
+commits.signed_by_untrusted_user = Signeret af en ikke-pålidelig bruger
+commit.cherry-pick = Kirsebær-pluk
+commit.cherry-pick-header = Kirsebærpluk: %s
+commit.cherry-pick-content = Vælg en gren at kirsebær-pluk på:
+commitstatus.failure = Fiasko
+commitstatus.error = Fejl
+projects.create_success = Projektet "%s" er blevet oprettet.
+projects.title = Titel
+projects.new = Nyt projekt
+projects.new_subheader = Koordiner, spor og opdater dit arbejde ét sted, så projekter forbliver gennemsigtige og planmæssigt.
+editor.filename_is_invalid = Filnavnet er ugyldigt: "%s".
+projects.deletion_desc = Sletning af et projekt fjerner det fra alle relaterede problemer. Vil du fortsætte?
+projects.deletion_success = Projektet er blevet slettet.
+projects.modify = Rediger projekt
+projects.type.none = Intet
+projects.type.basic_kanban = Grundlæggende kanban
+projects.type.bug_triage = Fejltriage
+projects.template.desc = Skabelon
+projects.template.desc_helper = Vælg en projektskabelon for at komme i gang
+projects.column.edit = Rediger kolonne
+projects.column.set_default_desc = Indstil denne kolonne som standard for ukategoriserede problemer og pulls
+projects.column.delete = Slet kolonne
+projects.column.deletion_desc = Sletning af en projektkolonne flytter alle relaterede problemer til standardkolonnen. Vil du fortsætte?
+projects.column.color = Farve
+projects.open = Åben
+projects.close = Luk
+projects.column.assigned_to = Tildelt til
+projects.card_type.desc = Forhåndsvisninger af kort
+projects.card_type.images_and_text = Billeder og tekst
+projects.card_type.text_only = Kun tekst
+issues.desc = Organiser fejlrapporter, opgaver og milepæle.
+editor.invalid_commit_mail = Ugyldig mail til oprettelse af en commit.
+editor.branch_does_not_exist = Gren "%s" findes ikke i dette depot.
+editor.file_editing_no_longer_exists = Filen, der redigeres, "%s", findes ikke længere i dette depot.
+projects.column.edit_title = Navn
+projects.column.new_title = Navn
+projects.column.new_submit = Opret kolonne
+projects.column.new = Ny kolonne
+projects.column.set_default = Indstil standard
+editor.file_deleting_no_longer_exists = Filen, der slettes, "%s", eksisterer ikke længere i dette depot.
+editor.no_changes_to_show = Der er ingen ændringer at vise.
+editor.fail_to_update_file = Kunne ikke opdatere/oprette filen "%s".
+editor.push_rejected_no_message = Ændringen blev afvist af serveren uden en besked. Tjek venligst Git hooks.
+editor.push_rejected = Ændringen blev afvist af serveren. Tjek venligst Git hooks.
+projects.create = Opret projekt
+projects.deletion = Slet projekt
+projects.edit = Rediger projekt
+projects.edit_subheader = Projekter organiserer problemer og sporer fremskridt.
+projects.edit_success = Projekt "%s" er blevet opdateret.
+issues.new.no_label = Ingen etiketter
+issues.new.clear_labels = Tydelige etiketter
+issues.new.projects = Projekter
+issues.new.clear_projects = Ryd projekter
+issues.new.no_projects = Intet projekt
+issues.new.open_projects = Åben projekter
+issues.new.closed_projects = Lukkede projekter
+issues.new.no_items = Ingen elementer
+issues.new.milestone = Milepæl
+issues.new.no_milestone = Ingen milepæl
+issues.filter_assignees = Filter tildelt
+issues.filter_milestones = Filter Milepæl
+issues.filter_projects = Filter projekt
+issues.filter_labels = Filter etiket
+issues.filter_reviewers = Filter anmelder
+issues.new = Nyt problem
+issues.new.title_empty = Titel må ikke være tom
+issues.new.labels = Etiketter
+issues.new.clear_milestone = Ryd milepæl
+issues.new.open_milestone = Åben milepæle
+issues.new.closed_milestone = Lukkede milepæle
+issues.new.assignees = Tilvalgte
+issues.new.clear_assignees = Ryd tildelte
+issues.filter_sort.recentupdate = For nylig opdateret
+issues.filter_sort.leastupdate = Sidst opdateret
+issues.filter_sort.mostcomment = De fleste kommenterede
+issues.filter_sort.leastcomment = Mindst kommenteret
+issues.filter_sort.nearduedate = Nærmeste forfaldsdato
+issues.filter_sort.farduedate = Længste forfaldsdato
+issues.filter_sort.moststars = Flest stjerner
+editor.file_changed_while_editing = Filens indhold er ændret, siden du begyndte at redigere. Klik her for at se dem eller Bekræft ændringer igen for at overskrive dem.
+editor.file_already_exists = En fil med navnet "%s" findes allerede i dette depot.
+editor.commit_id_not_matching = Filen blev ændret, mens du redigerede den. Forpligt dig til en ny gren og merge derefter.
+editor.push_out_of_date = Pushet ser ud til at være forældet.
+editor.commit_empty_file_header = Commit en tom fil
+editor.commit_empty_file_text = Den fil, du er ved at commitere, er tom. Vil du fortsætte?
+commits.message = Besked
+commits.browse_further = Gennemse videre
+commits.renamed_from = Omdøbt fra %s
+commits.date = Dato
+commits.older = Ældre
+commits.newer = Nyere
+issues.new.no_assignees = Ingen tildelte
+issues.new.assign_to_me = Tildel mig
+issues.action_assignee_no_select = Ingen tildelt
+issues.action_check = Marker/fjern markeringen
+issues.action_check_all = Marker/fjern markeringen af alle elementer
+issues.opened_by = åbnet %[1]s af %[3]s
+pulls.merged_by = af %[3]s blev merged %[1]s
+pulls.merged_by_fake = af %[2]s blev merged %[1]s
+issues.closed_by = af %[3]s blev lukket %[1]s
+projects.desc = Håndtere problemer og pulls i projektboards.
+issues.filter_sort.feweststars = Færre stjerner
+issues.action_assignee = Tildelte
+commitstatus.success = Succes
+ext_issues = Eksterne problemer
+projects = Projekter
+projects.description = Beskrivelse (valgfrit)
+projects.description_placeholder = Beskrivelse
+issues.new.no_reviewers = Ingen anmeldere
+issues.choose.get_started = Kom godt i gang
+issues.choose.open_external_link = Åben
+issues.choose.blank = Standard
+issues.choose.blank_about = Opret et problem fra standardskabelon.
+issues.choose.ignore_invalid_templates = Ugyldige skabeloner er blevet ignoreret
+issues.filter_sort.mostforks = Fleste forks
+issues.filter_sort.fewestforks = Mindste forks
+issues.action_open = Åben
+issues.action_close = Lukket
+issues.action_label = Etiket
+issues.action_milestone_no_select = Ingen milepæl
+commitstatus.pending = Afventer
+issues.edit.already_changed = Kunne ikke gemme ændringer af problemet. Det ser ud til, at indholdet allerede er blevet ændret af en anden bruger. Opdater siden, og prøv at redigere igen for at undgå at overskrive deres ændringer
+issues.action_milestone = Milepæl
+issues.comment_pull_merged_at = merged commit %[1]s ind i %[2]s %[3]s
+issues.comment_manually_pull_merged_at = manuelt merged commit %[1]s into %[2]s %[3]s
+issues.context.edit = Redigere
+issues.context.delete = Slet
+issues.no_content = Ingen beskrivelse angivet.
+issues.close = Luk problem
+summary_card_alt = Oversigtskort for depot %s
+issues.choose.invalid_config = Problemkonfigurationen indeholder fejl:
+issues.no_ref = Ingen gren/tag angivet
+issues.create = Opret problem
+issues.new_label = Ny etiket
+issues.choose.invalid_templates = %v ugyldig(e) skabelon(er) fundet
+issues.new_label_placeholder = Etiketnavn
+issues.new_label_desc_placeholder = Beskrivelse
+issues.create_label = Opret etiket
+issues.label_templates.title = Indlæs en etiketforudindstilling
+issues.label_templates.info = Der findes endnu ingen etiketter. Opret en etiket med "Ny etiket", eller brug en etiketforudindstilling:
+issues.label_templates.helper = Vælg en etiketforudindstilling
+issues.label_templates.use = Brug etiketforudindstilling
+issues.label_templates.fail_to_load_file = Kunne ikke indlæse etiketskabelonfilen "%s": %v
+issues.add_label = tilføjede %s etiketten %s
+issues.add_labels = tilføjede %s etiketterne %s
+issues.add_remove_labels = tilføjede %s og fjernede %s etiketter %s
+issues.add_milestone_at = `føjede dette til %s milepælen %s`
+issues.add_project_at = `føjede dette til %s - projektet %s`
+issues.ref_reopening_from = `henviste til dette problem fra en pull-anmodning %[4]s, der vil genåbne den , %[2]s `
+issues.ref_closed_from = `lukkede dette problem %[4]s %[2 ]s `
+issues.ref_reopened_from = `genåbnede dette problem %[4]s %[2 ]s `
+issues.ref_from = `fra %[1]s`
+issues.author = Forfatter
+issues.commit_ref_at = `henviste til dette problem fra en commit %[2]s `
+issues.ref_issue_from = `henviste til dette problem %[4]s %[2 ]s `
+issues.ref_pull_from = `henviste til denne pull-anmodning %[4]s %[ 2]s `
+issues.ref_closing_from = `henviste til dette problem fra en pull-anmodning %[4]s, der vil lukke det , %[2]s `
+issues.author.tooltip.issue = Denne bruger er forfatteren til dette problem.
+issues.author.tooltip.pr = Denne bruger er forfatteren af denne pull-anmodning.
+issues.role.owner = Ejer
+issues.role.owner_helper = Denne bruger er ejeren af dette depot.
+issues.role.member = Medlem
+issues.filter_label = Etiket
+issues.filter_label_no_select = Alle etiketter
+issues.filter_label_select_no_label = Ingen etiket
+issues.closed_title = Lukket
+issues.all_title = Alle
+issues.draft_title = Udkast
+issues.num_comments_1 = %d kommentar
+issues.num_comments = %d kommentarer
+issues.num_reviews_one = %d gennemgang
+issues.opened_by_fake = åbnet %[1]s af %[2]s
+issues.closed_by_fake = af %[2]s var lukket %[1]s
+issues.previous = Tidligere
+issues.next = Næste
+issues.open_title = Åben
+issues.num_reviews_few = %d gennemganger
+issues.context.reference_issue = Reference i nyt problem
+issues.close_comment_issue = Luk med kommentar
+issues.reopen_issue = Genåben
+issues.commented_at = `kommenterede %s `
+issues.delete_comment_confirm = Er du sikker på, at du vil slette denne kommentar?
+issues.context.copy_link = Kopiér link
+issues.context.quote_reply = Citat svar
+issues.reaction.add = Tilføj reaktion
+issues.reaction.alt_few = %[1]s reagerede %[2]s.
+issues.reaction.alt_many = %[1]s og %[2]d mere reagerede %[3]s.
+issues.reaction.alt_remove = Fjern %[1]s reaktion fra kommentar.
+issues.reaction.alt_add = Tilføj %[1]s reaktion til kommentar.
+issues.context.menu = Kommentar menu
+issues.reopen_comment_issue = Genåbner med kommentar
+issues.create_comment = Kommentar
+issues.closed_at = `lukkede dette problem %[2]s `
+issues.reopened_at = `genåbnede dette problem %[2]s `
+issues.remove_label = fjernede %s etiketten %s
+issues.remove_labels = fjernede %s etiketterne %s
+issues.change_project_at = `modificerede projektet fra %s til %s %s`
+issues.remove_milestone_at = `fjernede dette fra %s milepælen %s`
+issues.remove_project_at = `fjernede dette fra %s -projektet %s`
+issues.deleted_milestone = `(slettet)`
+issues.deleted_project = `(slettet)`
+issues.add_assignee_at = `blev tildelt af %s %s`
+issues.self_assign_at = `selv tildelt denne %s".
+issues.remove_assignee_at = `blev utildelt af %s %s`
+issues.remove_self_assignment = `fjernede deres opgave %s`
+issues.change_title_at = `ændret titel fra %s til %s %s`
+issues.change_ref_at = `ændret reference fra %s til %s %s`
+issues.remove_ref_at = `fjernet reference %s %s`
+issues.add_ref_at = `tilføjet reference %s %s`
+issues.delete_branch_at = `slettet gren %s %s`
+issues.filter_label_exclude = `Brug alt
+ klik/enter
for at ekskludere etiketter`
+issues.filter_milestone = Milepæl
+issues.filter_milestone_all = Alle milepæle
+issues.filter_milestone_none = Ingen milepæle
+issues.filter_milestone_open = Åbne milepæle
+issues.filter_milestone_closed = Lukkede milepæle
+issues.filter_project = Projekt
+issues.filter_project_all = Alle projekter
+issues.filter_project_none = Intet projekt
+issues.filter_assignee = Tildelte
+issues.filter_assginee_no_select = Alle tildelte
+issues.filter_assginee_no_assignee = Ingen tildelte
+issues.filter_poster = Forfatter
+issues.filter_poster_no_select = Alle forfattere
+issues.filter_type = Type
+issues.filter_type.all_issues = Alle problemer
+issues.filter_type.assigned_to_you = Tildelt til dig
+issues.filter_type.created_by_you = Oprettet af dig
+issues.filter_type.review_requested = Gennemgang anmodet om
+issues.filter_type.reviewed_by_you = Gennemgået af dig
+issues.filter_sort = Sortere
+issues.filter_sort.relevance = Relevans
+issues.filter_sort.latest = Nyeste
+issues.filter_sort.oldest = Ældste
+issues.filter_type.mentioning_you = Nævnte dig
+issues.change_milestone_at = "ændrede milepælen fra %s til %s %s"
+issues.role.contributor_helper = Denne bruger har tidligere forpligtet sig i dette depot.
+issues.is_stale = Der er sket ændringer i denne PR siden denne gennemgang
+issues.label_exclusive = Eksklusiv
+issues.role.member_helper = Denne bruger er medlem af den organisation, der ejer dette depot.
+issues.role.collaborator = Samarbejdspartner
+issues.role.contributor = Bidragyder
+issues.edit = Redigere
+issues.role.collaborator_helper = Denne bruger er blevet inviteret til at samarbejde om depotet.
+issues.role.first_time_contributor = Førstegangs bidragyder
+issues.role.first_time_contributor_helper = Dette er det første bidrag fra denne bruger til depotet.
+issues.re_request_review = Anmod om gennemgang igen
+issues.remove_request_review = Fjern anmodning om gennemgang
+issues.remove_request_review_block = Anmodningen om gennemgang kan ikke fjernes
+issues.dismiss_review = Afvis gennemgang
+issues.dismiss_review_warning = Er du sikker på, at du vil afvise denne gennemgang?
+issues.sign_in_require_desc = Log ind for at deltage i denne samtale.
+issues.cancel = Annuller
+issues.save = Gem
+issues.label_title = Navn
+issues.label_description = Beskrivelse
+issues.label_color = Farve
+issues.label_archive = Arkiver etiketten
+issues.label_modify = Rediger etiket
+issues.label_deletion = Slet etiket
+issues.label_deletion_desc = Sletning af en etiket fjerner den fra alle problemer. Vil du fortsætte?
+issues.label_deletion_success = Etiketten er blevet slettet.
+issues.label_archived_filter = Vis arkiverede etiketter
+issues.label_archive_tooltip = Arkiverede etiketter udelukkes som standard fra forslagene, når du søger efter etiket.
+issues.label_exclusive_desc = Navngiv etiketten omfang/element
for at gøre den gensidigt udelukkende med andre omfang/
etiketter.
+issues.label_exclusive_warning = Eventuelle modstridende etiketter vil blive fjernet, når etiketterne for et problem eller pull-anmodning redigeres.
+issues.label_count = %d etiketter
+issues.label_open_issues = %d åben problemer/pull-anmodninger
+issues.label_edit = Redigere
+issues.label_delete = Slet
+issues.archived_label_description = (Arkiveret) %s
+issues.label.filter_sort.alphabetically = Alfabetisk
+issues.label.filter_sort.reverse_alphabetically = Omvendt alfabetisk
+issues.label.filter_sort.by_size = Mindste størrelse
+issues.label.filter_sort.reverse_by_size = Største størrelse
+issues.num_participants_one = %d deltager
+issues.num_participants_few = %d deltagere
+issues.attachment.open_tab = `Klik for at se "%s" i en ny fane`
+issues.attachment.download = `Klik for at downloade "%s"`
+issues.subscribe = Abonner
+issues.unsubscribe = Afmeld
+issues.lock_duplicate = Et problem kan ikke låses to gange.
+issues.unlock_error = Kan ikke låse et problem op, der ikke er låst.
+issues.lock_with_reason = låst som %s og begrænset samtale til samarbejdspartnere %s
+issues.lock_confirm = Lås
+issues.unlock_confirm = Lås op
+issues.lock.notice_1 = - Andre brugere kan ikke tilføje nye kommentarer til dette problem.
+issues.lock_no_reason = låst og begrænset samtale til samarbejdspartnere %s
+issues.unlock_comment = låste denne samtale %s op
+issues.add_time_minutes = Minutter
+issues.del_time_history = `slettet brugt tid %s`
+issues.add_time_hours = Timer
+issues.add_time_sum_to_small = Ingen tid blev indtastet.
+issues.time_spent_from_all_authors = `Samlet tid brugt: %s`
+issues.time_spent_total = Samlet tid brugt
+issues.unlock.title = Lås op for samtale om dette problem.
+issues.lock.title = Lås samtale om dette problem.
+issues.comment_on_locked = Du kan ikke kommentere på et låst problem.
+issues.delete = Slet
+issues.delete.title = Slet dette problem?
+issues.delete.text = Vil du virkelig slette dette problem? (Dette fjerner alt indhold permanent. Overvej at lukke det i stedet, hvis du har til hensigt at holde det arkiveret)
+issues.tracker = Tidsregistrering
+issues.start_tracking_short = Start timer
+issues.start_tracking = Start tidsregistrering
+issues.start_tracking_history = `begyndte at arbejde %s`
+issues.tracker_auto_close = Timeren stoppes automatisk, når dette problem lukkes
+issues.tracking_already_started = `Du har allerede startet tidsregistrering på et andet problem !`
+issues.stop_tracking = Stop timer
+issues.stop_tracking_history = "stoppede med at arbejde %s`
+issues.cancel_tracking = Kassér
+issues.cancel_tracking_history = `annulleret tidssporing %s`
+issues.add_time = Tilføj tid manuelt
+issues.del_time = Slet denne tidslog
+issues.add_time_cancel = Annuller
+issues.add_time_history = `tilført brugt tid %s`
+issues.due_date = Forfaldsdato
+issues.push_commit_1 = tilføjet %d commit %s
+issues.due_date_added = tilføjede forfaldsdatoen %s %s
+issues.due_date_modified = ændrede forfaldsdatoen fra %[2]s til %[1]s %[3]s
+issues.due_date_remove = fjernede forfaldsdatoen %s %s
+issues.due_date_overdue = Forfalden
+issues.lock.unknown_reason = Kan ikke låse et problem med en ukendt årsag.
+issues.lock.notice_3 = - Du kan altid låse op for dette problem igen i fremtiden.
+issues.push_commits_n = tilføjet %d commits %s
+issues.force_push_codes = `force-pushed %[1]s fra %[2]s
til %[4]s
%[6]s`
+issues.force_push_compare = Sammenlign
+issues.due_date_form = yyyy-mm-dd
+issues.due_date_form_edit = Redigere
+issues.due_date_form_remove = Slet
+issues.due_date_not_set = Ingen forfaldsdato fastsat.
+issues.add_time_short = Tilføj tid
+issues.unpin_issue = Frigør problemet
+issues.max_pinned = Du kan ikke fastgøre flere problemer
+issues.pin_comment = fastgjort dette %s
+issues.unpin_comment = frigjorde dette %s
+issues.lock = Lås samtale
+issues.unlock = Lås samtale op
+issues.lock.notice_2 = - Du og andre samarbejdspartnere med adgang til dette lager kan stadig efterlade kommentarer, som andre kan se.
+issues.unlock.notice_1 = - Alle ville kunne udtale sig om dette spørgsmål endnu en gang.
+issues.unlock.notice_2 = - Du kan altid låse dette problem igen i fremtiden.
+issues.lock.reason = Årsag til låsning
+issues.review.outdated = Forældet
+issues.dependency.no_permission.can_remove = Du har ikke tilladelse til at læse denne afhængighed, men du kan fjerne denne afhængighed
+issues.dependency.add = Tilføj afhængighed…
+issues.dependency.cancel = Annuller
+issues.dependency.remove = Slet
+issues.dependency.remove_info = Fjern denne afhængighed
+issues.dependency.added_dependency = `tilføjede en ny afhængighed %s`
+issues.due_date_invalid = Forfaldsdatoen er ugyldig eller uden for intervallet. Brug venligst formatet "yyyy-mm-dd".
+issues.dependency.title = Afhængigheder
+issues.dependency.issue_no_dependencies = Ingen afhængigheder angivet.
+issues.dependency.pr_no_dependencies = Ingen afhængigheder angivet.
+issues.dependency.no_permission_1 = Du har ikke tilladelse til at læse %d afhængighed
+issues.dependency.no_permission_n = Du har ikke tilladelse til at læse %d afhængigheder
+issues.dependency.issue_close_blocked = Du skal lukke alle problemer, der blokerer dette problem, før du kan lukke det.
+issues.dependency.issue_batch_close_blocked = Kan ikke batchlukke valgte problemer, fordi problem #%d stadig har åbne afhængigheder
+issues.dependency.pr_close_blocked = Du skal lukke alle problemer, der blokerer denne pull-anmodning, før du kan flette den.
+issues.dependency.blocks_short = Blockere
+issues.dependency.blocked_by_short = Afhænger af
+issues.dependency.remove_header = Fjern afhængighed
+issues.dependency.issue_remove_text = Dette vil fjerne afhængigheden af dette problem. Vil du fortsætte?
+issues.review.dismissed = afviste %s's gennemgang %s
+issues.review.content.empty = Du skal efterlade en kommentar, der angiver de ønskede ændringer.
+issues.review.reject = anmodende ændringer %s
+issues.review.wait = blev anmodet om gennemgang %s
+issues.review.add_review_request = anmodet om gennemgang fra %[1]s %[2]s
+issues.review.add_review_requests = anmodet om gennemgange fra %[1]s %[2]s
+issues.dependency.removed_dependency = `fjernede en afhængighed %s`
+issues.dependency.pr_closing_blockedby = Lukning af denne pull-anmodning er blokeret af følgende problemer
+issues.dependency.issue_closing_blockedby = Lukning af dette problem er blokeret af følgende problemer
+issues.dependency.issue_close_blocks = Dette problem blokerer for lukning af følgende problemer
+issues.dependency.pr_close_blocks = Denne pull-anmodning blokerer lukning af følgende problemer
+issues.dependency.pr_remove_text = Dette vil fjerne afhængigheden fra denne pull-anmodning. Vil du fortsætte?
+issues.dependency.setting = Aktiver afhængigheder for problemer og pull-anmodninger
+issues.dependency.add_error_same_issue = Du kan ikke få et problem til at afhænge af sig selv.
+issues.dependency.add_error_dep_issue_not_exist = Afhængigt problem eksisterer ikke.
+issues.dependency.add_error_dep_exists = Afhængighed eksisterer allerede.
+issues.dependency.add_error_cannot_create_circular = Du kan ikke oprette en afhængighed med to problemer, der blokerer hinanden.
+issues.dependency.add_error_dep_not_same_repo = Begge problemer skal være i samme depot.
+issues.review.self.approval = Du kan ikke godkende din egen pull-anmodning.
+issues.review.self.rejection = Du kan ikke anmode om ændringer på din egen pull-anmodning.
+issues.review.approve = godkendte disse ændringer %s
+issues.review.comment = gennemgået %s
+issues.review.dismissed_label = Afvist
+issues.review.left_comment = efterladt en kommentar
+issues.review.remove_review_request = fjernet anmodning om gennemgang for %[1]s %[2]s
+issues.review.remove_review_requests = fjernet anmodning om gennemgange for %[1]s %[2]s
+issues.review.remove_review_request_self = nægtede at gennemgå %s
+issues.review.add_remove_review_requests = anmodede om gennemgang fra %[1]s og fjernede gennemgangsanmodninger for %[2]s %[3]s
+issues.review.pending = Afventer
+issues.dependency.add_error_dep_not_exist = Afhængighed eksisterer ikke.
+issues.review.pending.tooltip = Denne kommentar er i øjeblikket ikke synlig for andre brugere. For at indsende dine afventende kommentarer, vælg "%s" -> "%s/%s/%s" øverst på siden.
+issues.review.review = Gennemgå
+issues.review.outdated_description = Indholdet er ændret siden denne kommentar blev lavet
+issues.review.option.show_outdated_comments = Vis forældede kommentarer
+issues.review.reviewers = Gemmengåer
+issues.review.option.hide_outdated_comments = Skjul forældede kommentarer
+issues.review.show_outdated = Vis forældet
+issues.review.hide_resolved = Skjul løst
+issues.content_history.created = oprettet
+issues.review.hide_outdated = Skjul forældede
+issues.review.resolved_by = markerede denne samtale som løst
+issues.reference_issue.body = Body
+issues.content_history.deleted = slettet
+issues.content_history.edited = redigeret
+issues.review.show_resolved = Vis løst
+issues.review.resolve_conversation = Løs samtale
+issues.review.un_resolve_conversation = Uafklaret samtale
+issues.content_history.delete_from_history = Slet fra historikken
+issues.content_history.delete_from_history_confirm = Slet fra historikken?
+issues.content_history.options = Valgmuligheder
+issues.blocked_by_user = Du kan ikke oprette et problem på dette depot, fordi du er blokeret af depotes ejer.
+issues.comment.blocked_by_user = Du kan ikke oprette en kommentar til dette problem, fordi du er blokeret af depotes ejer eller anmelder af problemet.
+issues.reference_link = Reference: %s
+compare.compare_base = base
+compare.compare_head = sammenlign
+pulls.desc = Aktiver pull-anmodninger og kodegennemgange.
+pulls.new = Ny pull anmodning
+pulls.view = Se pull-anmodning
+pulls.compare_changes = Ny pull-anmodning
+issues.summary_card_alt = Oversigtskort over et problem med titlen "%s" i depotet %s
+pulls.edit.already_changed = Kunne ikke gemme ændringer af pull-anmodningen. Det ser ud til, at indholdet allerede er blevet ændret af en anden bruger. Opdater siden, og prøv at redigere igen for at undgå at overskrive deres ændringer
+pulls.sign_in_require = Log ind for at oprette en ny pull-anmodning.
+
+[notification]
+watching = Overvåger
+
+[action]
+watched_repo = begyndte at overvåge %[2]s
\ No newline at end of file
diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini
index 12c241accc..f5e0d314ae 100644
--- a/options/locale/locale_de-DE.ini
+++ b/options/locale/locale_de-DE.ini
@@ -749,7 +749,7 @@ webauthn=Hardware-Sicherheitsschlüssel
public_profile=Öffentliches Profil
biography_placeholder=Erzähle anderen ein wenig über dich selbst! (Markdown wird unterstützt)
location_placeholder=Teile deinen ungefähren Standort mit anderen
-profile_desc=Leg fest, wie dein Profil anderen Benutzern angezeigt wird. Deine primäre E-Mail-Adresse wird für Benachrichtigungen, Passwort-Wiederherstellung und webbasierte Git-Operationen verwendet.
+profile_desc=Über dich
password_username_disabled=Benutzer, die nicht von Forgejo verwaltet werden können ihren Benutzernamen nicht ändern. Bitte kontaktiere deinen Administrator für mehr Details.
full_name=Vollständiger Name
website=Webseite
@@ -814,7 +814,7 @@ manage_emails=E-Mail-Adressen verwalten
manage_themes=Standard-Theme
manage_openid=OpenID-Adressen
email_desc=Deine primäre E-Mail-Adresse wird für Benachrichtigungen, Passwort-Wiederherstellung und, sofern sie nicht versteckt ist, web-basierte Git-Operationen verwendet.
-theme_desc=Dies wird dein Standard-Theme auf der Seite sein.
+theme_desc=Dieses Thema wird für die Weboberfläche verwendet, wenn du angemeldet bist.
primary=Primär
activated=Aktiviert
requires_activation=Erfordert Aktivierung
@@ -840,7 +840,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=Dies wird deine E-Mail-Adresse in deinem Profil ausblenden. Sie wird nicht mehr der Standardwert für die Commits, die vom Web-Interface gemacht wurden, sein, z.B. Dateiuploads und -bearbeitungen, und sie wird nicht für Merge-Commits benutzt werden. Stattdessen kann eine besondere Adresse %s benutzt werden, um Commits mit deinem Konto zu assoziieren. Beachte, dass diese Option für existierende Commits keine Wirkung hat.
+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.
openid_desc=Mit OpenID kannst du dich über einen Drittanbieter authentifizieren.
manage_ssh_keys=SSH-Schlüssel verwalten
@@ -1056,6 +1056,8 @@ language.title = Standardsprache
keep_activity_private.description = Deine öffentliche Aktivität wird nur für dich selbst und die Instanzadminstratoren sichtbar sein.
language.localization_project = Hilf uns, Forgejo in deine Sprache zu übersetzen! Mehr erfahren .
language.description = Diese Sprache wird in deinem Konto gespeichert und standardmäßig nach dem Anmelden benutzt.
+user_block_yourself = Du kannst dich nicht selbst blockieren.
+pronouns_custom_label = Individuelle Pronomen
[repo]
owner=Besitzer
@@ -1097,11 +1099,11 @@ issue_labels=Labels
issue_labels_helper=Wähle eine Label-Sammlung
license=Lizenz
license_helper=Wähle eine Lizenz
-license_helper_desc=Eine Lizenz regelt, was andere mit deinem Code tun (oder nicht tun) können. Unsicher, welches für dein Projekt die Richtige ist? Siehe Choose a license.
+license_helper_desc=Eine Lizenz regelt, was andere mit deinem Code tun (oder nicht tun) können. Unsicher, welches für dein Projekt die Richtige ist? Siehe Choose a license .
readme=README
readme_helper=Wähle eine README-Vorlage
readme_helper_desc=Hier kannst du eine komplette Beschreibung für dein Projekt schreiben.
-auto_init=Repository initialisieren (Fügt .gitignore, License und README-Dateien hinzu)
+auto_init=Repository initialisieren
trust_model_helper=Wähle das Vertrauensmodell für die Signaturvalidierung aus. Mögliche Modelle sind:
trust_model_helper_collaborator=Mitarbeiter: Vertraue Signaturen von Mitarbeitern am Projekt
trust_model_helper_committer=Committer: Vertraue Signaturen, die mit ihren Committern übereinstimmen
@@ -1179,8 +1181,8 @@ template.invalid=Es muss ein Vorlagen-Repository ausgewählt werden
archive.title=Dieses Repository ist archiviert. Du kannst Dateien ansehen und es klonen, kannst aber nicht pushen oder Issues/Pull-Requests öffnen.
archive.title_date=Dieses Repository wurde am %s archiviert. Du kannst Dateien ansehen und es klonen, aber nicht pushen oder Issues/Pull-Requests öffnen.
-archive.issue.nocomment=Dieses Repo ist archiviert. Du kannst Issues nicht kommentieren.
-archive.pull.nocomment=Dieses Repo ist archiviert. Du kannst Pull-Requests nicht kommentieren.
+archive.issue.nocomment=Dieses Repository ist archiviert. Du kannst Issues nicht kommentieren.
+archive.pull.nocomment=Dieses Repository ist archiviert. Du kannst Pull-Requests nicht kommentieren.
form.reach_limit_of_creation_1=Du hast bereits dein Limit von %d Repository erreicht.
form.reach_limit_of_creation_n=Du hast bereits dein Limit von %d Repositorys erreicht.
@@ -2490,8 +2492,8 @@ settings.archive.text=Durch das Archivieren wird ein Repo vollständig schreibge
settings.archive.success=Das Repo wurde erfolgreich archiviert.
settings.archive.error=Beim Versuch, das Repository zu archivieren, ist ein Fehler aufgetreten. Weitere Details finden sich im Log.
settings.archive.error_ismirror=Du kannst kein gespiegeltes Repo archivieren.
-settings.archive.branchsettings_unavailable=Branch-Einstellungen sind nicht verfügbar wenn das Repo archiviert ist.
-settings.archive.tagsettings_unavailable=Tag Einstellungen sind nicht verfügbar, wenn das Repo archiviert wurde.
+settings.archive.branchsettings_unavailable=Branch-Einstellungen sind nicht verfügbar in archivierten Repos.
+settings.archive.tagsettings_unavailable=Tag-Einstellungen sind nicht verfügbar in archivierten Repos.
settings.unarchive.button=Archivierung zurücksetzen
settings.unarchive.header=Archivierung dieses Repositorys zurücksetzen
settings.unarchive.text=Durch das Aufheben der Archivierung kann das Repo wieder Commits und Pushes sowie neue Issues und Pull-Requests empfangen.
@@ -2690,7 +2692,7 @@ error.csv.too_large=Diese Datei kann nicht gerendert werden, da sie zu groß ist
error.csv.unexpected=Diese Datei kann nicht gerendert werden, da sie ein unerwartetes Zeichen in Zeile %d und Spalte %d enthält.
error.csv.invalid_field_count=Diese Datei kann nicht gerendert werden, da sie eine falsche Anzahl an Feldern in Zeile %d hat.
rss.must_be_on_branch = Du musst auf einem Branch sein, um einen RSS-Feed zu haben.
-new_repo_helper = Ein Repository enthält alle Projektdateien inklusive der Revisionshistorie. Bereits woanders gehostet? Repository migrieren.
+new_repo_helper = Ein Repository enthält alle Projektdateien inklusive der Revisionshistorie. Bereits woanders gehostet? Repository migrieren .
issues.comment.blocked_by_user = Du kannst kein Kommentar für dieses Issue erstellen, weil du vom Repository-Besitzer oder dem Autoren des Issues blockiert wurdest.
clone_in_vscodium = In VSCodium klonen
settings.units.add_more = Mehr aktivieren
@@ -2704,7 +2706,7 @@ settings.add_collaborator_blocked_them = Der Mitarbeiter konnte nicht hinzugefü
settings.wiki_rename_branch_main = Den Wiki-Branch-Namen normalisieren
settings.enter_repo_name = Gib den Besitzer- und den Repository-Namen genau wie angezeigt ein:
settings.wiki_branch_rename_success = Der Branch-Name des Repository-Wikis wurde erfolgreich normalisiert.
-settings.archive.mirrors_unavailable = Spiegel sind nicht verfügbar, wenn das Repo archiviert ist.
+settings.archive.mirrors_unavailable = Spiegel sind nicht verfügbar in archivierten Repos.
pulls.blocked_by_user = Du kannst keinen Pull-Request in diesem Repository erstellen, weil du vom Repository-Besitzer blockiert wurdest.
settings.add_collaborator_blocked_our = Der Mitarbeiter konnte nicht hinzugefügt werden, weil der Repository-Besitzer ihn blockiert hat.
issues.blocked_by_user = Du kannst kein Issue in diesem Repository erstellen, weil du vom Repository-Besitzer blockiert wurdest.
@@ -2851,6 +2853,21 @@ issues.num_reviews_one = %d Review
issues.summary_card_alt = Zusammenfassung eines Issues mit dem Titel „%s“ im Repository %s
issues.num_reviews_few = %d Reviews
editor.add_tmpl.filename = Dateiname
+settings.default_update_style_desc = Standard-Aktualisierungsart um Pull-Requests zu aktualisieren, die hinter dem Base-Branch sind.
+new_advanced = Erweiterte Einstellungen
+new_advanced_expand = Zum Ausklappen klicken
+pulls.sign_in_require = Anmelden , um einen neuen Pull-Request zu erstellen.
+new_from_template = Eine Vorlage benutzen
+new_from_template_description = Du kannst eine existierende Repository-Vorlage auf dieser Instanz benutzen und ihre Einstellungen anwenden.
+auto_init_description = Die Git-Historie mit einer README-Datei und optional einer Lizenz- und .gitignore-Datei starten.
+issues.context.menu = Kommentar Menü
+issues.reaction.add = Reaktion hinzufügen
+issues.reaction.alt_many = %[1]s und %[2]d mehr reagierten %[3]s.
+issues.reaction.alt_few = %[1]s reagierten %[2]s.
+issues.reaction.alt_add = Füge %[1]s Reaktion zum Kommentar hinzu.
+issues.reaction.alt_remove = Entferne %[1]s Reaktion von diesem Kommentar.
+summary_card_alt = Zusammenfassungskarte des Repositorys %s
+release.summary_card_alt = Übersichtskarte eines Releases mit dem Titel „%s“ im Repository %s
[graphs]
component_loading_failed = Konnte %s nicht laden
@@ -3544,6 +3561,7 @@ emails.delete = E-Mail löschen
emails.deletion_success = Die E-Mail-Adresse wurde gelöscht.
emails.delete_primary_email_error = Du kannst die primäre E-Mail nicht löschen.
emails.delete_desc = Bist du dir sicher, dass du diese E-Mail-Adresse löschen willst?
+monitor.duration = Dauer (s)
[action]
@@ -3686,12 +3704,12 @@ conan.registry=Diese Registry über die Kommandozeile einrichten:
conan.install=Um das Paket mit Conan zu installieren, führe den folgenden Befehl aus:
conda.registry=Richte diese Registry als Conda-Repository in deiner .condarc
-Datei ein:
conda.install=Um das Paket mit Conda zu installieren, führe den folgenden Befehl aus:
-container.details.type=Container-Image Typ
+container.details.type=Abbildtyp
container.details.platform=Plattform
container.pull=Downloade das Container-Image aus der Kommandozeile:
container.digest=Digest
container.multi_arch=Betriebsystem / Architektur
-container.layers=Container-Image Ebenen
+container.layers=Abbildebenen
container.labels=Labels
container.labels.key=Schlüssel
container.labels.value=Wert
@@ -3805,6 +3823,14 @@ arch.version.replaces = Ersetzt
arch.version.backup = Backup
arch.version.optdepends = Optionale Abhängigkeit
container.images.title = Bilder
+search_in_external_registry = In %s suchen
+alt.registry = Diese Registry von der Befehlszeile aus einrichten:
+alt.registry.install = Um das Paket zu installieren, folgenden Befehl ausführen:
+alt.install = Paket installieren
+alt.setup = Ein Repository zur Liste der verbundenen Repositorys hinzufügen (wähle die nötige Architektur anstelle von „_arch_“):
+alt.repository = Repository-Infos
+alt.repository.architectures = Architekturen
+alt.repository.multiple_groups = Dieses Paket ist in verschiedenen Gruppen verfügbar.
[secrets]
secrets=Secrets
@@ -3958,7 +3984,7 @@ package_kind = Pakete suchen …
project_kind = Projekte suchen …
branch_kind = Branches suchen …
commit_kind = Commits suchen …
-runner_kind = Runners suchen …
+runner_kind = Runner suchen …
no_results = Keine passenden Ergebnisse gefunden.
code_search_unavailable = Die Code-Suche ist momentan nicht verfügbar. Bitte kontaktiere den Webseitenadministrator.
keyword_search_unavailable = Die Suche mittels Schlüsselwort ist momentan nicht verfügbar. Bitte kontaktiere den Webseitenadministrator.
diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini
index a32d616814..cb99563034 100644
--- a/options/locale/locale_el-GR.ini
+++ b/options/locale/locale_el-GR.ini
@@ -166,6 +166,7 @@ new_org.link = Νέος οργανισμός
new_migrate.title = Νέα μεταφορά
new_repo.title = Νέο repository
new_org.title = Νέος οργανισμός
+copy_path = Αντιγραφή τοποθεσίας
[aria]
navbar=Μπάρα πλοήγησης
@@ -197,8 +198,14 @@ buttons.ref.tooltip=Μνημόνευση ενός θέματος ή pull request
buttons.switch_to_legacy.tooltip=Χρήση του κλασσικού κειμενογράφου
buttons.enable_monospace_font=Ενεργοποίηση σταθερής γραμματοσειράς
buttons.disable_monospace_font=Απενεργοποίηση σταθερής γραμματοσειράς
-buttons.unindent.tooltip = Αναίρεση στοιχείων κατά ένα επίπεδο
-buttons.indent.tooltip = Στοιχεία φωλιών κατά ένα επίπεδο
+buttons.unindent.tooltip = Μείωση εσοχής στοιχείων κατά ένα επίπεδο
+buttons.indent.tooltip = Αύξηση εσοχής στοιχείων κατά ένα επίπεδο
+table_modal.header = Προσθήκη πίνακα
+table_modal.placeholder.header = Επικεφαλίδα
+table_modal.placeholder.content = Περιεχόμενο
+table_modal.label.rows = Σειρές
+table_modal.label.columns = Στήλες
+buttons.new_table.tooltip = Προσθήκη πίνακα
[filter]
string.asc=A - Z
@@ -249,9 +256,9 @@ err_empty_db_path=Η διαδρομή της βάσης δεδομένων SQLit
no_admin_and_disable_registration=Δεν μπορείτε να απενεργοποιήσετε την ιδιο-εγγραφή χρήστη χωρίς να έχετε δημιουργήσει διαχειριστικό λογαριασμό.
err_empty_admin_password=Ο κωδικός πρόσβασης του διαχειριστή δεν μπορεί να είναι κενός.
err_empty_admin_email=Το email του διαχειριστή δεν μπορεί να είναι κενό.
-err_admin_name_is_reserved=Το Όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο, είναι δεσμευμένο
+err_admin_name_is_reserved=Το όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο, αυτό το όνομα είναι δεσμευμένο
err_admin_name_pattern_not_allowed=Το Όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο, ταιριάζει σε μια δεσμευμένη μορφή
-err_admin_name_is_invalid=Το Όνομα Χρήστη του Διαχειριστή δεν είναι έγκυρο
+err_admin_name_is_invalid=Το όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο
general_title=Γενικές ρυθμίσεις
app_name=Τίτλος διακομιστή
@@ -476,6 +483,8 @@ hint_register = Χρειάζεστε έναν λογαριασμό; Αλλαγή ορατότητας .
public_activity.visibility_hint.self_private = Η δραστηριότητά σας είναι ορατή μόνο σε εσάς και στους διαχειριστές. Αλλαγή ορατότητας .
+public_activity.visibility_hint.self_private_profile = Η δραστηριότητά σας είναι ορατή μόνο σε εσάς και τους διαχειριστές του διακομιστή καθώς το προφίλ σας είναι ιδιωτικό Αλλαγή ορατότητας .
[settings]
profile=Προφίλ
@@ -736,9 +746,9 @@ uid=UID
webauthn=Πιστοποίηση δύο παραγόντων (Κλειδιά Ασφαλείας)
public_profile=Δημόσιο προφίλ
-biography_placeholder=Πείτε μας λίγο για τον εαυτό σας! (Μπορείτε να γράψετε με Markdown)
+biography_placeholder=Πείτε λίγα πράγματα για τον εαυτό σας! (Μπορείτε να γράψετε με Markdown)
location_placeholder=Μοιραστείτε την κατά προσέγγιση τοποθεσία σας με άλλους
-profile_desc=Ελέγξτε πώς εμφανίζεται το προφίλ σας σε άλλους χρήστες. Η κύρια διεύθυνση email σας θα χρησιμοποιηθεί για ειδοποιήσεις, ανάκτηση κωδικού πρόσβασης και λειτουργίες Git που βασίζονται στο web.
+profile_desc=Σχετικά με εσάς
password_username_disabled=Οι μη τοπικοί χρήστες δεν επιτρέπεται να αλλάξουν το όνομα χρήστη τους. Επικοινωνήστε με το διαχειριστή σας για περισσότερες λεπτομέρειες.
full_name=Πλήρες όνομα
website=Ιστοσελίδα
@@ -803,7 +813,7 @@ manage_emails=Διαχείριση διευθύνσεων email
manage_themes=Προεπιλεγμένο θέμα
manage_openid=Διευθύνσεις OpenID
email_desc=Η κύρια διεύθυνση ηλεκτρονικού ταχυδρομείου σας θα χρησιμοποιηθεί για ειδοποιήσεις, ανάκτηση του κωδικού πρόσβασης και, εφόσον δεν είναι κρυμμένη, λειτουργίες Git στον ιστότοπο.
-theme_desc=Αυτό θα είναι το προεπιλεγμένο θέμα διεπαφής σας σε όλη την ιστοσελίδα.
+theme_desc=Αυτό θα είναι το προεπιλεγμένο θέμα διεπαφής σας όταν είστε συνδεδεμένοι.
primary=Κύριο
activated=Ενεργό
requires_activation=Απαιτείται ενεργοποίηση
@@ -1038,13 +1048,14 @@ pronouns = Αντωνυμίες
pronouns_custom = κάτι άλλο
pronouns_unspecified = Απροσδιόριστες
hints = Συμβουλές
-additional_repo_units_hint_description = Εμφάνιση κουμπιού «Προσθήκη μονάδων...» σε αποθετήρια που δεν έχουν ενεργοποιημένες όλες τις διαθέσιμες μονάδες.
+additional_repo_units_hint_description = Εμφάνιση υπόδειξης «Προσθήκη μονάδων...» σε αποθετήρια που δεν έχουν ενεργοποιημένες όλες τις διαθέσιμες μονάδες.
update_hints = Ενημέρωση συμβουλών
update_hints_success = Οι συμβουλές ενημερώθηκαν.
language.title = Προεπιλεγμένη γλώσσα
keep_activity_private.description = Η δημόσια δραστηριότητά σας θα είναι ορατή μόνο σε εσάς και στους διαχειριστές.
language.localization_project = Βοηθήστε μας να μεταφράσουμε το Forgejo στην γλώσσα σας! Περισσότερες πληροφορίες .
language.description = Από εδώ και στο εξής, αυτή η γλώσσα θα χρησιμοποιείται από προεπιλογή για τον λογαριασμό σας.
+pronouns_custom_label = Ειδικές αντωνυμίες
[repo]
new_repo_helper=Ένα repository περιέχει όλα τα αρχεία έργου, συμπεριλαμβανομένου του ιστορικού εκδόσεων. Έχετε ήδη ένα που φιλοξενείται κάπου αλλού; Μεταφορά αποθετηρίου.
@@ -3929,6 +3940,8 @@ exact = Ακριβής
milestone_kind = Αναζήτηση ορόσημων...
union = Ένωση
union_tooltip = Να συμπεριληφθούν αποτελέσματα που περιέχουν οποιαδήποτε από τις λέξεις που έχουν εισαχθεί και διαχωριστεί με κενό
+regexp = Κανονική Έκφραση
+regexp_tooltip = Ερμηνεία του όρου αναζήτησης ως κανονική έκφραση
[munits.data]
mib = MiB
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 3b413b8f92..2c7dbe69ad 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -190,7 +190,6 @@ commit_kind = Search commits...
runner_kind = Search runners...
no_results = No matching results found.
issue_kind = Search issues...
-milestone_kind = Search milestones...
pull_kind = Search pulls...
keyword_search_unavailable = Searching by keyword is currently not available. Please contact the site administrator.
@@ -631,6 +630,7 @@ lang_select_error = Select a language from the list.
username_been_taken = The username is already taken.
username_change_not_local_user = Non-local users are not allowed to change their username.
+username_claiming_cooldown = The username cannot be claimed, because its cooldown period is not yet over. It can be claimed on %[1]s.
repo_name_been_taken = The repository name is already used.
repository_force_private = Force Private is enabled: private repositories cannot be made public.
repository_files_already_exist = Files already exist for this repository. Contact the system administrator.
@@ -748,13 +748,14 @@ blocked_users = Blocked users
public_profile = Public profile
biography_placeholder = Tell others a little bit about yourself! (Markdown is supported)
location_placeholder = Share your approximate location with others
-profile_desc = Control how your profile is shown to other users. Your primary email address will be used for notifications, password recovery and web-based Git operations.
+profile_desc = About you
password_username_disabled = Non-local users are not allowed to change their username. Please contact your site administrator for more details.
full_name = Full name
website = Website
location = Location
pronouns = Pronouns
pronouns_custom = Custom
+pronouns_custom_label = Custom pronouns
pronouns_unspecified = Unspecified
update_theme = Change theme
update_profile = Update profile
@@ -765,6 +766,8 @@ update_profile_success = Your profile has been updated.
change_username = Your username has been changed.
change_username_prompt = Note: Changing your username also changes your account URL.
change_username_redirect_prompt = The old username will redirect until someone claims it.
+change_username_redirect_prompt.with_cooldown.one = The old username will be available to everyone after a cooldown period of %[1]d day, you can still reclaim the old username during the cooldown period.
+change_username_redirect_prompt.with_cooldown.few = The old username will be available to everyone after a cooldown period of %[1]d days, you can still reclaim the old username during the cooldown period.
continue = Continue
cancel = Cancel
language = Language
@@ -849,7 +852,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 = This will hide your email address from your profile. It will no longer be the default for commits made via the web interface, like file uploads and edits, and will not be used for merge commits. Instead a special address %s can be used to associate commits with your account. Note that changing this option will not affect existing commits.
+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.
openid_desc = OpenID lets you delegate authentication to an external provider.
manage_ssh_keys = Manage SSH keys
@@ -1042,6 +1045,7 @@ visibility.private_tooltip = Visible only to members of organizations you have j
blocked_since = Blocked since %s
user_unblock_success = The user has been unblocked successfully.
user_block_success = The user has been blocked successfully.
+user_block_yourself = You cannot block yourself.
[repo]
rss.must_be_on_branch = You must be on a branch to have an RSS feed.
@@ -1053,6 +1057,10 @@ admin.failed_to_replace_flags = Failed to replace repository flags
admin.flags_replaced = Repository flags replaced
new_repo_helper = A repository contains all project files, including revision history. Already hosting one elsewhere? Migrate repository .
+new_from_template = Use a template
+new_from_template_description = You can select an existing repository template on this instance and apply its settings.
+new_advanced = Advanced settings
+new_advanced_expand = Click to expand
owner = Owner
owner_helper = Some organizations may not show up in the dropdown due to a maximum repository count limit.
repo_name = Repository name
@@ -1099,7 +1107,8 @@ object_format_helper = Object format of the repository. Cannot be changed later.
readme = README
readme_helper = Select a README file template
readme_helper_desc = This is the place where you can write a complete description for your project.
-auto_init = Initialize repository (Adds .gitignore, License and README)
+auto_init = Initialize repository
+auto_init_description = Start the Git history with a README and optionally add License and .gitignore files.
create_repo = Create repository
default_branch = Default branch
default_branch_label = default
@@ -1148,6 +1157,7 @@ blame_prior = View blame prior to this change
blame.ignore_revs = Ignoring revisions in .git-blame-ignore-revs . Click here to bypass and see the normal blame view.
blame.ignore_revs.failed = Failed to ignore revisions in .git-blame-ignore-revs .
author_search_tooltip = Shows a maximum of 30 users
+summary_card_alt = Summary card of repository %s
tree_path_not_found_commit = Path %[1]s doesn't exist in commit %[2]s
tree_path_not_found_branch = Path %[1]s doesn't exist in branch %[2]s
@@ -1178,10 +1188,10 @@ template.issue_labels = Issue labels
template.one_item = Must select at least one template item
template.invalid = Must select a template repository
-archive.title = This repo is archived. You can view files and clone it, but cannot push or open issues or pull requests.
+archive.title = This repository is archived. You can view files and clone it, but cannot push or open issues or pull requests.
archive.title_date = This repository has been archived on %s. You can view files and clone it, but cannot push or open issues or pull requests.
-archive.issue.nocomment = This repo is archived. You cannot comment on issues.
-archive.pull.nocomment = This repo is archived. You cannot comment on pull requests.
+archive.issue.nocomment = This repository is archived. You cannot comment on issues.
+archive.pull.nocomment = This repository is archived. You cannot comment on pull requests.
form.reach_limit_of_creation_1 = The owner has already reached the limit of %d repository.
form.reach_limit_of_creation_n = The owner has already reached the limit of %d repositories.
@@ -1628,6 +1638,12 @@ issues.num_reviews_one = %d review
issues.num_reviews_few = %d reviews
issues.commented_at = `commented %s `
issues.delete_comment_confirm = Are you sure you want to delete this comment?
+issues.reaction.add = Add reaction
+issues.reaction.alt_few = %[1]s reacted %[2]s.
+issues.reaction.alt_many = %[1]s and %[2]d more reacted %[3]s.
+issues.reaction.alt_remove = Remove %[1]s reaction from comment.
+issues.reaction.alt_add = Add %[1]s reaction to comment.
+issues.context.menu = Comment menu
issues.context.copy_link = Copy link
issues.context.quote_reply = Quote reply
issues.context.reference_issue = Reference in a new issue
@@ -1845,6 +1861,7 @@ pulls.new = New pull request
pulls.view = View pull request
pulls.edit.already_changed = Unable to save changes to the pull request. It appears the content has already been changed by another user. Please refresh the page and try editing again to avoid overwriting their changes
pulls.compare_changes = New pull request
+pulls.sign_in_require = Sign in to create a new pull request.
pulls.allow_edits_from_maintainers = Allow edits from maintainers
pulls.allow_edits_from_maintainers_desc = Users with write access to the base branch can also push to this branch
pulls.allow_edits_from_maintainers_err = Updating failed
@@ -1872,10 +1889,6 @@ pulls.nothing_to_compare_have_tag = The selected branch/tag are equal.
pulls.nothing_to_compare_and_allow_empty_pr = These branches are equal. This PR will be empty.
pulls.has_pull_request = `A pull request between these branches already exists: %[2]s#%[3]d `
pulls.create = Create pull request
-pulls.title_desc_one = wants to merge %[1]d commit from %[2]s
into %[3]s
-pulls.title_desc_few = wants to merge %[1]d commits from %[2]s
into %[3]s
-pulls.merged_title_desc_one = merged %[1]d commit from %[2]s
into %[3]s
%[4]s
-pulls.merged_title_desc_few = merged %[1]d commits from %[2]s
into %[3]s
%[4]s
pulls.change_target_branch_at = `changed target branch from %s to %s %s`
pulls.tab_conversation = Conversation
pulls.tab_commits = Commits
@@ -2633,7 +2646,6 @@ diff.git-notes.remove-header = Remove note
diff.git-notes.remove-body = This note will be removed.
diff.data_not_available = Diff content is not available
diff.options_button = Diff options
-diff.show_diff_stats = Show stats
diff.download_patch = Download patch file
diff.download_diff = Download diff file
diff.show_split_view = Split view
@@ -2741,6 +2753,7 @@ release.asset_name = Asset name
release.asset_external_url = External URL
release.add_external_asset = Add external asset
release.invalid_external_url = Invalid external URL: "%s"
+release.summary_card_alt = Summary card of an release titled "%s" in repository %s
branch.name = Branch name
branch.already_exists = A branch named "%s" already exists.
@@ -2783,7 +2796,7 @@ tag.create_tag_from = Create new tag from "%s"
tag.create_success = Tag "%s" has been created.
-topic.manage_topics = Manage Topics
+topic.manage_topics = Manage topics
topic.done = Done
topic.count_prompt = You cannot select more than 25 topics
topic.format_prompt = Topics must start with a letter or number, can include dashes ("-") and dots ("."), can be up to 35 characters long. Letters must be lowercase.
@@ -2873,6 +2886,8 @@ settings.update_settings = Update settings
settings.update_setting_success = Organization settings have been updated.
settings.change_orgname_prompt = Note: Changing the organization name will also change your organization's URL and free the old name.
settings.change_orgname_redirect_prompt = The old name will redirect until it is claimed.
+settings.change_orgname_redirect_prompt.with_cooldown.one = The old username will be available to everyone after a cooldown period of %[1]d day, you can still reclaim the old username during the cooldown period.
+settings.change_orgname_redirect_prompt.with_cooldown.few = The old username will be available to everyone after a cooldown period of %[1]d days, you can still reclaim the old username during the cooldown period.
settings.update_avatar_success = The organization's avatar has been updated.
settings.delete = Delete organization
settings.delete_account = Delete this organization
@@ -3053,7 +3068,7 @@ dashboard.sync_tag.started = Tag sync started
dashboard.rebuild_issue_indexer = Rebuild issue indexer
users.user_manage_panel = Manage user accounts
-users.new_account = Create User Account
+users.new_account = Create user account
users.name = Username
users.full_name = Full name
users.activated = Activated
@@ -3448,6 +3463,7 @@ monitor.process = Running Processes
monitor.stacktrace = Stacktrace
monitor.processes_count = %d Processes
monitor.download_diagnosis_report = Download diagnosis report
+monitor.duration = Duration (s)
monitor.desc = Description
monitor.start = Start Time
monitor.execute_time = Execution Time
@@ -3626,6 +3642,7 @@ versions = Versions
versions.view_all = View all
dependency.id = ID
dependency.version = Version
+search_in_external_registry = Search in %s
alpine.registry = Setup this registry by adding the url in your /etc/apk/repositories
file:
alpine.registry.key = Download the registry public RSA key into the /etc/apk/keys/
folder to verify the index signature:
alpine.registry.info = Choose $branch and $repository from the list below.
@@ -3678,7 +3695,7 @@ cran.install = To install the package, run the following command:
debian.registry = Setup this registry from the command line:
debian.registry.info = Choose $distribution and $component from the list below.
debian.install = To install the package, run the following command:
-debian.repository = Repository Info
+debian.repository = Repository info
debian.repository.distributions = Distributions
debian.repository.components = Components
debian.repository.architectures = Architectures
@@ -3709,9 +3726,16 @@ rpm.registry = Setup this registry from the command line:
rpm.distros.redhat = on RedHat based distributions
rpm.distros.suse = on SUSE based distributions
rpm.install = To install the package, run the following command:
-rpm.repository = Repository Info
+rpm.repository = Repository info
rpm.repository.architectures = Architectures
rpm.repository.multiple_groups = This package is available in multiple groups.
+alt.registry = Setup this registry from the command line:
+alt.registry.install = To install the package, run the following command:
+alt.install = Install package
+alt.setup = Add a repository to the list of connected repositories (choose the necessary architecture instead of '_arch_'):
+alt.repository = Repository info
+alt.repository.architectures = Architectures
+alt.repository.multiple_groups = This package is available in multiple groups.
rubygems.install = To install the package using gem, run the following command:
rubygems.install2 = or add it to the Gemfile:
rubygems.dependencies.runtime = Runtime dependencies
@@ -3905,6 +3929,4 @@ filepreview.lines = Lines %[1]d to %[2]d in %[3]s
filepreview.truncated = Preview has been truncated
[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 :)
-
-
+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
diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini
index 4f9d141423..ec0239648c 100644
--- a/options/locale/locale_es-ES.ini
+++ b/options/locale/locale_es-ES.ini
@@ -1053,6 +1053,8 @@ change_password = Cambiar contraseña
keep_activity_private.description = Tu actividad pública solo será visible para ti y para los administradores de la instancia.
language.description = Este idioma se guardará en tu cuenta y se utilizará como predeterminado cuando te conectes.
language.localization_project = ¡Ayúdanos a traducir Forgejo a tu idioma! Más información .
+pronouns_custom_label = Pronombres personalizados
+user_block_yourself = No puedes bloquearte a tí mismo.
[repo]
owner=Propietario
@@ -1098,7 +1100,7 @@ license_helper_desc=Una licencia regula lo que otros pueden y no pueden hacer co
readme=LÉAME
readme_helper=Selecciona una plantilla de archivo README
readme_helper_desc=Este es el lugar donde puedes escribir una descripción completa de su proyecto.
-auto_init=Inicializar el repositorio (añade .gitignore, licencia y README)
+auto_init=Inicializar el repositorio
trust_model_helper=Seleccionar modelo de confianza para la verificación de la firma. Las opciones posibles son:
trust_model_helper_collaborator=Colaborador: Confiar en firmas de colaboradores
trust_model_helper_committer=Comitter: Firmas de confianza que coinciden con los committers
@@ -2814,6 +2816,19 @@ 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 se eliminará.
+editor.add_tmpl.filename = nombre de fichero
+issues.reaction.add = Añadir reacción
+issues.reaction.alt_remove = Quitar %[1]s reacción de comentario.
+issues.reaction.alt_add = Añadir %[1]s reacción al comentario.
+issues.review.add_review_requests = solicitada revisiones de %[1]s %[2]s
+issues.review.remove_review_requests = eliminada la solicitud de revisiones para %[1]s %[2]s
+new_from_template = Usa una plantilla
+new_from_template_description = Puedes seleccionar una plantilla de repositorio ya existente en esta instancia y aplicar sus ajustes.
+new_advanced = Ajustes avanzados
+new_advanced_expand = Click para expandir
+issues.num_reviews_one = %d revisión
+issues.num_reviews_few = %d revisiones
+auto_init_description = Empieza el historial Git con un README y opcionalmente añade una Licencia y archivos .gitignore.
[graphs]
component_loading = Cargando %s...
diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini
index b3864d4e83..dd1f97bd00 100644
--- a/options/locale/locale_fi-FI.ini
+++ b/options/locale/locale_fi-FI.ini
@@ -119,7 +119,7 @@ new_project_column = Uusi sarake
retry = Yritä uudelleen
copy_type_unsupported = Tätä tiedostotyyppiä ei voi kopioida
locked = Lukittu
-filter = Suodatin
+filter = Suodata
filter.is_archived = Arkistoitu
filter.not_archived = Ei arkistoitu
filter.public = Julkinen
@@ -166,6 +166,7 @@ filter.not_fork = Ei forkkeja
filter.not_template = Ei mallipohjat
filter.not_mirror = Ei peilattu
copy_path = Kopioi polku
+concept_user_individual = Yksittäinen
[aria]
footer.links = Linkit
@@ -204,6 +205,7 @@ table_modal.placeholder.header = Otsikko
table_modal.placeholder.content = Sisältö
table_modal.label.rows = Rivit
table_modal.label.columns = Sarakkeet
+buttons.unindent.tooltip = Vähennä sisennystä yhden tason verran
[filter]
string.asc = A - Ö
@@ -231,7 +233,7 @@ install_desc = Suorita alustallesi suunnattu ohjeet ennen minkään asetuksen muuttamista.
require_db_desc=Forgejo tarvitsee toimiakseen MySQL-, PostgreSQL-, SQLite3- tai TiDB- (MySQL-protokolla) tietokannan.
db_title=Tietokannan asetukset
@@ -292,7 +294,7 @@ disable_gravatar.description=Poista Gravatar ja kolmannen osapuolen avaratir kä
federated_avatar_lookup=Käytä federoituja profiilikuvia
federated_avatar_lookup.description=Käytä Libravatar-palvelua profiilikuvien hakemiseen.
disable_registration=Poista omatoiminen rekisteröityminen käytöstä
-disable_registration.description=Poista käyttäjän itse-rekisteröinti, vain ylläpito voi luoda tilejä.
+disable_registration.description=Vain järjestelmänvalvojat voivat luoda uusia käyttäjiä. On suositeltavaa pitää rekisteröinti suljettuna mikäli kyseessä ei ole julkinen instanssi jota varten tarvitsee hallinnoida suuria määriä roskapostikäyttäjiä.
allow_only_external_registration.description=Käyttäjät voivat luoda uusia käyttäjiä vain erikseen konfiguroituja ulkoisia palveluja käyttäen.
openid_signin=Ota OpenID-kirjautuminen käyttöön
openid_signin.description=Salli OpenID:n kautta kirjautuminen.
@@ -319,7 +321,7 @@ default_keep_email_private=Piilota sähköpostiosoitteet oletuksena
default_keep_email_private.description=Piilota oletusarvoisesti uusien käyttäjätilien sähköpostiosoitteet estääksesi tietojen vuotamisen rekisteröinnin yhteydessä.
default_enable_timetracking=Ota ajanseuranta oletusarvoisesti käyttöön
default_enable_timetracking.description=Salli uusien repositorioiden aikaseurannan käyttöönotto oletusarvoisesti.
-no_reply_address=Piilotettu sähköpostin verkkotunnus
+no_reply_address=Piilotetun sähköpostin verkkotunnus
no_reply_address_helper=Verkkotunnuksen nimi käyttäjille, joilla on piilotettu sähköpostiosoite. Esimerkiksi käyttäjätunnus 'joe' kirjataan Git-palveluun nimellä 'joe@noreply.example.org' jos piilotetun sähköpostiosoitteen arvoksi on asetettu 'noreply.example.org'.
password_algorithm=Salasanan hajautusalgoritmi
enable_update_checker_helper_forgejo = Se tarkistaa tietyin väliajoin uusia Forgejo-versioita tutkimalla sen TXT DNS record -tietoja osoitteesta release.forgejo.org .
@@ -345,6 +347,7 @@ app_slogan = Instanssin tunnuslause
app_slogan_helper = Syötä instanssin tunnuslause tähän. Jätä tyhjäksi poistaaksesi käytöstä.
domain_helper = Palvelimen verkkotunnus tai isäntänimi.
smtp_from_invalid = "Lähetä sähköpostit osoitteella"-osoite on virheellinen
+err_admin_name_pattern_not_allowed = Ylläpitäjän käyttäjätunnus on virheellinen, se vastaa varattua kaaviota
[home]
uname_holder=Käyttäjätunnus tai sähköpostiosoite
@@ -461,6 +464,17 @@ change_unconfirmed_email = Jos annoit väärän sähköpostiosoitteen rekisterö
invalid_code_forgot_password = Vahvistuskoodisi on virheellinen tai vanhentunut. Napsauta tästä aloittaaksesi uuden istunnon.
openid_signin_desc = Kirjoita OpenID-URI:si. Esimerkki: alice.openid.example.org tai https://openid.example.org/alice.
change_unconfirmed_email_summary = Vaihda sähköpostiosoite, johon aktivointisähköposti lähetetään.
+reset_password_wrong_user = Olet kirjautuneena tilillä %s, mutta tilin palautuslinkki on tarkoitettu tilille %s
+last_admin = Et voi poistaa viimeistä ylläpitäjää. Ylläpitäjiä tulee olla vähintään yksi.
+password_pwned = Valitsemasi salasana on varastettujen salasanojen listalla , eli se on paljastanut jossain julkisessa tietovuodossa. Kokeile asettaa eri salasana, ja jos käytät samaa salasanaa muissa palveluissa, vaihda kyseinen salasana.
+use_onetime_code = Käytä kertakäyttöiskoodia
+unauthorized_credentials = Kirjautumistiedot ovat virheelliset tai vanhentuneet. Yritä suorittaa komento uudelleen tai katso %s saadaksesi lisätietoja
+oauth.signin.error.temporarily_unavailable = Valtuus epäonnistui, koska todennuspalvelin ei ole tällä hetkellä käytettävissä. Yritä uudelleen myöhemmin.
+disable_forgot_password_mail = Tilin palautus ei ole käytössä, koska sähköpostia ei ole määritetty. Ota yhteys sivuston ylläpitoon.
+password_pwned_err = Pyyntöä HaveIBeenPwned-palveluun ei voitu suorittaa
+authorization_failed_desc = Valtuus epäonnistui, koska havaitsimme virheellisen pyynnön. Ota yhteys sen sovelluksen ylläpitäjään, jota yritit valtuuttaa.
+oauth.signin.error = Valtuuspyynnön käsittelyssä tapahtui virhe. Jos virhe toistuu, ota yhteys sivuston ylläpitoon.
+disable_forgot_password_mail_admin = Tilin palautus on käytössä vain, jos sähköposti on määritetty. Aseta sähköposti, jotta tilin palauttaminen on mahdollista ottaa käyttöön.
[mail]
view_it_on=Näytä %s
@@ -514,6 +528,13 @@ account_security_caution.text_1 = Jos se olit sinä, voit jättää tämän vies
issue.action.approve = @%[1]s hyväksyi tämän vetopyynnön.
issue.action.review = @%[1]s kommentoi tätä vetopyyntöä.
issue.action.ready_for_review = @%[1]s merkitsi tämän vetopyynnön valmiiksi katselmointia varten.
+totp_disabled.text_1 = Tilisi aikapohjainen kertakäyttösalasana (TOTP) poistettiin käytöstä.
+issue.action.close = @%[1]s sulki ongelman #%[2]d.
+issue.action.reopen = @%[1]s avasi uudelleen ongelman #%[2]d.
+admin.new_user.text = Napsauta tästä hallitaksesi tätä käyttäjää ylläpitonäkymästä.
+repo.collaborator.added.text = Sinut on lisätty avustajaksi repoon:
+primary_mail_change.text_1 = Tilisi ensisijaiseksi sähköpostiosoitteeksi asetettiin %[1]s. Se tarkoittaa, että tämä sähköpostiosoite ei enää vastaanota tilisi ilmoituksia sähköpostitse.
+team_invite.text_1 = %[1]s on kutsunut sinut liittymään tiimiin %[2]s organisaatiossa %[3]s.
@@ -629,6 +650,10 @@ following_one = %d seurataan
block_user.detail = Huomaa, että käyttäjän estämisellä on muita vaikutuksia, kuten:
show_on_map = Näytä paikka kartalla
form.name_chars_not_allowed = Käyttäjätunnus "%s" sisältää virheellisiä merkkejä.
+follow_blocked_user = Et voi seurata tätä käyttäjää, koska olet estänyt kyseisen käyttäjän tai kyseinen käyttäjä on estänyt sinut.
+disabled_public_activity = Käyttäjä on poistanut käytöstä toiminnan julkisen näkyvyyden.
+form.name_reserved = Käyttäjätunnus "%s" on varattu.
+form.name_pattern_not_allowed = Kaava "%s" ei ole sallittu käyttäjätunnuksessa.
[settings]
@@ -684,7 +709,7 @@ keep_activity_private_popup=Tekee toiminnon näkyvän vain sinulle ja ylläpitä
lookup_avatar_by_mail=Hae profiilikuva sähköpostin perusteella
federated_avatar_lookup=Ulkopuolinen profiilikuvan haku
-enable_custom_avatar=Ota käyttöön mukautettu profiilikuva
+enable_custom_avatar=Käytä mukautettua profiilikuvaa
choose_new_avatar=Valitse uusi profiilikuva
update_avatar=Päivitä profiilikuva
delete_current_avatar=Poista nykyinen profiilikuva
@@ -699,9 +724,9 @@ password_change_disabled=Ei-lokaalit käyttäjät eivät voi päivittää salasa
emails=Sähköposti osoitteet
manage_emails=Hallitse sähköpostiosoitteita
-manage_themes=Valitse oletusteema
-manage_openid=Hallitse OpenID osoitteita
-theme_desc=Tämä on sivuston oletusteemasi.
+manage_themes=Oletusteema
+manage_openid=OpenID-osoitteet
+theme_desc=Tätä teemaa käytetään verkkosivuston käyttöliittymässä, kun olet sisäänkirjautuneena.
primary=Ensisijainen
activated=Aktivoitu
requires_activation=Vaatii aktivoinnin
@@ -717,7 +742,7 @@ theme_update_error=Valittua teemaa ei löydy.
openid_deletion=Poista OpenID-osoite
openid_deletion_success=OpenID-osoite on poistettu.
add_new_email=Lisää uusi sähköpostiosoite
-add_new_openid=Lisää uusi OpenID URI
+add_new_openid=Lisää uusi OpenID-URI
add_email=Lisää sähköpostiosoite
add_openid=Lisää OpenID URI
add_email_success=Uusi sähköpostiosoite on lisätty.
@@ -729,14 +754,14 @@ openid_desc=OpenID mahdollistaa todentamisen delegoinnin ulkopuoliselle palvelun
manage_ssh_keys=Hallitse SSH-avaimia
manage_gpg_keys=Hallitse GPG-avaimia
add_key=Lisää avain
-ssh_desc=Nämä julkiset SSH-avaimet on liitetty tiliisi. Vastaavat yksityiset avaimet antavat täyden pääsyn repoihisi.
-gpg_desc=Nämä julkiset GPG-avaimet on liitetty tiliisi. Pidä yksityiset avaimet turvassa, koska ne mahdollistavat committien todentamisen.
+ssh_desc=Nämä julkiset SSH-avaimet on liitetty tiliisi. Vastaavat yksityiset avaimet antavat täyden pääsyn repoihisi. Vahvistettuja SSH-avaimia voi käyttää SSH-allekirjoitettujen Git-kommittien vahvistamiseen.
+gpg_desc=Nämä julkiset GPG-avaimet on liitetty tiliisi, ja niitä käytetään kommittien vahvistamiseen. Pidä yksityiset avaimet turvassa, koska ne mahdollistavat kommittien allekirjoittamisen sinun nimissä.
ssh_helper=Tarvitsetko apua? Tutustu GitHubin oppaaseen omien SSH-avainten luonnista tai yleisistä ongelmista , joita voit kohdata SSH:n kanssa.
gpg_helper=Tarvitsetko apua? Katso GitHubin opas GPG :stä.
add_new_key=Lisää SSH avain
add_new_gpg_key=Lisää GPG-avain
-key_content_ssh_placeholder=Alkaa sanoilla 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com', tai 'sk-ssh-ed25519@openssh.com'
-key_content_gpg_placeholder=Alkaa sanoilla '-----BEGIN PGP PUBLIC KEY BLOCK-----'
+key_content_ssh_placeholder=Alkaa sanoilla "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com" tai "sk-ssh-ed25519@openssh.com"
+key_content_gpg_placeholder=Alkaa sanoilla "-----BEGIN PGP PUBLIC KEY BLOCK-----"
ssh_key_name_used=Samanniminen SSH avain on jo olemassa tililläsi.
gpg_key_id_used=Julkinen GPG-avain samalla tunnuksella on jo olemassa.
gpg_no_key_email_found=Tämä GPG-avain ei vastaa mitään tiliisi liitettyä aktivoitua sähköpostiosoitetta. Se voidaan silti lisätä, jos allekirjoitat annetun pääsymerkin.
@@ -748,7 +773,7 @@ gpg_token=Pääsymerkki
gpg_token_help=Voit luoda allekirjoituksen käyttäen:
gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig
gpg_token_signature=Panssaroitu GPG-allekirjoitus
-key_signature_gpg_placeholder=Alkaa sanoilla '-----BEGIN PGP SIGNATURE-----'
+key_signature_gpg_placeholder=Alkaa sanoilla "-----BEGIN PGP SIGNATURE-----"
ssh_key_verified=Vahvistettu avain
ssh_key_verified_long=Avain on vahvistettu pääsymerkillä ja sitä voidaan käyttää todentamaan commitit, jotka vastaavat tämän käyttäjän aktivoituja sähköpostiosoitteita.
ssh_key_verify=Vahvista
@@ -756,7 +781,7 @@ ssh_token_required=Sinun täytyy antaa allekirjoitus alla olevalle pääsymerkil
ssh_token=Pääsymerkki
ssh_token_help=Voit luoda allekirjoituksen käyttäen:
ssh_token_signature=Panssaroitu SSH-allekirjoitus
-key_signature_ssh_placeholder=Alkaa sanoilla '-----BEGIN SSH SIGNATURE-----'
+key_signature_ssh_placeholder=Alkaa sanoilla "-----BEGIN SSH SIGNATURE-----"
subkeys=Aliavaimet
key_id=Avain ID
key_name=Avaimen nimi
@@ -774,7 +799,7 @@ can_read_info=Luku
can_write_info=Kirjoitus
show_openid=Näytä profiilissa
hide_openid=Piilota profiilista
-ssh_disabled=SSH pois käytöstä
+ssh_disabled=SSH on pois käytöstä
manage_social=Hallitse liitettyjä sosiaalisia tilejä
manage_access_token=Hallitse pääsymerkkejä
@@ -795,7 +820,7 @@ create_oauth2_application=Luo uusi OAuth2-sovellus
create_oauth2_application_button=Luo sovellus
oauth2_application_name=Sovelluksen nimi
save_application=Tallenna
-oauth2_regenerate_secret=Luo secret uudelleen
+oauth2_regenerate_secret=Luo salaisuus uudelleen
oauth2_regenerate_secret_hint=Kadotitko secretin?
oauth2_application_edit=Muokkaa
@@ -811,10 +836,10 @@ twofa_enrolled=Tiliisi on otettu käyttöön kaksivaiheinen vahvistus. Ota palau
webauthn_nickname=Nimimerkki
-manage_account_links=Hallitse linkitettyjä tilejä
+manage_account_links=Yhdistetyt tilit
manage_account_links_desc=Nämä ulkoiset tilit on linkitetty Forgejo tiliisi.
link_account=Yhdistä tili
-remove_account_link=Poista linkitetty tili
+remove_account_link=Poista yhdistetty tili
remove_account_link_desc=Linkitetyn tilin poistaminen peruuttaa pääsyn Forgejo-tiliisi linkitetyn tili kautta. Jatketaanko?
remove_account_link_success=Linkitetty tili on poistettu.
@@ -854,11 +879,11 @@ location_placeholder = Jaa likimääräinen sijaintisi muiden kanssa
retype_new_password = Vahvista uusi salasana
create_oauth2_application_success = Loit uuden OAuth2-sovelluksen.
repos_none = Et omista yhtäkään repositoriota.
-visibility.limited_tooltip = Näkyvissä vain tunnistautuneille käyttäjille
+visibility.limited_tooltip = Näkyvissä vain kirjautuneille käyttäjille
email_notifications.disable = Poista sähköposti-ilmoitukset käytöstä
webauthn_register_key = Lisää turva-avain
blocked_users = Estetyt käyttäjät
-profile_desc = Määritä, miten muut näkevät profiilisi. Ensisijaista sähköpostiosoitettasi käytetään ilmoitusten ja salasanan palautuspyyntöjen lähettämiseen sekä verkkosivupohjaisiin Git-operaatioihin.
+profile_desc = Tietoja sinusta
change_password_success = Salasanasi on päivitetty. Kirjaudu jatkossa käyttäen uutta salasanaa.
manage_oauth2_applications = Hallitse OAuth2-sovelluksia
change_password = Vaihda salasana
@@ -892,6 +917,34 @@ twofa_disable = Poista kaksivaiheinen todennus käytöstä
twofa_disable_desc = Kaksivaiheisen todennuksen poistaminen asettaa tilisi aiempaa suurempaan uhkaan. Jatketaanko?
update_language_not_found = Kieli "%s" ei ole käytettävissä.
change_username_prompt = Huomio: Käyttäjätunnuksen vaihtaminen muuttaa myös tilisi URL-osoitteen.
+oauth2_client_secret_hint = Tätä salaisuutta ei näytetä uudelleen, kun olet poistunut sivulta tai päivittänyt sivun. Varmista, että olet ottanut salaisuuden talteen.
+blocked_since = Estetty %s lähtien
+user_unblock_success = Käyttäjän esto on poistettu.
+oauth2_redirect_uris = Uudelleenohjaus-URI:t. Käytä uutta riviä (newline) jokaista URI:a kohden.
+oauth2_client_secret = Asiakkaan salaisuus
+verify_ssh_key_success = SSH-avain "%s" on vahvistettu.
+change_username_redirect_prompt = Vanha käyttäjätunnus uudelleenohjaa, kunnes joku muu ottaa käyttäjätunnuksen käyttönsä.
+uploaded_avatar_is_too_big = Lähetetyn tiedoston koko (%d KiB) ylittää enimmäiskoon (%d KiB).
+ssh_key_been_used = Tämä SSH-avain on jo lisätty palvelimelle.
+verify_gpg_key_success = GPG-avain "%s" on vahvistettu.
+add_key_success = SSH-avain "%s" on lisätty.
+add_gpg_key_success = GPG-avain "%s" on lisätty.
+ssh_key_deletion_success = SSH-avain on poistettu.
+valid_until_date = Kelvollinen %s asti
+oauth2_client_id = Asiakkaan tunniste
+email_notifications.onmention = Ilmoitus vain maininnasta
+email_notifications.submit = Aseta valinta
+email_notifications.andyourown = Ja omat ilmoitukset
+key_state_desc = Tätä avainta on käytetty viimeisen 7 päivän aikana
+oauth2_application_create_description = OAuth2-sovellukset mahdollistavat kolmannen osapuolen sovelluksen pääsyn tilillesi tässä instanssissa.
+oauth2_confidential_client = Luottamuksellinen sovellus. Valitse sovelluksille, jotka pitävät salaisuuden luottamuksellisena, kuten web-sovelluksille. Älä valitse natiiveille sovelluksille mukaan lukien työpöytä- ja mobiilisovellukset.
+ssh_key_deletion_desc = SSH-avaimen poistaminen kumoaa pääsyn tilillesi kyseistä avainta käyttäen. Jatketaanko?
+add_email_confirmation_sent = Vahvistusviesti on lähetetty osoitteeseen "%s". Vahvista sähköpostiosoitteesi seuraavan %s sisällä.
+pronouns_custom_label = Mukautetut pronominit
+openid_deletion_desc = Tämän OpenID-osoitteen poistaminen tililtäsi estää kirjautumisen sitä käyttäen. Jatketaanko?
+generate_token_name_duplicate = Nimeä %s on jo käytetty sovelluksen nimenä. Käytä eri nimeä.
+ssh_signonly = SSH on tällä hetkellä poistettu käytöstä, joten näitä avaimia käytetään vain kommittien allekirjoituksen vahvistamiseen.
+oauth2_applications_desc = OAuth2-sovellukset mahdollistavat käyttämäsi kolmannen osapuolen sovelluksen todentaa turvallisesti käyttäjiä tähän Forgejo-instanssiin.
[repo]
owner=Omistaja
@@ -917,7 +970,7 @@ repo_gitignore_helper=Valitse .gitignore-mallit
issue_labels=Ongelmien tunnisteet
issue_labels_helper=Valitse pohja ongelmien nimilapuille.
license=Lisenssi
-license_helper=Valitse lisenssitiedosto.
+license_helper=Valitse lisenssitiedosto
readme=README
auto_init=Alusta repo (Luo .gitignore, License ja README)
create_repo=Luo repo
@@ -1316,7 +1369,7 @@ activity.new_issues_count_1=Uusi ongelma
activity.new_issues_count_n=uutta ongelmaa
activity.new_issue_label=Avoinna
activity.unresolved_conv_label=Auki
-activity.published_release_label=Julkaistu
+activity.published_release_label=Julkaisu
activity.git_stats_pushed_1=on työntänyt
activity.git_stats_file_1=%d tiedosto
activity.git_stats_file_n=%d tiedostoa
@@ -1361,9 +1414,9 @@ settings.transfer.title=Siirrä omistajuus
settings.transfer_form_title=Syötä repon nimi vahvistuksena:
settings.transfer_notices_3=- Jos arkisto on yksityinen ja se siirretään yksittäiselle käyttäjälle, tämä toiminto varmistaa, että käyttäjällä on ainakin lukuoikeudet (ja muuttaa käyttöoikeuksia tarvittaessa).
settings.transfer_owner=Uusi omistaja
-settings.wiki_delete=Poista Wiki data
+settings.wiki_delete=Poista wikidata
settings.wiki_delete_desc=Repon wikin data poistaminen on pysyvä eikä voi peruuttaa.
-settings.confirm_wiki_delete=Wiki datan poistaminen
+settings.confirm_wiki_delete=Poista wikidata
settings.wiki_deletion_success=Repon wiki data on poistettu.
settings.delete=Poista tämä repo
settings.delete_desc=Repon poistaminen on pysyvä eikä voi peruuttaa.
@@ -1384,7 +1437,7 @@ settings.webhook.body=Sisältö
settings.githook_edit_desc=Jos koukku ei ole käytössä, esitellään esimerkkisisältö. Sisällön jättäminen tyhjäksi arvoksi poistaa tämän koukun käytöstä.
settings.githook_name=Koukun nimi
settings.githook_content=Koukun sisältö
-settings.update_githook=Päivitys koukku
+settings.update_githook=Päivitä koukku
settings.payload_url=Kohde URL
settings.http_method=HTTP-menetelmä
settings.secret=Salaus
@@ -1406,7 +1459,7 @@ settings.event_push_desc=Git push repoon.
settings.event_repository=Repo
settings.event_repository_desc=Repo luotu tai poistettu.
settings.event_header_issue=Ongelmien tapahtumat
-settings.event_issues=Ongelmat
+settings.event_issues=Muokkaus
settings.event_issues_desc=Ongelma avattu, suljettu, avattu uudelleen tai muokattu.
settings.event_issue_assign=Ongelma määritetty
settings.event_issue_assign_desc=Ongelma osoitettu tai osoitus poistettu.
@@ -1414,7 +1467,7 @@ settings.event_issue_label_desc=Ongelman tunnisteet päivitetty tai tyhjennetty.
settings.event_issue_milestone_desc=Merkkipaalu lisätty, poistettu tai muokattu.
settings.event_issue_comment_desc=Ongelman kommentti luotu, muokattu tai poistettu.
settings.event_header_pull_request=Vetopyyntöjen tapahtumat
-settings.event_pull_request=Vetopyyntö
+settings.event_pull_request=Muokkaus
settings.event_package_desc=Paketti on luotu tai poistettu repossa.
settings.active_helper=Tiedot käynnistetyistä tapahtumista lähetetään tähän webkoukun URL-osoitteeseen.
settings.add_hook_success=Uusi webkoukku on lisätty.
@@ -1573,7 +1626,7 @@ release.ahead.commits = %d kommittia
all_branches = Kaikki haarat
n_tag_few = %s tagia
settings.event_fork_desc = Repo forkattu.
-actions = Toimenpiteet
+actions = Actions
fork_guest_user = Kirjaudu sisään forkataksesi tämän repon.
fork_from_self = Et voi forkata omistamaasi repoa.
visibility_fork_helper = (Tämän muuttaminen vaikuttaa kaikkien forkkien näkyvyyteen.)
@@ -1641,7 +1694,7 @@ activity.git_stats_author_n = %d tekijää
issues.dependency.add_error_dep_exists = Riippuvuus on jo olemassa.
wiki.page_content = Sivun sisältö
wiki.page_title = Sivun otsikko
-activity.navbar.contributors = Kontribuuttorit
+activity.navbar.contributors = Avustajat
n_release_few = %s julkaisua
n_release_one = %s julkaisu
symbolic_link = Symbolinen linkki
@@ -1659,7 +1712,7 @@ milestones.deletion_success = Merkkipaalu on poistettu.
project = Projektit
pulls.delete.title = Poistetaanko tämä vetopyyntö?
activity.title.issues_1 = %d ongelma
-contributors.contribution_type.filter_label = Kontribuution tyyppi:
+contributors.contribution_type.filter_label = Avustuksen tyyppi:
settings.protected_branch.delete_rule = Poista sääntö
settings.archive.success = Repo arkistoitiin onnistuneesti.
diff.comment.placeholder = Jätä kommentti
@@ -1883,7 +1936,7 @@ migrate.gitlab.description = Tee migraatio gitlab.comista tai muista GitLab-inst
migrate.gitea.description = Tee migraatio gitea.comista tai muista Gitea-instansseista.
repo_gitignore_helper_desc = Valitse mitä tiedostoja ei seurata yleisimpien kielten mallipohjista. Tyypilliset artefaktit, joita eri kielten koostamistyökalut tuottavat, lisätään .gitignore-tiedostoon oletusarvoisesti.
milestones.filter_sort.latest_due_date = Kaukaisin määräpäivä
-license_helper_desc = Lisenssi määrää, mitä muut voivat ja eivät voi tehdä koodillasi. Etkö ole varma, mikä lisenssi soveltuu projektillesi? Lue ohje lisenssin valinnasta.
+license_helper_desc = Lisenssi määrää, mitä muut voivat ja eivät voi tehdä koodillasi. Etkö ole varma, mikä lisenssi soveltuu projektillesi? Lue ohje lisenssin valinnasta .
milestones.filter_sort.earliest_due_data = Lähin määräpäivä
issues.filter_type.reviewed_by_you = Katselmoitu toimestasi
settings.units.overview = Yleisnäkymä
@@ -1959,6 +2012,82 @@ editor.must_have_write_access = Sinulla täytyy olla kirjoitusoikeus tehdäksesi
issues.re_request_review = Pyydä katselmointia uudelleen
pulls.status_checks_details = Yksityiskohdat
release.title_empty = Nimi ei voi olla tyhjä.
+archive.title = Tämä repo on arkistoitu. Voit katsella sen sisältämiä tiedostoja ja kloonata repon, mutta et voi pushata, avata ongelmia tai luoda vetopyyntöjä.
+reactions_more = ja %d lisää
+mirror_address = Kloonaa URL-osoitteesta
+migrate_items_merge_requests = Yhdistämispyynnöt
+stars_remove_warning = Tämä poistaa kaikki tähdet tästä reposta.
+archive.issue.nocomment = Tämä repo on arkistoitu. Et voi kommentoida ongelmia.
+archive.pull.nocomment = Tämä repo on arkistoitu. Et voi kommentoida vetopyyntöjä.
+settings.webhook_deletion_desc = Webkoukun poistaminen poistaa sen asetukset ja toimitushistorian. Jatketaanko?
+settings.discord_icon_url.exceeds_max_length = Kuvakkeen URL-osoite voi sisältää enintään 2048 merkkiä
+settings.event_wiki_desc = Wiki-sivu luotu, nimetty uudelleen, muokattu tai poistettu.
+settings.event_pull_request_desc = Vetopyyntö avattu, suljettu, avattu uudelleen tai muokattu.
+settings.protect_branch_name_pattern = Suojatun haaran nimen kaava
+issues.dependency.add_error_dep_not_same_repo = Molempien ongelmien tulee olla samassa repossa.
+settings.event_release = Julkaisu
+pulls.merge_pull_request = Luo yhdistämiskommitti
+settings.pull_mirror_sync_quota_exceeded = Kiintiö ylitetty, ei vedetä muutoksia.
+settings.wiki_rename_branch_main_notices_1 = Tätä toimintoa EI VOI perua.
+settings.webhook.test_delivery_desc_disabled = Aktivoi webkoukku testataksesi sitä tekaistulla tapahtumalla.
+settings.discord_icon_url = Kuvakkeen URL-osoite
+settings.archive.branchsettings_unavailable = Haaran asetukset eivät ole saatavilla arkistoiduissa repoissa.
+pulls.ready_for_review = Valmiina katselmointiin?
+issues.time_spent_total = Käytetty kokonaisaika
+settings.webhook.test_delivery_desc = Testaa tätä webkoukkua tekaistulla tapahtumalla.
+pulls.switch_comparison_type = Vaihda vertailutyyppiä
+settings.hooks_desc = Webkoukut tekevät automaattisesti HTTP POST -pyyntöjä palvelimelle, kun jotkin Forgejo-tapahtumat käynnistyvät. Lue lisää webkoukkujen oppaasta .
+issues.num_participants_one = %d osallistuja
+issues.reference_link = Viittaus: %s
+settings.transfer_desc = Siirrä tämä repo käyttäjälle tai organisaatiolle, johon sinulla ylläpito-oikeus.
+settings.add_collaborator = Lisää avustaja
+settings.mirror_settings.push_mirror.none = Push-peilejä ei ole määritetty
+settings.collaborator_deletion_desc = Avustajan poistaminen estää hänen pääsyn tähän repoon. Jatketaanko?
+settings.archive.text = Repon arkistointi asettaa sen pelkkään lukutilaan. Se piilotetaan hallintapaneelista. Kukaan (et edes sinä!) ei pysty tehdä uusia kommitteja, avata uusia ongelmia tai avata vetopyyntöjä.
+settings.mirror_settings.docs = Määritä reposi automaattisesti synkronoimaan kommitit, tagit ja haarat toiseen repoon.
+settings.add_collaborator_duplicate = Avustaja on jo lisätty tähän repoon.
+settings.add_collaborator_blocked_them = Avustajaa ei voi lisätä, koska kyseinen avustaja on estänyt repon omistajan.
+settings.add_collaborator_blocked_our = Avustajaa ei voi lisätä, koska repon omistaja on estänyt hänet.
+settings.default_branch_desc = Valitse repon oletushaara, johon vetopyynnöt ja koodikommitit kohdistetaan:
+issues.role.collaborator = Avustaja
+settings.trust_model.collaboratorcommitter.long = Avustaja+kommitoija: Luota avustajien allekirjoituksiin, jotka vastaavat kommitoijaa
+settings.collaborator_deletion = Poista avustaja
+wiki.desc = Kirjoita ja jaa dokumentaatiota avustajien kesken.
+settings.trust_model.collaborator = Avustaja
+mirror_sync_on_commit = Synkronoi kun kommitit pushataan
+settings.mirror_settings.docs.disabled_pull_mirror.instructions = Määritä projektisi automaattisesti pushaamaan kommitit, tagit ja haarat toiseen repoon. Pull-peilit on poistettu käytöstä tämän sivuston ylläpitäjän toimesta.
+settings.mirror_settings.docs.more_information_if_disabled = Löydät lisätietoja push- ja pull-peileistä täältä:
+settings.mirror_settings.push_mirror.add = Lisää push-peili
+settings.mirror_settings.push_mirror.edit_sync_time = Muokkaa peilin synkronoinnin aikaväliä
+settings.trust_model.collaboratorcommitter = Avustaja+kommitoija
+settings.trust_model.default = Oletusarvoinen luottamusmalli
+settings.admin_enable_health_check = Käytä repositorion terveystarkastuksia (git fsck)
+settings.remove_collaborator_success = Avustaja on poistettu.
+issues.role.collaborator_helper = Tämä käyttäjä on kutsuttu avustajaksi tähän repoon.
+settings.pulls_desc = Käytä repositorion vetopyyntöjä
+mirror_interval_invalid = Peilauksen aikaväli ei ole kelvollinen.
+settings.collaboration = Avustajat
+settings.trust_model = Allekirjoituksen luottamusmalli
+settings.org_not_allowed_to_be_collaborator = Organisaatioita ei voi lisätä avustajaksi.
+mirror_interval = Peilauksen aikaväli (kelvolliset yksiköt ovat "h", "m", "s"). 0 poistaa käytöstä aikaan pohjautuvan synkronoinnin. (Pienin aikaväli: %s)
+settings.add_collaborator_success = Avustaja on lisätty.
+settings.add_collaborator_owner = Omistajaa ei voi lisätä avustajaksi.
+settings.signing_settings = Allekirjoituksen vahvistuksen asetukset
+settings.mirror_settings.docs.disabled_push_mirror.instructions = Määritä projektisi automaattisesti vetämään kommitit, tagit ja haarat toisesta reposta.
+settings.trust_model.collaborator.long = Avustaja: Luota avustajien allekirjoituksiin
+issues.dependency.setting = Käytä riippuvuuksia ongelmiin ja vetopyyntöihin
+settings.allow_only_contributors_to_track_time = Salli vain avustajien seurata aikaa
+settings.actions_desc = Käytä integroituja CI-/CD-putkia Forgejo Actionsia hyödyntäen
+settings.admin_enable_close_issues_via_commit_in_any_branch = Sulje ongelma kommitin toimesta, joka on tehty muuhun kuin oletusarvoiseen haaraan
+settings.mirror_settings.pushed_repository = Työnnetty repo
+pulls.compare_changes_desc = Valitse haara, johon yhdistetään, ja haara, josta vedetään.
+no_eol.text = Ei EOL:ää
+auto_init_description = Aloita Git-historia README-tiedostolla ja valinnaisesti License- ja .gitignore-tiedostoilla.
+new_from_template = Käytä mallipohjaa
+new_from_template_description = Voit valita olemassa olevan repon mallipohjan ja toteuttaa sen asetukset.
+new_advanced = Lisäasetukset
+new_advanced_expand = Laajenna napsauttamalla
+template_description = Repojen mallipohjat mahdollistavat uusien repojen luomisen halutulla hakemistorakenteella, tiedostoilla ja valinnaisilla asetuksilla.
@@ -2102,8 +2231,8 @@ dashboard.operation_switch=Vaihda
dashboard.operation_run=Suorita
dashboard.delete_inactive_accounts=Poista kaikki aktivoimattomat käyttäjät
dashboard.delete_repo_archives=Poista kaikki repojen arkistot (ZIP, TAR.GZ, jne..)
-dashboard.server_uptime=Palvelimen Uptime
-dashboard.current_goroutine=Nykyiset Goroutinet
+dashboard.server_uptime=Palvelimen uptime
+dashboard.current_goroutine=Nykyiset goroutinet
dashboard.current_memory_usage=Nykyinen muistinkäyttö
dashboard.total_memory_allocated=Yhteensä muistia varattu
dashboard.memory_obtained=Muistia saatu
@@ -2123,7 +2252,7 @@ dashboard.mcache_structures_obtained=MCache rakenteita saatu
dashboard.profiling_bucket_hash_table_obtained=Profilointi Bucket Hash Table saatu
dashboard.gc_metadata_obtained=GC metatietoja saatu
dashboard.other_system_allocation_obtained=Muita järjestestelmän varauksia saatu
-dashboard.next_gc_recycle=Seuraava GC kierrätys
+dashboard.next_gc_recycle=Seuraava GC-kierrätys
dashboard.last_gc_time=Edellisen GC ajan jälkeen
dashboard.total_gc_time=Yhteensä GC tauko
dashboard.total_gc_pause=Yhteensä GC tauko
@@ -2279,7 +2408,7 @@ config.default_visibility_organization=Uuden organisaation oletusnäkyvyys
config.webhook_config=Webkoukkujen asetukset
config.queue_length=Jonon pituus
-config.deliver_timeout=Toimitus aikakatkaisu
+config.deliver_timeout=Toimituksen aikakatkaisu
config.mailer_enabled=Käytössä
config.mailer_name=Nimi
@@ -2426,6 +2555,12 @@ dashboard.task.unknown = Tuntematon tehtävä: %[1]s
dashboard.cron.error = Virhe Cronissa: %s: %[3]s
dashboard.task.started = Käynnistetty tehtävä: %[1]s
dashboard.cron.finished = Cron: %[1]s on valmistunut
+dashboard.resync_all_sshkeys = Päivitä ".ssh/authorized_keys"-tiedosto Forgejo:n SSH-avaimilla.
+dashboard.cleanup_packages = Siivoa vanhentuneet paketit
+config.default_allow_only_contributors_to_track_time = Salli vain avustajien seurata aikaa
+monitor.download_diagnosis_report = Lataa diagnostiikkaraportti
+monitor.duration = Kesto (s)
+monitor.last_execution_result = Tulos
[action]
@@ -2440,6 +2575,9 @@ compare_commits = Vertaa %d kommittia
compare_branch = Vertaa
review_dismissed_reason = Syy:
commit_repo = työnsi haaraan %[3]s repossa %[4]s
+create_issue = `avasi ongelman %[3]s#%[2]s `
+reopen_issue = `avasi uudelleen ongelman %[3]s#%[2]s `
+create_pull_request = `loi vetopyynnön %[3]s#%[2]s `
[tool]
now=nyt
@@ -2601,6 +2739,32 @@ settings.link = Linkitä tämä paketti repositorioon
maven.download = Lataa riippuvuus suorittamalla komentorivillä:
registry.documentation = Lisätietoja %s-rekisteristä on dokumentaatiossa .
owner.settings.chef.keypair.description = Avainpari vaaditaan Chef-rekisteriin tunnistautumista varten. Jos olet luonut avainparin aiemmin, uuden avainparin luominen hylkää aiemman avainparin.
+owner.settings.cleanuprules.keep.pattern = Säilytä kaavaa vastaavat versiot
+owner.settings.cleanuprules.pattern_full_match = Toteuta kaavio paketin koko nimeen
+owner.settings.cleanuprules.keep.title = Näitä sääntöjä vastaavat versiot säilytetään, vaikka ne vastaisivat alla olevaa poistosääntöä.
+owner.settings.cleanuprules.keep.count = Säilytä viimeisimmät
+owner.settings.cleanuprules.remove.pattern = Poista kaavaa vastaavat versiot
+owner.settings.cleanuprules.keep.pattern.container = Viimeisin (latest
) versio säilytetään aina Container-paketeista.
+owner.settings.cleanuprules.remove.title = Näitä sääntöjä vastaavat versiot poistetaan, ellei sääntö yläpuolella käske säilyttää niitä.
+owner.settings.cleanuprules.remove.days = Poista versiot, jotka ovat vanhempia kuin
+arch.pacman.helper.gpg = Lisää luottamusvarmenne pacmanille:
+arch.pacman.sync = Synkronoi paketti pacmanin kanssa:
+debian.registry.info = Valitse $distribution ja $component alla olevasta listasta.
+rpm.repository.multiple_groups = Tämä paketti on saatavilla useissa ryhmissä.
+owner.settings.cargo.rebuild.success = Cargo-indeksi rakennettiin uudelleen.
+owner.settings.cleanuprules.preview.none = Siivoussääntö ei vastaa yhtäkään pakettia.
+arch.pacman.conf = Lisää palvelin asiaan liittyvällä jakelulla ja arkkitehtuurilla tiedostoon /etc/pacman.conf
:
+published_by = Julkaistu %[1]s käyttäjän %[3]s toimesta
+alpine.registry.key = Lataa rekisterin julkinen RSA-avain hakemistoon /etc/apk/keys/
vahvistaaksesi indeksin allekirjoituksen:
+alpine.registry = Määritä tämä rekisteri lisäämällä URL-osoite tiedostoon /etc/apk/repositories
:
+rubygems.dependencies.runtime = Ajonaikaiset riippuvuudet
+owner.settings.cargo.rebuild.error = Cargo-indeksin rakentaminen uudelleen epäonnistui: %v
+owner.settings.cargo.rebuild = Rakenna indeksi uudelleen
+empty.repo = Lähetitkö paketin, mutta se ei näy täällä? Siirry paketin asetuksiin ja linkitä se tähän repoon.
+alpine.registry.info = Valitse $branch ja $repository alla olevasta listasta.
+container.images.title = Levykuvat
+owner.settings.cargo.initialize = Alusta indeksi
+owner.settings.cargo.initialize.description = Erityinen Git-repoindeksi vaaditaan Cargo-rekisterin käyttämiseksi. Tämän valinnan käyttäminen luo (tarvittaessa uudelleen) repon ja määrittää sen asetukset automaattisesti.
[secrets]
creation.failed = Salaisuuden lisääminen epäonnistui.
@@ -2699,7 +2863,10 @@ workflow.disable_success = Työnkulku "%s" on poistettu käytöstä.
runs.no_job = Työnkulun tulee sisältää vähintään yksi työ
runs.invalid_workflow_helper = Työnkulun asetustiedosto on virheellinen. Tarkista asetustiedosto: %s
runners = Ajajat
-actions = Toimenpiteet
+actions = Actions
+unit.desc = Hallitse integroituja CI/CD-putkia Forgejo Actionsia hyödyntäen.
+runs.pushed_by = työntänyt
+runs.no_workflows.help_no_write_access = Lisätietoja Forgejo Actionsista on saatavilla dokumentaatiosta .
diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini
index 9a001ee81a..07372944bb 100644
--- a/options/locale/locale_fil.ini
+++ b/options/locale/locale_fil.ini
@@ -748,7 +748,7 @@ social = Mga social account
biography_placeholder = Sabihin sa iba ng kaunti tungkol sa iyong sarili! (Sinusuportahan ang Markdown)
change_username_prompt = Tandaan: Ang pagpalit ng username ay papalitan din ang URL ng iyong account.
organization = Mga Organisasyon
-profile_desc = Kontrolin kung paano ipinapakita ang iyong profile sa ibang mga gumagamit. Ang iyong pangunahing email address ay gagamitin para sa mga abiso, pagbawi ng password at mga Git operation na batay sa web.
+profile_desc = Tungkol sa iyo
hidden_comment_types_description = Ang mga uri ng komento na naka-check dito ay hindi ipapakita sa loob ng mga pahina ng isyu. Halimbawa ang pag-check ng "Label" ay tatanggalin lahat ng mga "Idinagdag/tinanggal ni ang " na komento.
comment_type_group_milestone = Milestone
comment_type_group_issue_ref = Pagsangguni ng isyu
@@ -767,7 +767,7 @@ ssh_key_deletion_desc = Ang pagtanggal ng SSH key ay matatanggihan ang pag-acces
no_activity = Walang kamakilang aktibidad
ssh_signonly = Kasalukuyang naka-disable ang SSH kaya magagamit lang ang mga key na ito para sa pagpapatunay ng commit signature.
gpg_desc = Ang mga pampublikong GPG key dito ay nauugnay sa iyong account at ginagamit para i-verify ang iyong mga commit. Panatilihing ligtas ang iyong mga pribadong key dahil pinapayagan nito ang pag-sign ng mga commit gamit ng iyong pagkakakilanlan.
-keep_email_private_popup = Itatago nito ang iyong email address sa iyong profile. Hindi na ito ang magiging default para sa mga commit na ginawa sa pamamagitan ng web interface, tulad ng pag-upload ng mga file at pagbabago. Sa halip gagamitin ang isang espeyal na address na %s para i-associate ang mga commit sa iyong account. Tandaan na ang pagbabago ng opsyon na ito ay hindi makakaapekto sa mga umiiral na commit.
+keep_email_private_popup = Ang iyong email address ay hindi ipapakita sa iyong profile at hindi magiging default para sa mga commit na ginawa sa pamamagitan ng web interface, tulad ng pag-upload ng mga file, mga pagbabago, at mga merge commit. Sa halip, gagamitin ang isang espeyal na address na %s para i-link ang mga commit sa iyong account. Ang opsyon na ito ay hindi makakaapekto sa mga umiiral na commit.
gpg_key_id_used = Ang isang publikong GPG key na may katulad na ID ay umiiral na.
gpg_no_key_email_found = Ang GPG key na ito ay hindi tumutugma sa anumang email address na nauugnay sa iyong account. Madadagdag pa rin ito kapag i-sign mo ang ibinigay na token.
ssh_principal_deletion_success = Tinanggal na ang principal.
@@ -997,6 +997,8 @@ language.title = Default na wika
keep_activity_private.description = Makikita mo lang at mga tagapangasiwa ng instansya ang iyong pampublikong aktibidad .
language.description = Mase-save ang wika sa iyong account at gagamitin bilang default pagkatapos mong mag-log in.
language.localization_project = Tulungan kaming isalin ang Forgejo sa iyong wika! Matuto pa .
+pronouns_custom_label = Mga pasadyang pronoun
+user_block_yourself = Hindi mo maaring harangan ang sarili mo.
[repo]
template_description = Ang mga template na repositoryo ay pinapayagan ang mga gumagamit na mag-generate ng mga bagong repositoryo na may magkatulad na istraktura ng direktoryo, mga file, at opsyonal na mga setting.
@@ -1070,7 +1072,7 @@ license_helper = Pumili ng file ng lisensya
license_helper_desc = Ang lisensya ay namamahala kung ano ang pwede at hindi pwedeng gawin ng mga ibang tao sa iyong code. Hindi sigurado kung alin ang wasto para sa iyong proyekto? Tignan ang Pumili ng lisensya .
object_format_helper = Object format ng repositoryo. Hindi mababago mamaya. Ang SHA1 ang pinaka-compatible.
readme = README
-auto_init = I-initialize ang repositoryo (Nagdadagdag ng .gitignore, Lisensya, at README)
+auto_init = I-initialize ang repositoryo
trust_model_helper = Pumili ng trust model para sa signature verification. Ang mga posibleng opsyon ay:
trust_model_helper_collaborator = Katulong: I-trust ang mga signature batay sa mga katulong
trust_model_helper_committer = Commiter: I-trust ang mga signature na tumutugma sa mga commiter
@@ -1127,8 +1129,8 @@ delete_preexisting_content = Burahin ang mga file sa %s
tree_path_not_found_commit = Hindi umiiral ang path na %[1]s sa commit %[2]s
tree_path_not_found_branch = Hindi umiiral ang daanang %[1]s sa branch %[2]s
migrate_items_pullrequests = Mga hiling sa paghila
-archive.pull.nocomment = Naka-archive ang repo na ito. Hindi ka makakakomento sa mga pull request.
-archive.title = Naka-archive ang repo na ito. Maari mong itignan ang mga file at i-clone ito, pero hindi makaka-push o magbukas ng mga isyu o mga pull request.
+archive.pull.nocomment = Naka-archive ang repositoryong ito. Hindi ka makakakomento sa mga pull request.
+archive.title = Naka-archive ang repositoryong ito. Maari mong itignan ang mga file at i-clone ito, pero hindi makaka-push o magbukas ng mga isyu o mga pull request.
archive.title_date = Naka-archive ang repositoryo na ito noong %s. Maari mong itignan ang mga file at i-clone ito, pero hindi makaka-push o magbukas ng mga isyu o mga pull request.
pulls = Mga hiling sa paghila
activity.merged_prs_count_n = Mga naisamang hiling sa paghila
@@ -1184,7 +1186,7 @@ migrate_items_labels = Mga label
migrate_items_issues = Mga isyu
migrate_items_merge_requests = Mga merge request
migrate.clone_address = Magmigrate / Mag-clone mula sa URL
-archive.issue.nocomment = Naka-archive ang repo na ito. Hindi ka makakakomento sa mga isyu.
+archive.issue.nocomment = Naka-archive ang repositoryong ito. Hindi ka makakakomento sa mga isyu.
migrate_items = Mga item sa pagmigrate
migrate_items_releases = Mga paglabas
migrate_repo = I-migrate ang repositoryo
@@ -2707,6 +2709,21 @@ release.hide_archive_links = Itago ang mga awtomatikong na-generate na archive
release.hide_archive_links_helper = Itago ang awtomatikong na-generate na source code archive para sa release na ito. Halimbawa, kung maga-upload ka ng sarili mo.
branch.already_exists = Umiiral na ang branch na may pangalan na "%s".
diff.bin = BIN
+settings.default_update_style_desc = Ang default na istilio na gagamitin sa pag-update ng mga hiling sa paghila na nalilipas sa base branch.
+pulls.sign_in_require = Mag-sign in para gumawa ng bagong hiling sa paghila.
+new_from_template = Gumamit ng template
+new_from_template_description = Maari kang pumili ng umiiral na repository template sa instansya na ito at i-apply ang mga setting nito.
+new_advanced = Mga advanced na setting
+new_advanced_expand = I-click para i-expand
+auto_init_description = Simulan ang kasaysayan ng Git gamit ang README at opsyonal na magdagdag ng mga lisensya at .gitignore na file.
+issues.reaction.add = Magdagdag ng reaksyon
+issues.reaction.alt_few = Nag-react si %[1]s ng %[2]s.
+issues.reaction.alt_many = Sina %[1]s at %[2]d pang iba ay nag-react ng %[3]s.
+issues.reaction.alt_remove = Magtanggal ng %[1]s reaksyon mula sa komento.
+issues.reaction.alt_add = Magdagdag ng %[1]s reaksyon sa komento.
+issues.context.menu = Menu ng komento
+summary_card_alt = Pangkalahatang-ideyang card ng repositoryo na %s
+release.summary_card_alt = Pangkalahatang-ideyang card ng isang release na nakapamagat na "%s" sa repositoryo na %s
[search]
commit_kind = Maghanap ng mga commit…
@@ -3262,6 +3279,7 @@ users.activated.description = Pagkumpleto ng email verification. Ang owner ng hi
users.admin.description = Binibigyan ang user na ito ng punong access sa lahat ng mga tagapangasiwang feature na available sa pamamagitan ng web UI at ang API.
config.db_ssl_mode = SSL
config.enable_openid_signin = I-enable ang OpenID sign-in
+monitor.duration = Tagal (s)
[org]
repo_updated = Binago %s
@@ -3548,6 +3566,14 @@ owner.settings.cargo.rebuild.success = Matagumpay na na-rebuild ang Cargo index.
owner.settings.cleanuprules.title = Mga cleanup rule
container.layers = Mga layer ng image
container.images.title = Mga image
+search_in_external_registry = Maghanap sa %s
+alt.registry = I-setup ang registry na ito mula sa command line:
+alt.registry.install = Para i-install ang package na ito, patakbuhin ang sumusunod na command:
+alt.install = I-install ang package
+alt.setup = Idagdag ang repositoryo sa listahan ng mga nakakonektang repositoryo (piliin ang kinakailangang architechture sa halip ng '_arch_'):
+alt.repository = Info ng Repositoryo
+alt.repository.architectures = Mga architechture
+alt.repository.multiple_groups = Available ang package na ito sa iba't ibang grupo.
[actions]
runners.last_online = Huling oras na online
diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini
index e45e27e7f0..f67b11dc04 100644
--- a/options/locale/locale_fr-FR.ini
+++ b/options/locale/locale_fr-FR.ini
@@ -1,7 +1,7 @@
[common]
home=Accueil
dashboard=Tableau de bord
-explore=Explorateur
+explore=Explorer
help=Aide
logo=Logo
sign_in=Connexion
@@ -165,6 +165,7 @@ error413 = Votre quota est épuisé.
new_repo.title = Nouveau dépôt
new_migrate.link = Nouvelle migration
new_org.link = Nouvelle organisation
+copy_path = Copier le chemin
[aria]
navbar=Barre de navigation
@@ -519,7 +520,7 @@ issue.action.force_push=%[1]s a forcé %[2]s de %[3]s vers %[4]s.
issue.action.push_1=@%[1]s a soumis %[3]d révision sur %[2]s
issue.action.push_n=@%[1]s a soumis %[3]d révisions sur %[2]s
issue.action.close=@%[1]s a fermé #%[2]d.
-issue.action.reopen=@%[1]s a réouvert #%[2]d.
+issue.action.reopen=@%[1]s a rouvert #%[2]d.
issue.action.merge=@%[1]s a fusionné de #%[2]d vers %[3]s.
issue.action.approve=@%[1]s a approuvé cette demande d'ajout.
issue.action.reject=@%[1]s a demandé des modifications sur cette demande d'ajout.
@@ -744,9 +745,9 @@ uid=UID
webauthn=Clés de sécurité à deux facteurs
public_profile=Profil public
-biography_placeholder=Parlez-nous un peu de vous ! (Markdown est interprété)
+biography_placeholder=Parlez-nous un peu de vous ! (Markdown est supporté)
location_placeholder=Partagez votre position approximative avec d'autres personnes
-profile_desc=Contrôlez comment votre profil est affiché aux autres utilisateurs. Votre adresse courriel principale sera utilisée pour les notifications, la récupération de mot de passe et les opérations Git basées sur le Web.
+profile_desc=À propos de vous
password_username_disabled=Les utilisateurs externes ne sont pas autorisés à modifier leur nom d'utilisateur. Veuillez contacter l'administrateur de votre site pour plus de détails.
full_name=Nom complet
website=Site Web
@@ -811,7 +812,7 @@ manage_emails=Gérer les adresses courriels
manage_themes=Thème par défaut
manage_openid=Adresses OpenID
email_desc=Votre adresse courriel principale sera utilisée pour les notifications, la récupération de mot de passe et, à condition qu'elle ne soit pas cachée, les opérations Git basées sur le Web.
-theme_desc=Ce sera votre thème par défaut sur le site.
+theme_desc=Ce thème sera utilisé pour l'interface web lorsque vous êtes authentifié.
primary=Principale
activated=Activé
requires_activation=Nécessite une activation
@@ -837,7 +838,7 @@ add_email_success=La nouvelle adresse e-mail a été ajoutée.
email_preference_set_success=L'e-mail de préférence a été défini avec succès.
add_openid_success=La nouvelle adresse OpenID a été ajoutée.
keep_email_private=Cacher l'adresse courriel
-keep_email_private_popup=Ceci masquera votre adresse courriel de votre profil. Elle ne sera plus la valeur par défaut pour les commits créés par l'interface web, tel que des ajouts de fichiers ou des éditions, et ne sera pas utilisée pour fusionner les commits. Un courriel special %s peut être utilisé pour établir la relation entre des commits et votre compte. Notez que changer cette option n'aura pas d'effet sur les commits existants.
+keep_email_private_popup=Ceci masquera votre adresse courriel de votre profil. Elle ne sera plus la valeur par défaut pour les commits créés par l'interface web, tel que des ajouts de fichiers ou des éditions, et ne sera pas utilisée pour fusionner les commits. Un courriel special %s peut être utilisé pour établir la relation entre des commits et votre compte. Cette option n'aura pas d'effet sur les commits existants.
openid_desc=OpenID vous permet de confier l'authentification à une tierce partie.
manage_ssh_keys=Gérer les clés SSH
@@ -1053,9 +1054,11 @@ language.title = Langue par défaut
keep_activity_private.description = Vous seul pourrez voir votre activité publique , ainsi que les administrateurs de l'instance.
language.localization_project = Aidez-nous à traduire Forgejo dans votre langue ! En savoir plus .
language.description = Cette langue sera enregistrée dans votre compte et utilisée comme langue par défaut après votre connexion.
+user_block_yourself = Vous ne pouvez pas vous bloquer vous même.
+pronouns_custom_label = Pronoms personnalisés
[repo]
-new_repo_helper=Un dépôt contient tous les fichiers d’un projet, ainsi que l’historique de leurs modifications. Vous avez déjà ça ailleurs ? Migrez-le ici.
+new_repo_helper=Un dépôt contient tous les fichiers d’un projet, ainsi que l’historique de leurs modifications. Vous avez déjà ça ailleurs ? Migrez-le ici. .
owner=Propriétaire
owner_helper=Certaines organisations peuvent ne pas apparaître dans la liste déroulante en raison d'une limite maximale du nombre de dépôts.
repo_name=Nom du dépôt
@@ -1095,11 +1098,11 @@ issue_labels=Étiquettes
issue_labels_helper=Sélectionner un jeu d'étiquettes
license=Licence
license_helper=Sélectionner une licence
-license_helper_desc=Une licence réglemente ce que les autres peuvent ou ne peuvent pas faire avec votre code. Vous ne savez pas laquelle est la bonne pour votre projet ? Comment choisir une licence.
+license_helper_desc=Une licence réglemente ce que les autres peuvent ou ne peuvent pas faire avec votre code. Vous ne savez pas laquelle est la bonne pour votre projet ? Comment choisir une licence. .
readme=LISEZMOI
readme_helper=Choisissez un modèle de fichier LISEZMOI
readme_helper_desc=Le README est l'endroit idéal pour décrire votre projet et accueillir des contributeurs.
-auto_init=Initialiser le dépôt (avec un .gitignore, une Licence et un README.md)
+auto_init=Initialiser le dépôt
trust_model_helper=Choisissez, parmi les éléments suivants, les règles de confiance des signatures paraphant les révisions :
trust_model_helper_collaborator=Collaborateur : ne se fier qu'aux signatures des collaborateurs du dépôt
trust_model_helper_committer=Auteur : ne se fier qu'aux signatures des auteurs de révisions
@@ -1617,7 +1620,7 @@ issues.reopen_issue=Rouvrir
issues.reopen_comment_issue=Réouvrir avec le commentaire
issues.create_comment=Commenter
issues.closed_at=`a fermé ce ticket %[2]s .`
-issues.reopened_at=`a réouvert ce ticket %[2]s .`
+issues.reopened_at=`a rouvert ce ticket %[2]s .`
issues.commit_ref_at=`a référencé ce ticket depuis une révision %[2]s .`
issues.ref_issue_from=`a fait référence à %[4]s ce ticket %[2]s .`
issues.ref_pull_from=`a fait référence à cette demande d'ajout %[4]s %[2]s .`
@@ -1777,7 +1780,7 @@ issues.review.approve=a approuvé ces modifications %s
issues.review.comment=a évalué cette demande d’ajout %s
issues.review.dismissed=a révoqué l’évaluation de %s %s
issues.review.dismissed_label=Révoquée
-issues.review.left_comment=laisser un commentaire
+issues.review.left_comment=a laissé un commentaire
issues.review.content.empty=Vous devez laisser un commentaire indiquant le(s) changement(s) demandé(s).
issues.review.reject=a requis les changements %s
issues.review.wait=a été sollicité pour évaluer cette demande d’ajout %s
@@ -2508,7 +2511,7 @@ settings.archive.error=Une erreur s'est produite lors de l'archivage du dépôt.
settings.archive.error_ismirror=Vous ne pouvez pas archiver un dépôt en miroir.
settings.archive.branchsettings_unavailable=Le paramétrage des branches n'est pas disponible quand le dépôt est archivé.
settings.archive.tagsettings_unavailable=Le paramétrage des étiquettes n'est pas disponible si le dépôt est archivé.
-settings.archive.mirrors_unavailable = Les mirroirs ne sont pas disponibles si le dépôt a été archivé.
+settings.archive.mirrors_unavailable = Les miroirs ne sont pas disponibles si le dépôt a été archivé.
settings.unarchive.button=Désarchiver ce dépôt
settings.unarchive.header=Réhabiliter ce dépôt
settings.unarchive.text=Réhabiliter un dépôt dégèle les actions de révisions et de soumissions, la gestion des tickets et des demandes d'ajouts.
@@ -2844,6 +2847,24 @@ diff.git-notes.remove-body = Cette note sera supprimée.
diff.git-notes.add = Ajouter une note
diff.git-notes.remove-header = Supprimer la note
issues.summary_card_alt = Fiche de synthèse d'un ticket nommé "%s" dans le dépôt %s
+editor.add_tmpl.filename = fichier
+issues.num_reviews_one = %d revue
+issues.num_reviews_few = %d revues
+settings.default_update_style_desc = Style de mise à jour des demandes de fusion qui sont en retard par rapport à la branche de base.
+release.summary_card_alt = Carte résumé de la publication dont le titre est "%s" dans le dépôt %s
+pulls.sign_in_require = Identifiez vous pour créer une nouvelle demande d'ajout.
+new_from_template = Utiliser un modèle
+new_from_template_description = Vous pouvez sélectionner un modèle de dépôt existant sur cette instance et appliquer ses paramètres.
+new_advanced = Options avancées
+new_advanced_expand = Cliquer pour développer
+auto_init_description = Débuter l'historique Git avec un README et ajouter en option les fichier de licence et .gitignore.
+issues.reaction.add = Ajouter une réaction
+issues.reaction.alt_few = %[1]s a réagit %[2]s.
+issues.reaction.alt_many = %[1]s et %[2]d de plus ont réagit %[3]s.
+issues.reaction.alt_remove = Enlever la réaction %[1]s du commentaire.
+issues.reaction.alt_add = Ajouter la réaction %[1]s du commentaire.
+issues.context.menu = Menu commentaire
+summary_card_alt = Carte résumé du dépôt %s
[graphs]
component_loading = Chargement %s...
@@ -3538,6 +3559,7 @@ users.block.description = Bloquer cet utilisateur d'interagir avec ce service vi
users.admin.description = Accorder à cet utilisateur un accès complet à toutes les fonctionnalités administratives disponibles via l'interface web et l'API.
users.restricted.description = Autoriser uniquement l'interaction avec les dépôts et les organisations où cet utilisateur est ajouté en tant que collaborateur. Cela empêche l'accès aux dépôts publics sur cette instance.
users.local_import.description = Autoriser l'importation de dépôts à partir du système de fichiers local du serveur. Cela peut poser un problème de sécurité.
+monitor.duration = Durée (s)
[action]
create_repo=a créé le dépôt %s
@@ -3545,10 +3567,10 @@ rename_repo=a rebaptisé le dépôt %[1]s
en %[3]s<
commit_repo=a soumis sur %[3]s dans %[4]s
create_issue=`a ouvert le ticket %[3]s#%[2]s `
close_issue=`a fermé le ticket %[3]s#%[2]s `
-reopen_issue=`a réouvert le ticket %[3]s#%[2]s `
+reopen_issue=`a rouvert le ticket %[3]s#%[2]s `
create_pull_request=`a créé la demande d’ajout %[3]s#%[2]s `
close_pull_request=`a fermé la demande d’ajout %[3]s#%[2]s `
-reopen_pull_request=`a réouvert la demande d’ajout %[3]s#%[2]s `
+reopen_pull_request=`a rouvert la demande d’ajout %[3]s#%[2]s `
comment_issue=`a commenté le ticket %[3]s#%[2]s `
comment_pull=`a commenté la demande d’ajout %[3]s#%[2]s `
merge_pull_request=`a fusionné la demande d’ajout %[3]s#%[2]s `
@@ -3662,7 +3684,7 @@ alpine.registry=Configurez ce registre en ajoutant l’URL dans votre fichier /etc/apk/keys/ pour vérifier la signature de l'index :
alpine.registry.info=Choisissez $branch et $repository dans la liste ci-dessous.
alpine.install=Pour installer le paquet, exécutez la commande suivante :
-alpine.repository=Informations sur le Dépôt
+alpine.repository=Informations sur le dépôt
alpine.repository.branches=Branches
alpine.repository.repositories=Dépôts
alpine.repository.architectures=Architectures
@@ -3682,7 +3704,7 @@ conda.install=Pour installer le paquet en utilisant Conda, exécutez la commande
container.details.type=Type d'image
container.details.platform=Plateforme
container.pull=Tirez l'image depuis un terminal :
-container.digest=Empreinte :
+container.digest=Empreinte
container.multi_arch=SE / Arch
container.layers=Calques d'image
container.labels=Labels
@@ -3693,7 +3715,7 @@ cran.install=Pour installer le paquet, exécutez la commande suivante :
debian.registry=Configurez ce registre à partir d'un terminal :
debian.registry.info=Choisissez $distribution et $component dans la liste ci-dessous.
debian.install=Pour installer le paquet, exécutez la commande suivante :
-debian.repository=Infos sur le Dépôt
+debian.repository=Infos sur le dépôt
debian.repository.distributions=Distributions
debian.repository.components=Composants
debian.repository.architectures=Architectures
@@ -3797,6 +3819,8 @@ arch.version.conflicts = Conflits
arch.version.replaces = Remplace
arch.version.backup = Sauvegarde
arch.version.makedepends = Faire des dépendances
+container.images.title = Images
+search_in_external_registry = Rechercher dans %s
[secrets]
secrets=Secrets
@@ -3945,7 +3969,7 @@ keyword_search_unavailable = La recherche par mot-clé n'est pas disponible actu
fuzzy_tooltip = Inclure les résultats proches des termes recherchés
match = Correspondance
match_tooltip = Uniquement inclure les résultats correspondant exactement aux termes recherchés
-repo_kind = Chercher dans les dépôt...
+repo_kind = Chercher dans les dépôts...
user_kind = Chercher les utilisateurs...
org_kind = Chercher les organisations...
team_kind = Chercher les équipes...
diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini
index fa5853c92e..2f5bf6f0c1 100644
--- a/options/locale/locale_it-IT.ini
+++ b/options/locale/locale_it-IT.ini
@@ -3221,7 +3221,7 @@ auths.tip.google_plus=Ottieni le credenziali del client OAuth2 dalla console API
auths.tip.openid_connect=Utilizza l'OpenID Connect Discovery URL (/.well-known/openid-configuration) per specificare gli endpoint
auths.tip.twitter=Vai su %s, crea una applicazione e assicurati che l'opzione "Allow this application to be used to Sign In with Twitter" sia abilitata
auths.tip.discord=Registra una nuova applicazione su %s
-auths.tip.yandex=`Crea una nuova applicazione su %s. Seleziona i seguenti permessi da "Yandex. assport API": "Access to email address", "Access to user avatar" e "Access to username, name and surname, gender"`
+auths.tip.yandex=`Crea una nuova applicazione su %s. Seleziona i seguenti permessi da "Yandex.Passport API": "Access to email address", "Access to user avatar" e "Access to username, name and surname, gender"`
auths.tip.mastodon=Inserisci un URL di istanza personalizzato per l'istanza mastodon con cui vuoi autenticarti (o usa quella predefinita)
auths.edit=Modifica fonte di autenticazione
auths.activated=Questa fonte di autenticazione è attiva
diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini
index 6eb9dd634e..e2bdb940ae 100644
--- a/options/locale/locale_ko-KR.ini
+++ b/options/locale/locale_ko-KR.ini
@@ -128,7 +128,7 @@ copy_success = 복사되었습니다!
copy_error = 복사 실패
copy_type_unsupported = 이 파일 형식은 복사할 수 없습니다
error = 오류
-error404 = 도달하려는 페이지가 존재하지 않거나 볼 수 있도록 인증되지 않았습니다 .
+error404 = 도달하려는 페이지가 존재하지 않거나 볼 수 있는 권한이 없습니다 .
go_back = 돌아가기
invalid_data = 유효하지 않는 데이터: %v
unknown = 알 수 없음
@@ -159,6 +159,14 @@ filter.not_template = 템플릿이 아님
view = 보기
never = 안함
test = 테스트
+copy_path = 경로 복사
+new_repo.link = 새 저장소
+new_org.link = 새 조직
+new_repo.title = 새 저장소
+new_org.title = 새 조직
+error413 = 사용 가능한 할당량을 모두 소진하였습니다.
+new_migrate.title = 마이그레이션
+new_migrate.link = 새 마이그레이션
[aria]
navbar = 내비게이션 바
@@ -182,6 +190,20 @@ buttons.bold.tooltip = 두꺼운 텍스트 추가
buttons.code.tooltip = 코드 추가
buttons.link.tooltip = 링크 추가
buttons.quote.tooltip = 인용구 추가
+buttons.list.unordered.tooltip = 불릿 리스트 추가
+buttons.ref.tooltip = 이슈 또는 풀 리퀘스트 참조
+buttons.list.ordered.tooltip = 번호로 된 리스트 추가
+buttons.mention.tooltip = 사용자 또는 팀을 언급
+buttons.switch_to_legacy.tooltip = 대신에 구형 편집기 사용
+buttons.enable_monospace_font = 고정 폭 글꼴 활성화
+buttons.disable_monospace_font = 고정 폭 글꼴 비활성화
+buttons.list.task.tooltip = 작업 목록 추가
+buttons.new_table.tooltip = 테이블 추가
+table_modal.header = 테이블 추가
+table_modal.placeholder.header = 헤더
+table_modal.placeholder.content = 내용
+table_modal.label.rows = 행
+table_modal.label.columns = 열
[filter]
string.desc = 하 - 가
@@ -190,6 +212,9 @@ string.asc = 가 - 하
[error]
network_error = 네트워크 오류
server_internal = 내부 서버 오류
+not_found = 타겟을 찾을 수 없습니다.
+occurred = 에러가 발생함
+report_message = 이것이 Forgejo의 버그라고 생각한다면, Codeberg 에서 이슈를 검색하거나 필요하다면 새 이슈를 만들어주세요.
[startpage]
app_desc=편리한 설치형 Git 서비스
@@ -197,6 +222,10 @@ install=쉬운 설치
platform=크로스 플랫폼
lightweight=가벼움
license=오픈 소스
+platform_desc = Forgejo는 Linux와 FreeBSD등의 자유 오픈소스 운영 체제를 포함한 다양한 CPU 아키텍처에서 실행됩니다. 마음 가는대로 고르세요!
+lightweight_desc = Forgejo의 낮은 전력 소모량은 값싼 Raspberry Pi마저 구동할 수 있게 합니다. 기기의 에너지를 절약하세요!
+license_desc = Forgejo 를 설치해보세요! Forgejo를 개선하기 위해 기여 할 수 있습니다. 기여자가 되기를 망설이지 마세요!
+install_desc = 간단히 당신의 기기에서바이너리를 실행하거나 , Docker 를 사용하거나, 패키지 저장소 에서 설치할 수 있습니다.
[install]
install=설치
@@ -205,7 +234,7 @@ docker_helper=Forgejo를 Docker에서 실행하려면 설정 전에 이 형식으로 입력하세요.
-mailer_user=SMTP 사용자이름
+mailer_user=SMTP 사용자명
mailer_password=SMTP 비밀번호
register_confirm=가입시 이메일 확인 필수
mail_notify=이메일 알림 켜기
@@ -250,9 +279,9 @@ server_service_title=서버 및 기타 서비스 설정
offline_mode=로컬 모드 켜기
offline_mode.description=타사 콘텐츠 전송 네트워크를 사용하지 않도록 설정하고 모든 리소스를 로컬에서 제공합니다.
disable_gravatar=Gravatar 사용안함
-disable_gravatar.description=Gravatar 및 타사 아바타 소스를 사용하지 않도록 설정합니다. 사용자가 로컬로 아바타를 업로드하지 않는 한 기본 아바타가 사용됩니다.
+disable_gravatar.description=Gravatar를 비롯한 타사 아바타 출처를 사용하지 않도록 설정합니다. 사용자가 직접 아바타를 업로드하지 않는 한 기본 아바타를 사용합니다.
federated_avatar_lookup=탈중앙화 아바타 사용
-federated_avatar_lookup.description=libravatar 기반 오픈소스 연합 아바타 조회를 허용합니다.
+federated_avatar_lookup.description=Libravatar 아바타를 조회합니다.
disable_registration=사용자 등록 비활성화
disable_registration.description=인스턴스 관리자만이 새 사용자 계정을 추가할 수 있게 됩니다. 공개 인스턴스를 제공할 예정이고 많은 양의 스팸 계정을 감당할 준비가 되어 있지 않다면 사용자 등록을 비활성화 할 것을 강력히 권고합니다.
allow_only_external_registration.description=새 계정을 등록하려는 사용자는 설정된 외부 서비스를 이용해야만 새 계정을 등록할 수 있습니다.
@@ -264,7 +293,7 @@ enable_captcha.description=사용자 등록시 캡차를 요구합니다.
require_sign_in_view=인스턴스의 콘텐츠를 볼때 로그인 요구
admin_setting.description=관리자 계정을 만드는 것은 선택사항입니다. 첫번째로 등록된 사용자는 자동적으로 관리자로 지정됩니다.
admin_title=관리자 계정 설정
-admin_name=관리자 이름
+admin_name=관리자의 사용자명
admin_password=비밀번호
confirm_password=비밀번호 확인
admin_email=이메일 주소
@@ -273,27 +302,37 @@ test_git_failed='git' 명령 테스트 실패: %v
sqlite3_not_available=해당 버전에서는 SQLite3를 지원하지 않습니다. %s에서 공식 버전을 다운로드해주세요. ('gobuild' 버전이 아닙니다).
invalid_db_setting=데이터베이스 설정이 올바르지 않습니다: %v
invalid_repo_path=저장소(레파지토리) 의 경로가 올바르지 않습니다: %v
-run_user_not_match=실행 사용자명이 현재 사용자명과 다릅니다: %s -> %s
+run_user_not_match="실행 사용자명"이 현재 사용자명과 다릅니다: %s -> %s
save_config_failed=설정을 저장할 수 없습니다: %v
invalid_admin_setting=관리자 계정 설정이 올바르지 않습니다: %v
invalid_log_root_path=로그(Log) 의 경로가 올바르지 않습니다: %v
default_keep_email_private=이메일 주소 숨김처리를 기본값으로 설정
-default_keep_email_private.description=새 사용자에 대한 이메일 주소 숨김처리를 기본값으로 설정합니다.
+default_keep_email_private.description=새 사용자에 대한 이메일 주소 숨김처리를 기본값으로 설정해 가입 직후 정보가 유출되는것을 방지합니다.
default_allow_create_organization=조직 생성 허용을 기본값으로 설정
-default_allow_create_organization.description=신규 사용자 생성시 조직 생성을 기본값으로 설정합니다.
-default_enable_timetracking=시간 추적 사용을 기본값으로 설정
-default_enable_timetracking.description=신규 레포지토리에 대한 시간 추적 사용을 기본값으로 설정합니다.
+default_allow_create_organization.description=신규 사용자에게 기본적으로 조직 생성 권한을 부여합니다. 이 옵션이 꺼져있다면, 관리자가 신규 사용자에게 조직 생성 권한을 부여해야합니다.
+default_enable_timetracking=시간 기록 기능을 기본적으로 사용
+default_enable_timetracking.description=신규 저장소가 시간기록 기능을 기본적으로 사용할 수 있습니다.
no_reply_address=가려진 이메일 도메인
-no_reply_address_helper=가려진 이메일을 가진 사용자에게 적용될 이메일 도메인입니다. 예를 들어, 사용자 'joe'의 가려잔 이메일 도메인이 'noreply.example.org'로 설정되어 있으면 'joe@noreply.example.org'로 처리 됩니다.
+no_reply_address_helper=이메일을 가린 사용자에게 적용될 이메일 도메인입니다. 예를 들어, 사용자명 'joe'가 도메인'noreply.example.org'로 이메일을 가리면 Git에 'joe@noreply.example.org'로 로그인 하게 됩니다.
db_schema_helper = 데이터베이스 기본값 ("공개")를 사용하려면 빈 칸으로 두세요.
require_db_desc = Forgejo를 사용하려면 MySQL, PostgreSQL, SQLite3 또는 TiDB (MySQL 프로토콜) 이 설치되어 있어야 합니다.
domain = 서버 도메인
smtp_from_invalid = "이메일 발신인" 주소가 유효하지 않습니다
enable_captcha = 등록 시 CAPTCHA 활성화
allow_only_external_registration = 외부 서비스를 통한 등록만 허용
+reinstall_confirm_check_3 = Forgejo가 올바른 app.ini 위치로 실행중이며 그것이 다시 설치할 대상이 맞다는것을 전적으로 확신합니다. 위의 위험성들을 인지하고 있음에 동의합니다.
+reinstall_error = 이미 존재하는 Forgejo 데이터베이스에 설치를 시도중임
+reinstall_confirm_message = 이미 존재하는 Forgejo 데이터베이스에 재설치를 하는것은 다수의 문제의 원인이 될 수 있습니다. 대부분의 경우 이미 존재하는 "app.ini" 를 사용해 Forgejo를 구동해야합니다. 당신이 무엇을 하고있는지 명확히 알고있다면 다음 사항들을 확인하세요:
+err_admin_name_pattern_not_allowed = 관리자의 사용자명이 올바르지 않음, 사용자명이 예약된 패턴과 일치함
+allow_dots_in_usernames = 사용자들이 마침표를 사용자명에 사용할 수 있도록 허가합니다. 이미 존재하는 계정에는 영향을 주지 않습니다.
+app_slogan = 인스턴스 슬로건
+app_slogan_helper = 인스턴스의 슬로건을 입력하세요. 비워두면 비활성화됩니다.
+reinstall_confirm_check_1 = app.ini의 SECRET_KEY로 암호화 되어있는 데이터를 잃을 수 있습니다: 2FA/OTP를 통해 로그인 할 수 없으며 & 미러가 제대로 작동하지 않게됩니다. app.ini 파일에 정확한 SECRET_KEY가 있는것이 확실하다면 체크하세요.
+run_user_helper = Forgejo를 구동하는 운영체제의 사용자명입니다. 이 사용자는 저장소 루트 경로에 접근권한이 있어야 합니다.
+reinstall_confirm_check_2 = 저장소와 설정에 재동기화가 요구될 수 있습니다. 이 박스에 체크하면 저장소의 훅과 authorized_key 들을 수동으로 재동기화해야 한다는 것을 인지한다는 것을 의미합니다. 저장소와 미러의 설정이 올바른지 확인하세요.
[home]
-uname_holder=사용자 이름 또는 이메일 주소
+uname_holder=사용자명 또는 이메일 주소
password_holder=비밀번호
switch_dashboard_context=대시보드 컨텍스트 바꾸기
my_repos=저장소
@@ -395,6 +434,7 @@ issue.action.merge = @%[1]s 님이 #%[2]d를 %[3]s에 병합했습니다.
issue.action.review_dismissed = @%[1]s 님이 이 풀 리퀘스트에 대한 %[2]s의 마지막 검토를 거부했습니다.
issue.action.reject = @%[1]s 님이 이 풀 리퀘스트에 수정을 요청했습니다.
issue.action.new = @%[1]s 님이 #%[2]d를 만들었습니다.
+register_notify.text_2 = 당신의 계정에 사용자명으로 로그인 할 수 있습니다: %s
@@ -409,8 +449,8 @@ cancel=취소
modify=변경하기
[form]
-UserName=사용자 이름
-RepoName=저장소 이름
+UserName=사용자명
+RepoName=저장소명
Email=이메일 주소
Password=비밀번호
Retype=비밀번호 확인
@@ -444,14 +484,14 @@ captcha_incorrect=CAPTCHA 코드가 올바르지 않습니다.
password_not_match=비밀번호가 일치하지 않습니다.
lang_select_error=목록에서 언어를 선택해주세요.
-username_been_taken=이미 사용하고 있는 아이디입니다.
-repo_name_been_taken=이미 사용하고 있는 저장소 이름입니다.
+username_been_taken=이미 사용되는 사용자명입니다.
+repo_name_been_taken=이미 사용중인 저장소명 입니다.
org_name_been_taken=이미 사용중인 조직 이름입니다.
team_name_been_taken=이미 사용중인 팀 이름입니다.
team_no_units_error=최소 하나 이상의 레포지토리 섹션에 대한 접근을 허용하십시오.
email_been_used=이미 사용 중인 이메일 주소입니다.
-username_password_incorrect=사용자 이름 또는 암호가 올바르지 않습니다.
-enterred_invalid_repo_name=입력한 저장소의 이름이 올바르지 않습니다.
+username_password_incorrect=사용자명 또는 암호가 올바르지 않습니다.
+enterred_invalid_repo_name=입력한 저장소명이 올바르지 않습니다.
enterred_invalid_owner_name=새로운 소유자 이름이 올바르지 않습니다.
enterred_invalid_password=입력한 비밀번호는 올바르지 않습니다.
user_not_exist=존재하지 않는 사용자입니다.
@@ -467,8 +507,10 @@ target_branch_not_exist=대상 브랜치가 존재하지 않습니다.
url_error = `"%s"는 유효한 URL이 아닙니다.`
include_error = `"%s"을/를 포함해야 합니다.`
regex_pattern_error = `regex 패턴이 잘못되었습니다: %s`
-username_error = `영문("a-z", "A-Z"), 숫자("0-9"), 대시("-"), 밑줄("_"), 점(".")만 포함할 수 있습니다. 영문 혹은 숫자가 아닌 문자로 시작하거나 끝날 수 없으며 연속된 영문 혹은 숫자가 아닌 문자도 금지됩니다.`
+username_error = `영문("a-z", "A-Z"), 숫자("0-9"), 대시("-"), 밑줄("_"), 마침표(".")만 포함할 수 있습니다. 영문 혹은 숫자가 아닌 문자로 시작하거나 끝날 수 없으며 연속된 영문 혹은 숫자가 아닌 문자도 금지됩니다.`
glob_pattern_error = `glob 패턴이 잘못되었습니다: %s`
+username_error_no_dots = `영문("a-z", "A-Z"), 숫자("0-9"), 대시("-"), 밑줄("_")만 포함할 수 있습니다. 영문 혹은 숫자가 아닌 문자로 시작하거나 끝날 수 없으며 연속된 영문 혹은 숫자가 아닌 문자도 금지됩니다.`
+username_change_not_local_user = 외부 사용자들은 사용자명을 변경할 수 없습니다.
[user]
@@ -484,6 +526,9 @@ unfollow=추적해제
user_bio=소개
projects = 프로젝트
watched = 주시중인 저장소
+form.name_reserved = "%s" 사용자명이 예약(reserved)되었습니다.
+form.name_pattern_not_allowed = "%s" 패턴이 사용자명으로 사용할 수 없습니다.
+form.name_chars_not_allowed = "%s" 사용자명이 유효하지 않은 문자를 포함합니다.
[settings]
@@ -503,14 +548,14 @@ account_link=연결된 계정
organization=조직
public_profile=공개 프로필
-password_username_disabled=로컬 사용자가 아닌 경우 사용자 이름 변경을 할 수 없습니다. 자세한 내용은 관리자에게 문의해주세요.
+password_username_disabled=로컬 사용자가 아닌 경우 사용자명을 변경 할 수 없습니다. 자세한 내용은 관리자에게 문의해주세요.
full_name=성명
website=웹 사이트
location=위치
update_theme=테마 변경
update_profile=프로필 업데이트
update_profile_success=프로필이 업데이트 되었습니다.
-change_username=사용자 이름 변경 되었습니다.
+change_username=사용자명이 변경 되었습니다.
continue=계속하기
cancel=취소
language=언어
@@ -661,11 +706,14 @@ visibility.private=비공개
change_password = 비밀번호 변경
email_desc = 당신의 대표 이메일 주소는 알림, 비밀번호 재설정과 웹에서의 Git 작동에 사용되며 가려지지 않습니다.
comment_type_group_dependency = 전제조건
+change_username_prompt = 참고: 사용자명의 변경은 계정의 URL을 변경시킵니다.
+change_username_redirect_prompt = 과거 사용자명은 누군가 사용하기 전까지 리디렉트됩니다.
+comment_type_group_time_tracking = 시간 기록
[repo]
owner=소유자
-repo_name=저장소 이름
-repo_name_helper=좋은 저장소 이름은 보통 짧고 기억하기 좋은 특별한 키워드로 이루어 집니다.
+repo_name=저장소명
+repo_name_helper=좋은 저장소명은 보통 짧고 기억하기 좋은 특별한 키워드로 이루어 집니다.
repo_size=저장소 용량
template=템플릿
template_select=템플릿을 선택합니다.
@@ -914,7 +962,7 @@ issues.subscribe=구독하기
issues.unsubscribe=구독 취소
issues.delete=삭제
issues.tracker=타임 트래커
-issues.start_tracking=타임 트래킹 시작
+issues.start_tracking=시간 기록 시작
issues.start_tracking_history=`님이 %s 작업 시작`
issues.stop_tracking_history=`님이 %s 작업 중단`
issues.add_time=수동으로 시간 입력
@@ -1114,7 +1162,7 @@ settings.tracker_url_format=외부 이슈 트래커 URL 형식
settings.tracker_issue_style=외부 이슈 트래커 숫자 포맷
settings.tracker_issue_style.numeric=숫자
settings.tracker_issue_style.alphanumeric=문자 숫자
-settings.enable_timetracker=시간 추적 활성화
+settings.enable_timetracker=시간 기록 활성화
settings.allow_only_contributors_to_track_time=기여자 트랙 타임만
settings.pulls_desc=저장소 풀 리퀘스트 활성화
settings.pulls.ignore_whitespace=공백은 충돌에서 무시하기
@@ -1160,7 +1208,7 @@ settings.update_githook=Hook 갱신
settings.payload_url=대상 URL
settings.content_type=POST Content Type
settings.secret=비밀
-settings.slack_username=사용자 이름
+settings.slack_username=사용자명
settings.slack_icon_url=아이콘 URL
settings.discord_username=사용자명
settings.discord_icon_url=아이콘 URL
@@ -1301,7 +1349,7 @@ settings.trust_model.committer.desc = 유효한 서명이 커미터와 일치할
visibility_helper = 저장소 비공개로 만들기
projects.description = 설명 (선택)
settings.external_tracker_url_desc = 방문자들이 이슈 탭을 클릭하면 외부 이슈 트레커 URL로 연결됩니다.
-settings.tracker_url_format_desc = {user}
, {repo}
and {index}
를 사용자 이름, 저장소 이름, 이슈 번호로 사용할 수 있습니다.
+settings.tracker_url_format_desc = {user}
를 사용자명, {repo}
를 저장소명, {index}
를 이슈 번호로 사용할 수 있습니다.
projects = 프로젝트
projects.desc = 이슈와 풀 리퀘스트를 프로젝트에서 관리합니다.
projects.create = 프로젝트 만들기
@@ -1363,6 +1411,16 @@ issues.blocked_by_user = 당신은 이 저장소의 소유자에게 차단당했
issues.comment.blocked_by_user = 당신은 이 저장소의 소유자 혹은 이 이슈의 작성자 에게 차단당했기 떄문에 이슈에 댓글을 달 수 없습니다.
author_search_tooltip = 최대 30명의 사용자를 표시함
pulls.merged_title_desc_one = 님이 %[2]s
에서 %[3]s
로 %[1]d 커밋을 %[4]s 병합함
+issues.stop_tracking = 타이머 정지
+issues.start_tracking_short = 타이머 시작
+mirror_password_help = 사용자명을 변경해 저장된 비밀번호를 지우세요.
+issues.cancel_tracking_history = `취소된 시간 기록 %s`
+settings.enter_repo_name = 표시된 소유자와 저장소명을 정확하게 입력하세요:
+settings.packagist_username = Packagist 사용자명
+issues.tracking_already_started = `당신은 이미 다른 이슈 에서 시간을 기록중입니다!`
+adopt_search = 사용자명을 입력해 소유자가 누락된 저장소를 검색... (모두 찾으려면 비워두기)
+form.name_reserved = "%s" 저장소명이 예약되어 있습니다.
+form.name_pattern_not_allowed = "%s" 패턴이 저장소명으로 사용할 수 없습니다.
@@ -1370,7 +1428,7 @@ pulls.merged_title_desc_one = 님이 %[2]s
에서 %[3]s
jāpalaiž izpildāmā datne vajadzīgajai sistēmai, jāizmanto Docker vai jāiegūst pakotne .
platform=Pieejama dažādām platformām
lightweight=Viegla
-lightweight_desc=Forgejo ir miminālas prasības un to var darbināt uz nedārga Raspberry Pi datora. Ietaupi savai ierīcei resursus!
+lightweight_desc=Forgejo ir zemas tehniskās prasības, un tas var darboties nedārgā Raspberry Pi. Taupām savu ierīču patērēto enerģiju!
license=Atvērtā pirmkoda
license_desc=Iegūsti Forgejo ! Pievienojies mums līdzdarbojoties , lai padarītu šo projektu vēl labāku! Nekautrējies un līdzdarbojies!
-platform_desc = Ir apstiprināts, ka Forgejo darbojas brīvās operētājsistēmāš, piemēram, GNU/Linux un FreeBSD, kā arī ar dažādām procesoru arhitektūrām. Izvēlies to, kas patīk!
+platform_desc = Ir apstiprināts, ka Forgejo darbojas brīvās operētājsistēmās, piemēram, GNU/Linux un FreeBSD, kā arī ar dažādām procesoru arhitektūrām. Izvēlies to, kas patīk!
[install]
-install=Instalācija
+install=Uzstādīšana
title=Sākotnējā konfigurācija
-docker_helper=Ja Forgejo ir uzstādīts Docker konteinerī, izlasiet vadlīninas pirms maināt iestatījumus.
+docker_helper=Ja Forgejo ir uzstādīts Docker konteinerā, lūgums izlasīt vadlīnijas , pirms tiek mainīti iestatījumi.
require_db_desc=Forgejo nepieciešams MySQL, PostgreSQL, SQLite3 vai TiDB (ar MySQL protokolu).
db_title=Datubāzes iestatījumi
db_type=Datubāzes veids
@@ -247,11 +247,11 @@ db_schema_helper=Atstāt tukšu, lai izmantotu datubāzes noklusējumu ("public"
ssl_mode=SSL
path=Ceļš
sqlite_helper=SQLite3 datubāzes datnes ceļš. Jāievada pilns ceļš, ja Forgejo tiek palaists kā sistēmas pakalpojums.
-reinstall_error=Nevar instalēt datubāzē, kura jau satur Forgejo datus
+reinstall_error=Tiek mēģināts uzstādīt esošā Forgejo datubāzē
reinstall_confirm_message=Atkārtota uzstādīšana ar esošu Forgejo datubāzi var izraisīt vairākas nebūšanas. Vairumā gadījumu vajadzētu izmantot esošo "app.ini", lai palaistu Forgejo. Jāapstiprina zemāk esošais, ja ir skaidrs, kas tiek darīts:
reinstall_confirm_check_1=Dati, kas šifrēti ar SECRET_KEY, kas ir norādīta app.ini datnē, var tikt pazaudēti: lietotāji nevarēs pieteikties ar 2FA/OTP, kā arī spoguļglabātavas var pārstāt darboties. Ar šīs izvēles rūtiņas atzīmēšanu tiek apstiprināts, ka pašreizējā app.ini datne satur pareizu SECRET_KEY vērtību.
reinstall_confirm_check_2=Glabātavas un iestatījumus var būt nepieciešams atkārtoti sinhronizēt. Ar šīs izvēles rūtiņas atzīmēšanu tiek apstiprināts, ka pašrocīgi tiks veikta glabātavu aizķeru un authorized_keys datnes atkārtota sinhronizēšana, kā arī tiek apstiprināts, ka tiks nodrošināts, ka glabātavas un spoguļošanas iestatījumi ir pareizi.
-reinstall_confirm_check_3=Ar šo tiek apstiprināts, ka ir pilnīga pārliecība, ka Forgejo darbojas ar pareizu app.ini atrašanāš vietu un ka tiešām ir nepieciešama atkārtota uzstādīšana. Tiek apliecināts, ka iepriekšminētais var novest pie kļūmēm.
+reinstall_confirm_check_3=Ar šo tiek apstiprināts, ka ir pilnīga pārliecība, ka Forgejo darbojas ar pareizu app.ini atrašanās vietu un ka tiešām ir nepieciešama atkārtota uzstādīšana. Tiek apliecināts, ka iepriekšminētais var novest pie kļūmēm.
err_empty_db_path=Nav norādīts SQLite3 datu bāzes ceļš.
no_admin_and_disable_registration=Lietotāju reģistrēšanos nevar atspējot bez pārvaldītāja konta izveidošanas.
err_empty_admin_password=Pārvaldītāja parole nevar būt tukša.
@@ -267,7 +267,7 @@ repo_path=Glabātavu atrašanās vieta
repo_path_helper=Attālās Git glabātavas tiks saglabātas šajā mapē.
lfs_path=Git LFS atrašanās vieta
lfs_path_helper=Datnes, kas pievienotas Git LFS, tiks glabātas šajā mapē. Atstāt tukšu, lai atspējotu.
-run_user=Lietotājus, ar kuru palaist
+run_user=Lietotājs, ar kuru palaist
run_user_helper=Operētājsistēms lietotājs, ar kuru tiks palaists Forgejo. Jāņem vērā, ka šim lietotājam ir jābūt piekļuvei glabātavas atrašanās vietai.
domain=Servera domēna vārds
domain_helper=Domēns vai servera adrese.
@@ -314,19 +314,19 @@ admin_name=Pārvaldītāja lietotājvārds
admin_password=Parole
confirm_password=Apstiprināt paroli
admin_email=E-pasta adrese
-install_btn_confirm=Instalēt Forgejo
+install_btn_confirm=Uzstādīt Forgejo
test_git_failed=Nevarēja pārbaudīt "git" komandu: %v
sqlite3_not_available=Šī Forgejo versija neatbalsta SQLite3. Lūgums lejupielādēt oficiālo bināro versiju no %s (ne 'gobuild' versiju).
invalid_db_setting=Nederīgi datu bāzes iestatījumi: %v
invalid_db_table=Datubāzes tabula "%s" ir kļūdaina: %v
invalid_repo_path=Nederīga glabātavu atrašanās vieta: %v
-invalid_app_data_path=Lietojumprogrammas datu ceļš ir kļūdains: %v
-run_user_not_match="Izpildīt kā lietotājam" lietotājvārds neatbilst pašreizējam lietotājam: %s -> %s
+invalid_app_data_path=Lietotnes datu ceļš ir kļūdains: %v
+run_user_not_match="Lietotājs, ar kuru palaist" lietotājvārds neatbilst pašreizējam lietotājam: %s -> %s
internal_token_failed=Neizdevās izveidot iekšējo pilnvaru: %v
secret_key_failed=Neizdevās izveidot drošības atslēgu: %v
save_config_failed=Neizdevās saglabāt konfigurāciju: %v
invalid_admin_setting=Pārvaldītāja konta iestatījums ir nederīgs: %v
-invalid_log_root_path=Nederīgs žurnalizēšanas ceļš: %v
+invalid_log_root_path=Žurnāla atrašanās vieta ir nederīga: %v
default_keep_email_private=Pēc noklusējuma slēpt e-pasta adreses
default_keep_email_private.description=Pēc noklusējuma iespējot e-pasta adreses slēpšanu jauniem lietotājiem, lai šī informāciju nenoplūstu uzreiz pēc reģistrēšanās.
default_allow_create_organization=Pēc noklusējuma ļaut apvienību izveidošanu
@@ -379,7 +379,7 @@ issues.in_your_repos=Manās glabātavās
[explore]
repos=Glabātavas
users=Lietotāji
-organizations=Organizācijas
+organizations=Apvienības
search=Meklēt
go_to=Iet uz
code=Kods
@@ -424,7 +424,7 @@ account_activated=Konts ir aktivēts
prohibit_login=Konta darbība ir apturēta
prohibit_login_desc=Kontam ir liegts mijiedarboties ar serveri. Jāsazinās ar tā pārvaldītāju, lai atgūtu piekļuvi.
resent_limit_prompt=Nesen jau tika pieprasīts aktivēšanas e-pasta ziņojums. Lūgums uzgaidīt 3 minūtes un mēģināt vēlreiz.
-has_unconfirmed_mail=Sveiciens, %s! Tev ir neapstiprināta e-pasta adrese (%s ). Ja neesi saņēmis apstiprinājuma e-pasta ziņojumu vai ir nepieciešams nosūtīt jaunu, lūgums klikšķināt uz zemāk esošās pogas.
+has_unconfirmed_mail=Sveiciens, %s! Tev ir neapstiprināta e-pasta adrese (%s ). Ja nav saņemts apstiprinājuma e-pasta ziņojums vai ir nepieciešams nosūtīt jaunu, lūgums klikšķināt uz zemāk esošās pogas.
resend_mail=Klikšķināt šeit, lai atkārtoti nosūtītu aktivēšanas e-pasta ziņojumu
email_not_associate=Šī e-pasta adrese nav saistīta ar nevienu kontu.
send_reset_mail=Nosūtīt atkopes e-pasta ziņojumu
@@ -445,10 +445,10 @@ twofa_scratch_token_incorrect=Ievadīts nepareizs vienreizējais kods.
login_userpass=Pieteikties
tab_openid=OpenID
oauth_signup_tab=Izveidot jaunu kontu
-oauth_signup_title=Pabeigt jaunā konta izveidošanu
+oauth_signup_title=Pabeigt jauna konta izveidošanu
oauth_signup_submit=Pabeigt konta izveidošanu
oauth_signin_tab=Sasaistīt ar esošu kontu
-oauth_signin_title=Pieteikties, lai autorizētu sasaistīto kontu
+oauth_signin_title=Pieteikties, lai pilnvarotu sasaistīto kontu
oauth_signin_submit=Sasaistīt kontu
oauth.signin.error=Pilnvarošanas pieprasījuma apstrādes laikā atgadījās kļūda. Jā tā atkārtojas, lūgums sazināties ar vietnes pārvaldītāju.
oauth.signin.error.access_denied=Pilnvarošanas pieprasījums tika noraidīts.
@@ -462,12 +462,12 @@ openid_signin_desc=Jāievada OpenID URI. Piemēram, anna.openid.example.org vai
disable_forgot_password_mail=Konta atkopšana ir atspējota, jo nav uzstādīta e-pasta izsūtīšana. Lūgums sazināties ar vietnes pārvaldītāju.
disable_forgot_password_mail_admin=Kontu atkope ir pieejama tikai tad, kad ir veikta e-pasta servera iestatīšana. Lūgums iestatīt e-pasta serveri, lai iespējotu kontu atkopi.
email_domain_blacklisted=Nav atļauts reģistrēties ar šādu e-pasta adresi.
-authorize_application=Autorizēt lietotni
-authorize_redirect_notice=Jūs tiksiet nosūtīts uz %s, ja autorizēsiet šo lietotni.
+authorize_application=Pilnvarot lietotni
+authorize_redirect_notice=Notiks pārvirzīšana uz %s, ja pilnvaroši šo lietotni.
authorize_application_created_by=Šo lietotni izveidoja %s.
authorize_application_description=Ja nodrošināsi piekļuvi, tā varēs piekļūt visai konta informācijai un mainīt to, tajā skaitā privātās glabātavas un apvienības.
authorize_title=Pilnvarot "%s" piekļuvi Tavam kontam?
-authorization_failed=Autorizācija neizdevās
+authorization_failed=Pilnvarošana neizdevās
authorization_failed_desc=Pilnvarošana neizdevās, jo tika noteikts nederīgs pieprasījums. Lūgums sazināties ar lietotnes, no kuras tika veikts pilnvarošanas pieprasījums, uzturētāju.
sspi_auth_failed=SSPI autentifikācija neizdevās
password_pwned=Izvēlētā parole ir nozagto paroļu sarakstā , kas iepriekš ir atklāts publiskās datu noplūdēs. Lūgums mēģināt vēlreiz ar citu paroli un apsvērt to nomainīt arī citur.
@@ -507,7 +507,7 @@ register_notify.text_3=Ja šo kontu izveidoja kāds cits, vispirms ir nepiecieš
reset_password=Atgūt kontu
reset_password.title=%s, esat pieprasījis atjaunot savu kontu
-reset_password.text=Nospiediet uz saites, lai atjaunotu savu kontu lapā %s :
+reset_password.text=Lūgums klikšķināt uz šīs saites, lai atjaunotu savu %s kontu:
register_success=Reģistrācija bija sekmīga
@@ -515,7 +515,7 @@ issue_assigned.pull=@%[1]s piešķīra izmaiņu pieprasījumu %[2]s glabātavā
issue_assigned.issue=@%[1]s piešķīra pieteikumu %[2]s glabātavā %[3]s.
issue.x_mentioned_you=@%s pieminēja Jūs:
-issue.action.force_push=%[1]s piespiedu kārtā aizgādāja izmaiņas %[2]s no %[3]s uz %[4]s.
+issue.action.force_push=%[1]s uzspiesti aizgādāja izmaiņas %[2]s no %[3]s uz %[4]s.
issue.action.push_1=@%[1]s aizgādāja %[3]d iesūtījumu uz %[2]s
issue.action.push_n=@%[1]s aizgādāja %[3]d iesūtījumus uz %[2]s
issue.action.close=@%[1]s aizvēra #%[2]d.
@@ -545,9 +545,9 @@ repo.transfer.body=Lai to pieņemtu vai noraidītu, jāapmeklē %s vai arī vien
repo.collaborator.added.subject=%s pievienoja Tevi glabātavai %s kā līdzdalībnieku
repo.collaborator.added.text=Tevi pievienoja kā līdzdalībnieku glabātavā:
-team_invite.subject=%[1]s uzaicināja Jūs pievienoties organizācijai %[2]s
-team_invite.text_1=%[1]s uzaicināja Jūs pievienoties komandai %[2]s organizācijā %[3]s.
-team_invite.text_2=Uzspiediet uz šīs saites, lai pievienoties komandai:
+team_invite.subject=%[1]s uzaicināja pievienoties apvienībai %[2]s
+team_invite.text_1=%[1]s uzaicināja pievienoties apvienības %[3] komandai %[2]s.
+team_invite.text_2=Lūgums klikšķināt uz sekojošās saites, lai pievienotos komandai:
team_invite.text_3=Piezīme: šis uzaicinājums ir paredzēts %[1]s. Ja šis ielūgums netika gaidīts, šo e-pasta ziņojumu var neņemt vērā.
totp_enrolled.subject = Ir aktivēts TOTP kā divpakāpju pieteikšanās veids
account_security_caution.text_1 = Ja tas biji Tu, tad šo e-pasta ziņojumu var droši neņemt vērā.
@@ -585,7 +585,7 @@ SSHTitle=SSH atslēgas nosaukums
HttpsUrl=HTTPS URL
PayloadUrl=Vērtuma URL
TeamName=Komandas nosaukums
-AuthName=Autorizācijas nosaukums
+AuthName=Pilnvarošanas nosaukums
AdminEmail=Pārvaldītāja e-pasta adrese
NewBranchName=Jaunais zara nosaukums
@@ -621,14 +621,14 @@ username_been_taken=Lietotājvārds jau ir aizņemts.
username_change_not_local_user=Ne-lokālie lietotāji nevar mainīt savus lietotājvārdus.
username_has_not_been_changed=Lietotājvārds netika mainīts
repo_name_been_taken=Glabātavas nosaukums jau tiek izmantots.
-repository_force_private=Iespējoti piespiedu privātās glabātavas: privātās glabātavas nevar padarīt pieejamas visiem.
+repository_force_private=Iespējots "Uzspiest privātās": privātās glabātavas nevar padarīt pieejamas visiem.
repository_files_already_exist=Šajā glabātavā jau atrodas datnes. Jāsazinās ar sistēmas pārvaldītāju.
repository_files_already_exist.adopt=Šajā glabātavā jau atrodas datnes, un tās var tikai tikt pieņemtas.
repository_files_already_exist.delete=Šajā glabātavā jau atrodas datnes. Tās ir jāizdzēš.
repository_files_already_exist.adopt_or_delete=Šajā glabātavā jau atrodas datnes. Vai nu tās ir jāpieņem vai jāizdzēš.
visit_rate_limit=Attālinātā piekļuve ir ierobežota ar ātruma ierobežotāju.
2fa_auth_required=Attālinātai piekļuvei ir nepieciešama divu faktoru autentifikācija.
-org_name_been_taken=Organizācijas nosaukums jau ir aizņemts.
+org_name_been_taken=Apvienības nosaukums jau ir aizņemts.
team_name_been_taken=Komandas nosaukums jau ir aizņemts.
team_no_units_error=Komandai ir jābūt iespējotai vismaz vienai sadaļai.
email_been_used=E-pasta adrese jau ir izmantota.
@@ -641,15 +641,15 @@ password_uppercase_one=Vismaz viens lielais burts
password_digit_one=Vismaz viens cipars
password_special_one=Vismaz viena īpaša rakstzīme (punkts, iekavas, pēdiņas utt.)
enterred_invalid_repo_name=Ievadītais glabātavas nosaukums ir nepareizs.
-enterred_invalid_org_name=Ievadītais organizācijas nosaukums ir nepareizs.
+enterred_invalid_org_name=Ievadītais apvienības nosaukums ir nepareizs.
enterred_invalid_owner_name=Jaunā īpašnieka vārds nav derīgs.
enterred_invalid_password=Ievadītā parole ir nepareiza.
user_not_exist=Lietotājs nepastāv.
team_not_exist=Komanda nepastāv.
last_org_owner=Nevar noņemt īpašnieku komandas pēdējo lietotāju. Apvienībai ir jābūt vismaz vienam īpašniekam.
-cannot_add_org_to_team=Organizāciju nevar pievienot kā komandas biedru.
-duplicate_invite_to_team=Lietotājs jau ir uzaicināts kā komandas biedrs.
-organization_leave_success=Jūs esat pametis organizāciju %s.
+cannot_add_org_to_team=Apvienību nevar pievienot kā komandas dalībnieku.
+duplicate_invite_to_team=Lietotājs jau tika uzaicināts kā komandas dalībnieks.
+organization_leave_success=Ir veiksmīgi atstāta apvienība %s.
invalid_ssh_key=Nav iespējams pārbaudīt SSH atslēgu: %s
invalid_gpg_key=Nav iespējams pārbaudīt GPG atslēgu: %s
@@ -734,19 +734,19 @@ avatar=Profila attēls
ssh_gpg_keys=SSH / GPG atslēgas
social=Sociālie konti
applications=Lietotnes
-orgs=Pārvaldīt apvienības
+orgs=Apvienības
repos=Glabātavas
-delete=Dzēst kontu
+delete=Izdzēst kontu
twofa=Divpakāpju pieteikšanās (TOTP)
account_link=Saistītie konti
-organization=Organizācijas
+organization=Apvienības
uid=UID
webauthn=Divpakāpju pieteikšanās (drošības atslēgas)
public_profile=Publiskais profils
biography_placeholder=Pastāsti citiem mazliet par sevi! (Tiek atbalstīts Markdown)
location_placeholder=Kopīgot savu aptuveno atrašanās vietu ar citiem
-profile_desc=Norādīt, kā profils tiek attēlots citiem lietotājiem. Primārā e-pasta adrese tiks izmantota paziņojumiem, paroles atjaunošanai un Git tīmekļa darbībām.
+profile_desc=Par Tevi
password_username_disabled=Ārējiem lietotājiem nav atļauts mainīt savu lietotājvārdu. Lūgums sazināties ar vietnes pārvaldītāju, lai uzzinātu vairāk.
full_name=Pilns vārds
website=Mājas lapa
@@ -759,13 +759,13 @@ update_language_success=Valoda tika nomainīta.
update_profile_success=Profils tika atjaunināts.
change_username=Lietotājvārds mainīts.
change_username_prompt=Piezīme: lietotājvārda mainīšana maina arī konta URL.
-change_username_redirect_prompt=Iepriekšējais lietotājvārds tiks pārvirzīts, kamēr neviens cits to neizmanto.
+change_username_redirect_prompt=Iepriekšējais lietotājvārds tiks pārvirzīts, līdz kāds to izmantos.
continue=Turpināt
cancel=Atcelt
language=Valoda
ui=Motīvs
hidden_comment_types=Slēpjamo piebilžu veidi
-hidden_comment_types_description=Šeit atzīmētie piebilžu veidi netiks attēloti pieteikumu lapās. "Iezīme" atzīmēšana, piemēram, noņems visas " pievienoja/noņēma " piebildes.
+hidden_comment_types_description=Šeit atzīmētie piebilžu veidi netiks attēloti pieteikumu lapās. "Iezīme" atzīmēšana, piemēram, noņems visas " pievienoja/noņēma " piebildes.
hidden_comment_types.ref_tooltip=Piebildes, kurās ir atsauces uz šo pieteikumu no cita pieteikuma/iesūtījuma/…
hidden_comment_types.issue_ref_tooltip=Piebildes, kurās lietotājs maina ar pieteikumu saistītu zaru/birku
comment_type_group_reference=Atsauces
@@ -780,16 +780,16 @@ comment_type_group_dependency=Atkarības
comment_type_group_lock=Aizslēgšanas stāvoklis
comment_type_group_review_request=Izskatīšanas pieprasījums
comment_type_group_pull_request_push=Pievienotie iesūtījumi
-comment_type_group_project=Projektus
+comment_type_group_project=Projekts
comment_type_group_issue_ref=Pieteikumu atsauces
saved_successfully=Iestatījumi tika sekmīgi saglabāti.
privacy=Privātums
keep_activity_private=Profila lapā paslēpt notikumus
keep_activity_private_popup=Savu aktivitāti redzēsiet tikai Jūs un administratori
-lookup_avatar_by_mail=Meklēt profila attēlus pēc e-pasta adreses
+lookup_avatar_by_mail=Uzmeklēt profila attēlus pēc e-pasta adreses
federated_avatar_lookup=Apvienotais profila bilžu meklētājs
-enable_custom_avatar=izmantot pielāgotu profila attēlu
+enable_custom_avatar=Izmantot pielāgotu profila attēlu
choose_new_avatar=Izvēlēties jaunu profila attēlu
update_avatar=Atjaunināt attēlu
delete_current_avatar=Izdzēst pašreizējo attēlu
@@ -804,15 +804,15 @@ new_password=Jaunā parole
retype_new_password=Apstiprināt jauno paroli
password_incorrect=Ievadīta nepareiza pašreizējā parole.
change_password_success=Parole tika sekmīgi nomainīta. Turpmāk jāpiesakās ar savu jauno paroli.
-password_change_disabled=Ārējie konti nevar mainīt paroli, izmantojot, Forgejo saskarni.
+password_change_disabled=Ārējie lietotāji nevar mainīt savu paroli Forgejo tīmekļa saskarnē.
emails=E-pasta adreses
manage_emails=Pārvaldīt e-pasta adreses
manage_themes=Noklusējuma izskats
manage_openid=OpenID adreses
-email_desc=Primārā e-pasta adrese tiks izmantota paziņojumiem, paroļu atjaunošanai un, ja tā nav paslēpta, Git tīmekļa darbībām.
+email_desc=Galvenā e-pasta adrese tiks izmantota paziņojumiem, paroļu atkopei un, ja tā nav paslēpta, Git tīmekļa darbībām.
theme_desc=Šis izskats tiks izmantots tīmekļa saskarnei pēc pieteikšanās.
-primary=Primārā
+primary=Galvenā
activated=Aktivēts
requires_activation=Nepieciešama aktivēšana
primary_email=Padarīt par galveno
@@ -837,7 +837,7 @@ add_email_success=Jaunā e-pasta adrese tika pievienota.
email_preference_set_success=E-pasta izvēle tika sekmīgi iestatīta.
add_openid_success=Jaunā OpenID adrese tika pievienota.
keep_email_private=Slēpt e-pasta adresi
-keep_email_private_popup=Šis paslēps e-pasta adresi profilā. Tā vairs nebūs pēc noklusējuma izmantojamā iesūtījumiem, kuri ir izveidoti ar tīmekļa saskarni, piemēram, datņu augšupielādes un labošanas, un tā netiks izmantota apvienošanas iesūtījumiem. Tā vietā īpaša adrese %s var tikt izmantota, lai sasaistītu iesūtījumus ar kontu. Jāņem vērā, ka šīs iespējas mainīšana neietekmēs esošos iesūtījumus.
+keep_email_private_popup=E-pasta adrese netiks rādīta profilā un netiks izmantota kā noklusējums iesūtījumiem, kuri veikti tīmekļa saskarnē, piemēram, datņu augšupielādes, labošanas un apvienošanas iesūtījumi. Tā vietā īpaša adrese %s var tikt izmantota, lai sasaistītu iesūtījumus ar kontu. Šī iespēja neietekmēs esošos iesūtījumus.
openid_desc=OpenID ļauj uzticēt autentificēšanu ārējam nodrošinātājam.
manage_ssh_keys=Pārvaldīt SSH atslēgas
@@ -922,25 +922,25 @@ unbind_success=Sociālā tīkla konts tika veiksmīgi noņemts.
manage_access_token=Piekļuves pilnvaras
generate_new_token=Izveidot jaunu pilnvaru
-tokens_desc=Šīs pilnvaras nodrošina piekļuvi kontam ar Gitea API.
+tokens_desc=Šīs pilnvaras nodrošina piekļuvi kontam ar Forgejo API.
token_name=Pilnvaras nosaukums
generate_token=Izveidot pilnvaru
generate_token_success=Jaunā pilnvara tika izveidota. Tā ir jāievieto starpliktuvē, jo tā vairs netiks rādīta.
generate_token_name_duplicate=Lietotnes nosaukums %s jau tiek izmantots. Lūgums izmantot citu.
-delete_token=Dzēst
+delete_token=Izdzēst
access_token_deletion=Izdzēst piekļuves pilnvaru
access_token_deletion_cancel_action=Atcelt
access_token_deletion_confirm_action=Dzēst
-access_token_deletion_desc=Izdzēšot pilnvaru, lietojumprogrammām, kas to izmanto, tiks liegta piekļuve šim kontam. Šī darbība ir neatgriezeniska. Vai turpināt?
-delete_token_success=Pilnvara tika izdzēsta. Lietojumprogrammām, kas izmantoja šo pilnvaru, vairs nav piekļuves kontam.
+access_token_deletion_desc=Pilnvaras izdzēšana atsauks lietotņu, kas to izmanto, piekļuvi kontam. Šo darbību nevar atsaukt. Turpināt?
+delete_token_success=Pilnvara tika izdzēsta. Lietotnēm, kas to izmanto, vairs nav piekļuves kontam.
repo_and_org_access=Glabātavas un apvienības piekļuve
permissions_public_only=Tikai publiskie
permissions_access_all=Visi (publiskie, privātie un ierobežotie)
-select_permissions=Norādiet tiesības
+select_permissions=Atlasīt atļaujas
permission_no_access=Nav piekļuves
-permission_read=Skatīšanās
+permission_read=Lasīt
permission_write=Lasīt un rakstīt
-access_token_desc=Atzīmētie pilnvaras apgabali ierobežo autentifikāciju tikai atbilstošiem >API izsaukumiem. Sīkāka informācija pieejama >dokumentācijā .
+access_token_desc=Atlasītās pilnvaru atļaujas ierobežo pilnvarošanu tikai atbilstošiem API maršrutiem. Vairāk ir lasāmsdokumentācijā .
at_least_one_permission=Nepieciešams norādīt vismaz vienu tiesību, lai izveidotu pilnvaru
permissions_list=Tiesības:
@@ -948,15 +948,15 @@ manage_oauth2_applications=Pārvaldīt OAuth2 lietotnes
edit_oauth2_application=Labot OAuth2 lietotni
oauth2_applications_desc=OAuth2 lietotnes ļauj trešo pušu lietotnēm droša veidā autentificēt lietotajus šajā Forgejo instancē.
remove_oauth2_application=Noņemt OAuth2 lietotni
-remove_oauth2_application_desc=Noņemot OAuth2 lietotni, tiks noņemta piekļuve visām parakstītajām piekļuves pilnvarām. Vai turpināt?
-remove_oauth2_application_success=Lietotne tika dzēsta.
+remove_oauth2_application_desc=OAuth2 lietotnes noņemšana atsauks piekļuvi visām parakstītajām piekļuves pilnvarām. Turpināt?
+remove_oauth2_application_success=Lietotne tika izdzēsta.
create_oauth2_application=Izveidot jaunu OAuth2 lietotni
create_oauth2_application_button=Izveidot lietotni
create_oauth2_application_success=Ir sekmīgi izveidota jauna OAuth2 lietotne.
update_oauth2_application_success=OAuth2 lietotne ir sekmīgi atjaunināta.
oauth2_application_name=Lietotnes nosaukums
oauth2_confidential_client=Slepens klients. Jāatlasa lietotnēm, kas glabā noslēpumu slepenībā, piemēram, tīmekļa lietotnēm. Nav jāatlasa ierastajām lietotnēm, tajā skaitā darbvirsmas un viedierīču lietotnēm.
-oauth2_redirect_uris=Pārsūtīšanas URI. Norādiet katru URI savā rindā.
+oauth2_redirect_uris=Pārvirzīšanas URI. Lūgums norādīt katru URI savā rindā.
save_application=Saglabāt
oauth2_client_id=Klienta ID
oauth2_client_secret=Klienta noslēpums
@@ -965,65 +965,65 @@ oauth2_regenerate_secret_hint=Pazaudēts noslēpums?
oauth2_client_secret_hint=Pēc šīs lapas pamešanas vai atsvaidzināšanas noslēpums vairs netiks parādīts. Lūgums pārliecināties, ka tas ir saglabāts.
oauth2_application_edit=Labot
oauth2_application_create_description=OAuth2 lietotnes ļauj trešas puses lietotnēm piekļūt lietotāja kontiem šajā instancē.
-oauth2_application_remove_description=OAuth2 lietotnes noņemšana liegs tai piekļūt pilnvarotiem lietotāju kontiem šajā instancē. Vai turpināt?
+oauth2_application_remove_description=OAuth2 lietotnes noņemšana liegs tai piekļūt pilnvarotiem lietotāju kontiem šajā serverī. Turpināt?
oauth2_application_locked=Forgejo sāknēšanas brīdī reģistrē dažas OAuth2 lietotnes, ja tas ir iespējots konfigurācijā. Lai novērstu negaidītu uzvedību, tās nevar ne labot, ne noņemt. Lūgums vērsties OAuth2 dokumentācijā pēc vairāk informācijas.
-authorized_oauth2_applications=Autorizētās OAuth2 lietotnes
+authorized_oauth2_applications=Pilnvarotās OAuth2 lietotnes
authorized_oauth2_applications_description=Ir ļauta piekļuve savam Forgejo kontam šīm trešo pušu lietotnēm. Lūgums atsaukt piekļuvi lietotnēm, kas vairs nav nepieciešamas.
revoke_key=Atsaukt
revoke_oauth2_grant=Atsaukt piekļuvi
revoke_oauth2_grant_description=Šīs trešās puses lietotnes piekļuves atsaukšana liegs tai piekļūt Taviem datiem. Turpināt?
revoke_oauth2_grant_success=Piekļuve sekmīgi atsaukta.
-twofa_desc=Divfaktoru autentifikācija uzlabo konta drošību.
-twofa_recovery_tip=Ja ierīce tiek pazaudēta, iespējams izmantot vienreiz izmantojamo atkopšanas atslēgu, lai atgūtu piekļuvi savam kontam.
-twofa_is_enrolled=Kontam ir ieslēgta divfaktoru autentifikācija.
-twofa_not_enrolled=Kontam šobrīd nav ieslēgta divfaktoru autentifikācija.
+twofa_desc=Lai aizsargātu savu kontu no paroļu zādzības, var izmantot viedtālruni vai citu ierīci, lai saņemtu laikā balstītas vienreiz izmantojamas paroles ("TOTP").
+twofa_recovery_tip=Ja ierīce tiks pazaudēta, būs iespējams izmantot vienreizējas izmantošanas atkopšanas atslēgu, lai atgūtu piekļuvi savam kontam.
+twofa_is_enrolled=Kontam šobrīd ir ieslēgta divpakāpju pieteikšanās.
+twofa_not_enrolled=Kontam šobrīd nav ieslēgta divpakāpju pieteikšanās.
twofa_disable=Atspējot divpakāpju pieteikšanos
-twofa_scratch_token_regenerate=Atkārtoti izveidot vienreizējas izmantošanas atkopšanas atslēgu
+twofa_scratch_token_regenerate=Atkārtoti izveidot vienreizējas izmantošanas atkopes atslēgu
twofa_scratch_token_regenerated=Vienreizējā pilnvara tagad ir %s. Tā ir jāglabā drošā vietā, tā vairs nekad netiks rādīta.
twofa_enroll=Ieslēgt divpakāpju pieteikšanos
-twofa_disable_note=Nepieciešamības gadījumā divfaktoru autentifikāciju ir iespējams atslēgt.
-twofa_disable_desc=Atslēdzot divfaktoru autentifikāciju, konts vairs nebūs tik drošs. Vai turpināt?
+twofa_disable_note=Ja nepieciešams, divpakāpju pieteikšanos var atslēgt.
+twofa_disable_desc=Divpakāpju pieteikšanās atspējošana padarīs kontu mazāk drošu. Turpināt?
regenerate_scratch_token_desc=Ja atkopšanas atslēga ir pazaudēta vai tā jau ir izmantota, lai pieteiktos, to var atiestatīt šeit.
-twofa_disabled=Divfaktoru autentifikācija tika atslēgta.
+twofa_disabled=Divpakāpju pieteikšanās tika atspējota.
scan_this_image=Šis attēls ir jānolasa ar autentificēšanās lietotni:
-or_enter_secret=Vai ievadiet šo noslēpumu: %s
-then_enter_passcode=Ievadiet piekļuves kodu no lietojumprogrammas:
+or_enter_secret=Vai jāievada noslēpums: %s
+then_enter_passcode=Pēc tam jāievada lietotnē attēlotais piekļuves kods:
passcode_invalid=Piekļuves kods ir nepareizs. Jāmēģina vēlreiz.
twofa_enrolled=Kontam tika ieslēgta divpakāpju pieteikšanās. Vienreiz izmantojamā atkopšanas atslēga (%s) ir jāglabā drošā vietā, jo tā vairs netiks rādīta.
twofa_failed_get_secret=Neizdevās ielādēt noslēpumu.
-webauthn_desc=Drošības atslēgas ir fiziskas ierīces, kas satur kriptogrāfiskas atslēgas. Tās var tikt izmantotas divu faktoru autentifikācijai. Drošības atslēgām ir jāatbalsta WebAuthn autentifikācijas standarts.
+webauthn_desc=Drošības atslēgas ir ierīces, kas satur kriptogrāfiskas atslēgas. Tās var tikt izmantotas divpakāpju apliecināšanai. Drošības atslēgām ir jāatbilst WebAuthn autentificētāja standartam.
webauthn_register_key=Pievienot drošības atslēgu
webauthn_nickname=Segvārds
webauthn_delete_key=Noņemt drošības atslēgu
webauthn_delete_key_desc=Noņemot drošības atslēgu ar to vairs nebūs iespējams pieteikties. Vai turpināt?
webauthn_key_loss_warning=Ja tiek pazaudētas drošības atslēgas, tiks zaudēta piekļuve kontam.
-webauthn_alternative_tip=Ir vēlams uzstādīt papildu autentifikācijas veidu.
+webauthn_alternative_tip=Ir vēlams uzstādīt papildu autentificēšanās veidu.
manage_account_links=Sasaistītie konti
manage_account_links_desc=Šie ārējie konti ir sasaistīti ar Tavu Forgejo kontu.
account_links_not_available=Pašlaik nav neviena ārējā konta piesaistīta šim kontam.
link_account=Sasaistīt kontu
remove_account_link=Noņemt sasaistīto kontu
-remove_account_link_desc=Sasaistītā konta noņemšana atsauks tā piekļuvi Tavam Gitea kontam. Turpināt?
-remove_account_link_success=Saistītais konts tika noņemts.
+remove_account_link_desc=Sasaistītā konta noņemšana atsauks tā piekļuvi Tavam Forgejo kontam. Turpināt?
+remove_account_link_success=Sasaistītais konts tika noņemts.
hooks.desc=Pievienot tīmekļa aizķeres, kas izpildīsies visās piederošajās glabātavās .
-orgs_none=Jūs neesat nevienas organizācijas biedrs.
+orgs_none=Nav dalības nevienā apvienībā.
repos_none=Tev nav nevienas glabātavas.
delete_account=Izdzēst savu kontu
-delete_prompt=Šī darbība neatgriezeniski izdzēsīs lietotāja kontu. To NEVAR atdarīt.
+delete_prompt=Šī darbība neatgriezeniski izdzēsīs lietotāja kontu. To NEVAR atsaukt.
delete_with_all_comments=Konts ir jaunāks kā %s. Lai izvairītos no spoku piebildēm, visas pieteikumu/izmaiņu pieprasījumu piebildes tiks izdzēstas kopā ar to.
confirm_delete_account=Apstiprināt izdzēšanu
delete_account_title=Izdzēst lietotāja kontu
-delete_account_desc=Vai tiešām vēlaties dzēst šo kontu?
+delete_account_desc=Vai tiešām neatgriezeniski izdzēst šo lietotāja kontu?
email_notifications.enable=Iespējot e-pasta paziņojumus
-email_notifications.onmention=Tikai, ja piemin mani
+email_notifications.onmention=Tikai, ja mani piemin
email_notifications.disable=Atspējot e-pasta paziņojumus
email_notifications.submit=Iestatīt e-pasta iestatījumus
email_notifications.andyourown=Un manus paziņojumus
@@ -1034,7 +1034,7 @@ visibility.public_tooltip=Redzams ikvienam
visibility.limited=Ierobežota
visibility.limited_tooltip=Redzams tikai lietotājiem, kuri ir pieteikušies
visibility.private=Privāts
-visibility.private_tooltip=Redzams tikai organizāciju, kurām esi pievienojies, dalībniekiem
+visibility.private_tooltip=Redzams tikai apvienību, kurām esi pievienojies, dalībniekiem
change_password = Mainīt paroli
keep_activity_private.description = Tavas publiskās darbības būs redzamas tikai Tev un servera pārvaldītājiem.
update_hints = Atjaunināt norādes
@@ -1046,6 +1046,15 @@ blocked_users_none = Nav liegto lietotāju.
pronouns = Vietniekvārdi
pronouns_custom = Pielāgoti
blocked_users = Liegtie lietotāji
+pronouns_unspecified = Nav norādīts
+language.title = Noklusējuma valoda
+language.localization_project = Palīdzi mums tulkot Forgejo savā valodā! Uzzināt vairāk .
+hints = Norādes
+additional_repo_units_hint = Ieteikt iespējot papildu glabātavas vienības
+additional_repo_units_hint_description = Attēlot norādi "Iespējot vēl" glabātavās, kurās nav iespējotas visas pieejamās vienības.
+language.description = Šī valoda tiks saglabāta kontā un pēc pieteikšanās tiks izmantota kā noklusējuma.
+user_block_yourself = Nevar liegt sevi.
+pronouns_custom_label = Pielāgoti vietniekvārdi
[repo]
new_repo_helper=Glabātava satur visas projekta datnes, tajā skaitā izmaiņu vēsturi. Jau tiek izmantota kaut kur citur? Pārcelt glabātavu .
@@ -1080,7 +1089,7 @@ download_bundle=Lejupielādēt BUNDLE
generate_repo=Izveidot glabātavu
generate_from=Izveidot no
repo_desc=Apraksts
-repo_desc_helper=Ievadiet īsu aprakstu (neobligāts)
+repo_desc_helper=Īss apraksts (pēc izvēles)
repo_lang=Valoda
repo_gitignore_helper=Atlasīt .gitignore sagataves
repo_gitignore_helper_desc=No izplatītu valodu sagatavju saraksta jāizvēlas, kuras datnes neiekļaut. Pēc noklusējuma katras valodas būvēšanas rīku izveidotie ierastie artefakti ir iekļauti .gitignore.
@@ -1092,7 +1101,7 @@ license_helper_desc=Licence nosaka, ko citi var un ko nevar darīt ar kodu. Nav
readme=LASIMANI
readme_helper=Atlasīt README datnes sagatavi
readme_helper_desc=Šī ir vieta, kurā var ievietot izvērstu aprakstu par projektu.
-auto_init=Sāknēt glabātavu (Pievieno .gitignore, licenci un README)
+auto_init=Sāknēt glabātavu
trust_model_helper=Izvēlieties parakstu pārbaudes uzticamības modeli. Iespējamie varianti ir:
trust_model_helper_collaborator=Līdzstrādnieka: Uzticēties līdzstrādnieku parakstiem
trust_model_helper_committer=Revīzijas iesūtītāja: Uzticēties parakstiem, kas atbilst revīzijas iesūtītājam
@@ -1108,19 +1117,19 @@ mirror_interval=Starplaiks starp spoguļošanu (derīgas laika vienības ir 'h',
mirror_interval_invalid=Starplaiks starp spoguļošanu nav derīgs.
mirror_sync_on_commit=Sinhronizēt, kad tiek aizgādāti iesūtījumi
mirror_address=Klonēt no URL
-mirror_address_desc=Pieslēgšanās rekvizītus norādiet autorizācijas sadaļā.
+mirror_address_desc=Nepieciešamie pieslēgšanās dati jānorāda pilnvarošanas sadaļā.
mirror_address_url_invalid=Norādītais URL ir nederīgs. Visas URL daļas ir jānorāda pareizi.
mirror_address_protocol_invalid=Norādītais URL ir nederīgs. Var spoguļot tikai no http(s):// vai git:// adresēm.
mirror_lfs=Lielu datņu krātuve (LFS)
mirror_lfs_desc=Aktivēt LFS datu spoguļošanu.
mirror_lfs_endpoint=LFS galapunkts
mirror_lfs_endpoint_desc=Sinhronizēšana mēģinās izmantot klonēsanas URL, lai noteiktu LFS serveri . Var norādīt arī citu galapunktu, ja glabātavas LFS dati tiek glabāti kaut kur citur.
-mirror_last_synced=Pēdējo reizi sinhronizēts
+mirror_last_synced=Pēdējo reizi sinhronizēta
mirror_password_placeholder=(bez izmaiņām)
mirror_password_blank_placeholder=(nav uzstādīts)
mirror_password_help=Jānomaina lietotājvārds, lai izdzēstu saglabāto paroli.
watchers=Novērotāji
-stargazers=Zvaigžņdevēji
+stargazers=Zvaigžņu vērotāji
stars_remove_warning=Šī glabātava tiks izņemta no visām izlasēm.
forks=Atzarojumi
reactions_more=un vēl %d
@@ -1142,14 +1151,14 @@ author_search_tooltip=Tiks attēloti ne vairāk kā 30 lietotāji
tree_path_not_found_commit=Iesūtījumā %[2]s nepastāv ceļš %[1]s
tree_path_not_found_branch=Zarā %[2]s nepastāv ceļš %[1]s
-tree_path_not_found_tag=Tagā %[2]s nepastāv ceļš %[1]s
+tree_path_not_found_tag=Birkā %[2]s nepastāv ceļš %[1]s
transfer.accept=Pieņemt nodošanu
transfer.accept_desc=`Mainīt īpašnieku uz "%s"`
transfer.reject=Noraidīt nodošanu
transfer.reject_desc=`Atcelt īpašnieka maiņu uz "%s"`
-transfer.no_permission_to_accept=Nav atļaujas pieņemt šo pārsūtīšanu.
-transfer.no_permission_to_reject=Nav atļaujas noraidīt šo pārsūtīšanu.
+transfer.no_permission_to_accept=Nav atļaujas pieņemt šo nodošanu.
+transfer.no_permission_to_reject=Nav atļaujas noraidīt šo nodošanu.
desc.private=Privāts
desc.public=Publisks
@@ -1166,7 +1175,7 @@ template.webhooks=Tīmekļa aizķeres
template.topics=Tēmas
template.avatar=Profila attēls
template.issue_labels=Pieteikumu iezīmes
-template.one_item=Norādiet vismaz vienu sagataves vienību
+template.one_item=Jāatlasa vismaz viens sagataves vienums
template.invalid=Jāatlasa sagataves glabātava
archive.title=Šī glabātava ir arhivēta. Tajā var apskatīt datnes, un to var klonēt, bet nevar aizgādāt izmaiņas vai izveidot pieteikumus vai izmaiņu pieprasījumus.
@@ -1179,7 +1188,7 @@ form.reach_limit_of_creation_n=Īpašnieks jau ir sasniedzis %d glabātavu ierob
form.name_reserved=Glabātavas nosaukums "%s" ir aizņemts.
form.name_pattern_not_allowed="%s" nav ļauts izmantot glabātavas nosaukumā.
-need_auth=Autorizācija
+need_auth=Pilnvarošana
migrate_options=Pārcelšanas iespējas
migrate_service=Migrācijas serviss
migrate_options_mirror_helper=Šī glabātava būs spoguļglabātava
@@ -1207,26 +1216,26 @@ migrate.invalid_local_path=Nederīgs vietējais ceļš. Tas nepastāv vai nenor
migrate.invalid_lfs_endpoint=LFS galapunkts nav derīgs.
migrate.failed=Pārcelšana neizdevās: %v
migrate.migrate_items_options=Ir nepieciešama piekļuves pilnvara, lai pārceltu papildu vienumus
-migrated_from=Migrēts no %[2]s
+migrated_from=Pārcelta no %[2]s
migrated_from_fake=Pārcelta no %[1]s
migrate.migrate=Pārcelt no %s
migrate.migrating=Pārceļ no %s ...
migrate.migrating_failed=Pārcelšana no %s neizdevās.
migrate.migrating_failed.error=Neizdevās pārcelt: %s
migrate.migrating_failed_no_addr=Pārcelšana neizdevās.
-migrate.github.description=Migrēt datus no github.com vai citām GitHub instancēm.
+migrate.github.description=Pārcelt datus no github.com vai GitHub Enterprise servera.
migrate.git.description=Pārcelt tikai glabātavu no jebkura Git pakalpojuma.
-migrate.gitlab.description=Migrēt datus no gitlab.com vai citām GitLab instancēm.
-migrate.gitea.description=Pārcelt datus no gitea.com vai citiem Gitea/Forgejo serveriem.
-migrate.gogs.description=Migrēt datus no notabug.org vai citām Gogs instancēm.
-migrate.onedev.description=Migrēt datus no code.onedev.io vai citām OneDev instancēm.
-migrate.codebase.description=Migrēt datus no codebasehq.com.
-migrate.gitbucket.description=Migrēt datus no GitBucket instancēm.
-migrate.migrating_git=Migrē git datus
-migrate.migrating_topics=Migrē tēmas
-migrate.migrating_milestones=Migrē atskaites punktus
+migrate.gitlab.description=Pārcelt datus no gitlab.com vai citiem GitLab serveriem.
+migrate.gitea.description=Pārcelt datus no gitea.com vai citiem Gitea serveriem.
+migrate.gogs.description=Pārcelt datus no notabug.org vai citiem Gogs serveriem.
+migrate.onedev.description=Pārcelt datus no code.onedev.io vai citiem OneDev serveriem.
+migrate.codebase.description=Pārcelt datus no codebasehq.com.
+migrate.gitbucket.description=Pārcelt datus no GitBucket serveriem.
+migrate.migrating_git=Pārceļ Git datus
+migrate.migrating_topics=Pārceļ tēmas
+migrate.migrating_milestones=Pārceļ atskaites punktus
migrate.migrating_labels=Pārceļ iezīmes
-migrate.migrating_releases=Migrē laidienus
+migrate.migrating_releases=Pārceļ laidienus
migrate.migrating_issues=Pārnes pieteikumus
migrate.migrating_pulls=Pārceļ izmaiņu pieprasījumus
migrate.cancel_migrating_title=Atcelt pārcelšanu
@@ -1264,7 +1273,7 @@ clear_ref=`Notīrīt pašreizējo atsauci`
filter_branch_and_tag=Atlasīt zaru vai birku
find_tag=Atrast birku
branches=Zari
-tags=Tagi
+tags=Birkas
issues=Pieteikumi
pulls=Izmaiņu pieprasījumi
project_board=Projekti
@@ -1282,12 +1291,12 @@ releases=Laidieni
tag=Tags
released_this=izveidoja šo laidienu
tagged_this=izveidoja tagu revīzijai
-file.title=%s atzarā %s
+file.title=%s zarā %s
file_raw=Neapstrādāts
file_history=Vēsture
file_view_source=Skatīt avotu
-file_view_rendered=Skatīt rezultātu
-file_view_raw=Rādīt neapstrādātu
+file_view_rendered=Skatīt atveidojumu
+file_view_raw=Apskatīt neapstrādātu
file_permalink=Patstāvīgā saite
file_too_large=Datne ir pārāk liela, lai to parādītu.
invisible_runes_header=Šī datne satur neredzamas unikoda rakstzīmes
@@ -1337,7 +1346,7 @@ editor.delete_this_file=Izdzēst datni
editor.must_have_write_access=Ir jābūt rakstīšanas piekļuvei, lai šajā datnē veiktu vai ierosinātu izmaiņas.
editor.file_delete_success=Datne "%s" tika izdzēsta.
editor.name_your_file=Jāpiešķir datnei nosaukums…
-editor.filename_help=Mapi var pievienot, ja ieraksta tās nosaukumu, aiz kura ir slīpsvītra ('/'). Mapi var noņemt ar atpakaļatkāpes taustiņa nospiešanu ievades lauka sākumā.
+editor.filename_help=Mapi var pievienot, ja ieraksta tās nosaukumu, aiz kura ir slīpsvītra ("/"). Mapi var noņemt ar atpakaļatkāpes taustiņa nospiešanu ievades lauka sākumā.
editor.or=vai
editor.cancel_lower=Atcelt
editor.commit_signed_changes=Iesūtīt parakstītas izmaiņas
@@ -1345,13 +1354,13 @@ editor.commit_changes=Iesūtīt izmaiņas
editor.add_tmpl=Pievienot "<%s>"
editor.add_tmpl.filename = datnes nosaukums
editor.add=Pievienot %s
-editor.update=Atjaunot %s
+editor.update=Atjaunināt %s
editor.delete=Dzēst %s
editor.patch=Pielietot ielāpu
editor.patching=Pielieto ielāpu:
editor.fail_to_apply_patch=`Neizdevās pielietot ielāpu "%s"`
editor.new_patch=Jauns ielāps
-editor.commit_message_desc=Pievienot neobligātu paplašinātu aprakstu…
+editor.commit_message_desc=Pēc izvēles var pievienot paplašinātu aprakstu…
editor.signoff_desc=Iesūtījuma žurnāla ziņojumam pievienot noslēgumu Signed-off-by ar iesūtītāju.
editor.commit_directly_to_this_branch=Iesūtīt uzreiz zarā %[1]s .
editor.create_new_branch=Izveidot šim iesūtījumam jaunu zaru un uzsākt izmaiņu pieprasījumu.
@@ -1376,7 +1385,7 @@ editor.commit_empty_file_text=Iesūtāmā datne ir tukša. Turpināt?
editor.no_changes_to_show=Nav izmaiņu, ko rādīt.
editor.fail_to_update_file=Neizdevās atjaunināt/izveidot datni "%s".
editor.fail_to_update_file_summary=Kļūdas ziņojums:
-editor.push_rejected_no_message=Serveris noraidīja izmaiņas bez paziņojuma. Lūgums pārbaudīt Git aizķeres.
+editor.push_rejected_no_message=Serveris bez paziņojuma noraidīja izmaiņas. Lūgums pārbaudīt Git aizķeres.
editor.push_rejected=Serveris noraidīja izmaiņas. Lūgums pārbaudīt Git aizķeres.
editor.push_rejected_summary=Pilns noraidīšanas ziņojums:
editor.add_subdir=Pievienot mapi…
@@ -1405,10 +1414,10 @@ commits.older=Vecāki
commits.newer=Jaunāki
commits.signed_by=Parakstījis
commits.signed_by_untrusted_user=Parakstījis neuzticams lietotājs
-commits.signed_by_untrusted_user_unmatched=Parakstījis neuzticams lietotājs, kas neatbilst izmaiņu autoram
-commits.gpg_key_id=GPG atslēgas Id
+commits.signed_by_untrusted_user_unmatched=Parakstījis neuzticams lietotājs, kurš neatbilst iesūtītājam
+commits.gpg_key_id=GPG atslēgas identifikators
commits.ssh_key_fingerprint=SSH atslēgas nospiedums
-commits.view_path=Skatīt šajā vēstures punktā
+commits.view_path=Apskatīt šajā vēstures punktā
commit.operations=Darbības
commit.revert=Atgriezt
@@ -1419,21 +1428,21 @@ commit.cherry-pick-header=Izlasīt: %s
commit.cherry-pick-content=Atlasīt zaru, uz kuru izlasīt:
commitstatus.error=Kļūda
-commitstatus.failure=Kļūme
+commitstatus.failure=Atteice
commitstatus.pending=Nav iesūtīts
commitstatus.success=Pabeigts
-ext_issues=Piekļuve ārējiem pieteikumiem
+ext_issues=Ārēji pieteikumi
ext_issues.desc=Saite uz ārējo problēmu sekotāju.
projects=Projekti
projects.desc=Pārvaldīt pieteikumus un izmaiņu pieprasījumus projektos.
-projects.description=Apraksts (neobligāts)
+projects.description=Apraksts (pēc izvēles)
projects.description_placeholder=Apraksts
projects.create=Izveidot projektu
projects.title=Nosaukums
projects.new=Jauns projekts
-projects.new_subheader=Koordinē, seko un atjauno savu darbu centralizēti, lai projekts būtu izsekojams un vienmēr laikā.
+projects.new_subheader=Saskaņo, pārraugi un atjaunini savu darbu vienā vietā, lai projekti būtu caurskatāmi un vienmēr laikā.
projects.create_success=Projekts "%s" tika izveidots.
projects.deletion=Izdzēst projektu
projects.deletion_desc=Projekta izdzēšana noņem to no visiem saistītajiem pieteikumiem. Turpināt?
@@ -1453,7 +1462,7 @@ projects.column.edit_title=Nosaukums
projects.column.new_title=Nosaukums
projects.column.new_submit=Izveidot aili
projects.column.new=Jauna aile
-projects.column.set_default=Iestatīt kā noklusējumu
+projects.column.set_default=Iestatīt kā noklusējuma
projects.column.set_default_desc=Iestatīt šo aili kā noklusējumu neapkopotiem pieteikumiem un izmaiņu pieprasījumiem
projects.column.unset_default=Atiestatīt noklusēto
projects.column.unset_default_desc=Noņemt šo kolonnu kā noklusēto
@@ -1467,7 +1476,7 @@ projects.card_type.desc=Kartīšu priekšskatījumi
projects.card_type.images_and_text=Attēli un teksts
projects.card_type.text_only=Tikai teksts
-issues.desc=Organizēt kļūdu ziņojumus, uzdevumus un atskaites punktus.
+issues.desc=Kļūdu ziņojumus, uzdevumu un atskaites punktu apkopošana.
issues.filter_assignees=Filtrēt pēc atbildīgajiem
issues.filter_milestones=Filtrēt pēc atskaites punkta
issues.filter_projects=Filtrēt pēc projekta
@@ -1485,7 +1494,7 @@ issues.new.open_projects=Atvērtie projekti
issues.new.closed_projects=Aizvērtie projekti
issues.new.no_items=Nav neviena ieraksta
issues.new.milestone=Atskaites punkts
-issues.new.no_milestone=Nav atskaites punktu
+issues.new.no_milestone=Nav atskaites punkta
issues.new.clear_milestone=Notīrīt atskaites punktus
issues.new.open_milestone=Atvērtie atskaites punkti
issues.new.closed_milestone=Aizvērtie atskaites punkti
@@ -1588,14 +1597,14 @@ issues.opened_by_fake=%[2]s atvēra %[1]s
issues.closed_by_fake=%[2]s aizvēra %[1]s
issues.previous=Iepriekšējā
issues.next=Nākamā
-issues.open_title=Atvērta
-issues.closed_title=Slēgta
+issues.open_title=Atvērti
+issues.closed_title=Aizvērti
issues.draft_title=Melnraksts
issues.num_comments_1=%d piebilde
issues.num_comments=%d piebildes
issues.commented_at=`pievienoja piebildi %s `
issues.delete_comment_confirm=Vai tiešām izdzēst šo piebildi?
-issues.context.copy_link=Kopēt saiti
+issues.context.copy_link=Ievietot saiti starpliktuvē
issues.context.quote_reply=Citēt atbildi
issues.context.reference_issue=Atsaukties jaunā pieteikumā
issues.context.edit=Labot
@@ -1691,7 +1700,7 @@ issues.unlock.title=Atslēgt šī pieteikuma apspriešanu.
issues.comment_on_locked=Nevar pievienot piebildi aizslēgtam pieteikumam.
issues.delete=Dzēst
issues.delete.title=Izdzēst šo pieteikumu?
-issues.delete.text=Vai patiešām vēlaties dzēst šo problemu? (Neatgriezeniski tiks izdzēsts viss saturs. Apsveriet iespēju to aizvērt, ja vēlaties informāciju saglabāt vēsturei)
+issues.delete.text=Vai tiešām izdzēst šo pieteikumu? (Tas neatgriezeniski noņems visu saturu. Tā vietā vēlams apsvērt aizvēršanu, ja ir paredzēts paturēt to arhivētu)
issues.tracker=Laika uzskaite
issues.start_tracking_short=Uzsākt laika skaitīšanu
issues.start_tracking=Uzsākt laika uzskaiti
@@ -1701,7 +1710,7 @@ issues.tracking_already_started=`Laika uzskaite jau ir uzsākta cit
issues.stop_tracking=Apturēt laika uzskaitīšanu
issues.stop_tracking_history=` beidza strādāt %s`
issues.cancel_tracking=Atmest
-issues.cancel_tracking_history=`atcēla laika uzskaiti %s`
+issues.cancel_tracking_history=`atcēla laika uzskaitīšanu %s`
issues.add_time=Pašrocīgi pievienot laiku
issues.del_time=Dzēst šo laika žurnāla ierakstu
issues.add_time_short=Pievienot laiku
@@ -1719,25 +1728,25 @@ issues.error_modifying_due_date=Neizdevās izmainīt izpildes termiņu.
issues.error_removing_due_date=Neizdevās noņemt izpildes termiņu.
issues.push_commit_1=pievienoja %d iesūtījumu %s
issues.push_commits_n=pievienoja %d iesūtījumus %s
-issues.force_push_codes=`veica piespiedu aizgādāšanu zarā %[1]s no %[2]s
to %[4]s
%[6]s`
+issues.force_push_codes=`veica uzspiestu aizgādāšanu zarā %[1]s no %[2]s
uz %[4]s
%[6]s`
issues.force_push_compare=Salīdzināt
issues.due_date_form=dd.mm.gggg.
issues.due_date_form_add=Pievienot izpildes termiņu
issues.due_date_form_edit=Labot
issues.due_date_form_remove=Noņemt
issues.due_date_not_writer=Ir nepieciešama rakstīšanas piekļuve šim repozitorijam, lai varētu mainīt problēmas plānoto izpildes datumu.
-issues.due_date_not_set=Izpildes termiņš nav uzstādīts.
-issues.due_date_added=pievienoja izpildes termiņu %s %s
-issues.due_date_modified=mainīja termiņa datumu no %[2]s uz %[1]s %[3]s
-issues.due_date_remove=noņēma izpildes termiņu %s %s
+issues.due_date_not_set=Nav uzstādīts izpildes datums.
+issues.due_date_added=pievienoja izpildes datumu %s %s
+issues.due_date_modified=mainīja izpildes datumu no %[2]s uz %[1]s %[3]s
+issues.due_date_remove=noņēma izpildes datumu %s %s
issues.due_date_overdue=Nokavēts
issues.due_date_invalid=Izpildes datums nav derīgs vai tas ir ārpus datumu apgabala. Lūgums izmantot pierakstu "gggg-mm-dd".
issues.dependency.title=Atkarības
issues.dependency.issue_no_dependencies=Nav atkarību.
issues.dependency.pr_no_dependencies=Nav atkarību.
-issues.dependency.no_permission_1=Nav tiesību nolasīt %d atkarību
-issues.dependency.no_permission_n=Nav tiesību nolasīt %d atkarības
-issues.dependency.no_permission.can_remove=Nav tiesību nolasīt šo atkarību, bet iespējams to noņemt
+issues.dependency.no_permission_1=Nav tiesību lasīt %d atkarību
+issues.dependency.no_permission_n=Nav tiesību lasīt %d atkarības
+issues.dependency.no_permission.can_remove=Nav tiesību lasīt šo atkarību, bet ir iespējams to noņemt
issues.dependency.add=Pievienot atkarību…
issues.dependency.cancel=Atcelt
issues.dependency.remove=Noņemt
@@ -1751,7 +1760,7 @@ issues.dependency.pr_close_blocks=Šis izmaiņu pieprasījums liedz zemāk esoš
issues.dependency.issue_close_blocked=Nepieciešams aizvērt visus pieteikumus, kas aiztur šo pieteikumu, lai to varētu aizvērt.
issues.dependency.issue_batch_close_blocked=Nav iespējama vairāku izvēlēto pieteikumu aizvēršana, jo pieteikumam #%d joprojām ir atvērtas atkarības
issues.dependency.pr_close_blocked=Nepieciešams aizvērt visus pieteikumus, kas aiztur šo izmaiņu pieprasījumu, lai to varētu iekļaut.
-issues.dependency.blocks_short=Bloķē
+issues.dependency.blocks_short=Aiztur
issues.dependency.blocked_by_short=Atkarīgs no
issues.dependency.remove_header=Noņemt atkarību
issues.dependency.issue_remove_text=Tas noņems atkarību no šī pieteikuma. Turpināt?
@@ -1765,13 +1774,13 @@ issues.dependency.add_error_cannot_create_circular=Nevar izveidot atkarību ar d
issues.dependency.add_error_dep_not_same_repo=Abiem pieteikumiem jābūt vienā un tajā pašā glabātavā.
issues.review.self.approval=Nevar apstiprināt savu izmaiņu pieprasījumu.
issues.review.self.rejection=Nevar pieprasīt izmaiņas savam izmaiņu pieprasījumam.
-issues.review.approve=apstiprināja izmaiņas %s
+issues.review.approve=apstiprināja šīs izmaiņas %s
issues.review.comment=izskatīja %s
issues.review.dismissed=atmeta %s izskatīšanu %s
issues.review.dismissed_label=Atmesta
issues.review.left_comment=pievienoja piebildi
issues.review.content.empty=Ir nepieciešams pievienot piebildi par pieprasīto(ajām) izmaiņu(ām).
-issues.review.reject=pieprasīja izmaiņas %s
+issues.review.reject=pieprasīja labojumus %s
issues.review.wait=tika pieprasīts izskatīt %s
issues.review.add_review_request=pieprasīja izskatīšanu no %[1]s %[2]s
issues.review.remove_review_request=noņēma izskatīšanas pieprasījumu %[1]s %[2]s
@@ -1810,7 +1819,7 @@ pulls.view=Apskatīt izmaiņu pieprasījumu
pulls.compare_changes=Jauns izmaiņu pieprasījums
pulls.allow_edits_from_maintainers=Atļaut labojumus no uzturētājiem
pulls.allow_edits_from_maintainers_desc=Lietotāji ar rakstīšanas piekļuvi pamata zaram var aizgādāt izmaiņas arī šajā zarā
-pulls.allow_edits_from_maintainers_err=Atjaunošana neizdevās
+pulls.allow_edits_from_maintainers_err=Atjaunināšana neizdevās
pulls.compare_changes_desc=Jāatlasa zars, kurā iekļaut izmaiņas, un zars, no kura tās atgādāt.
pulls.has_viewed_file=Apskatīta
pulls.has_changed_since_last_review=Izmainīts kopš pēdējās izskatīšanas
@@ -1820,13 +1829,13 @@ pulls.collapse_files=Savērst visas datnes
pulls.compare_base=pamata
pulls.compare_compare=atgādāt no
pulls.switch_comparison_type=Mainīt salīdzināšanas tipu
-pulls.switch_head_and_base=Mainīt galvas un pamata atzarus
+pulls.switch_head_and_base=Apmainīt galotnes un pamata zarus
pulls.filter_branch=Atlasīt zarus
pulls.no_results=Nekas netika atrasts.
pulls.show_all_commits=Rādīt visus iesūtījumus
pulls.show_changes_since_your_last_review=Rādīt izmaiņas kopš Tavas pēdējās izskatīšanas
pulls.showing_only_single_commit=Rāda tikai iesūtījuma %[1]s izmaiņas
-pulls.showing_specified_commit_range=Rāda tikai izmaiņas starp %[1]s..%[2]s
+pulls.showing_specified_commit_range=Rāda izmaiņas tikai starp %[1]s..%[2]s
pulls.select_commit_hold_shift_for_range=Atlasīt iesūtījumu. Jātur Shift + klikšķis, lai atlasītu vairākus
pulls.review_only_possible_for_full_diff=Izskatīšana ir iespējama tikai tad, kad tiek apskatīts pilns salīdzinājums
pulls.filter_changes_by_commit=Atlasīt pēc iesūtījuma
@@ -1859,7 +1868,7 @@ pulls.is_checking=Notiek apvienošanas nesaderību pārbaude. Pēc brīža jām
pulls.is_ancestor=Zars jau ir pilnībā iekļauts mērķa zarā. Nav izmaiņu, ko apvienot.
pulls.is_empty=Šī zara izmaiņas jau ir mērķa zarā. Šis būs tukšs iesūtījums.
pulls.required_status_check_failed=Dažas no nepieciešamajām pārbaudēm bija nesekmīgas.
-pulls.required_status_check_missing=Trūkst dažu obligāto pārbaužu.
+pulls.required_status_check_missing=Trūkst dažu nepieciešamo pārbaužu.
pulls.required_status_check_administrator=Kā pārvaldītājs joprojām vari iekļaut šo izmaiņu pieprasījumu.
pulls.blocked_by_approvals=Šim izmaiņu pieprasījumam vēl nav pietiekami daudz apstiprinājumu. Nodrošināti %d no %d apstiprinājumiem.
pulls.blocked_by_rejection=Šim izmaiņu pieprasījumam oficiālais izskatītājs ir pieprasījis labojumus.
@@ -1878,7 +1887,7 @@ pulls.reject_count_1=%d labojumu pieprasījums
pulls.reject_count_n=%d izmaiņu pieprasījumi
pulls.waiting_count_1=nepieciešama %d izskatīšana
pulls.waiting_count_n=nepieciešamas %d izskatīšanas
-pulls.wrong_commit_id=iesūtījuma identifikatoram jābūt mērķa zara iesūtījuma identifikatoram
+pulls.wrong_commit_id=iesūtījuma identifikatoram jābūt iesūtījuma identifikatoram mērķa zarā
pulls.no_merge_desc=Šo izmaiņu pieprasījumu nevar iekļaut, jo visas glabātavas apvienošanas iespējas ir atspējotas.
pulls.no_merge_helper=Jāiespējo apvienošanas iespējas glabātavas iestatījumos vai arī izmaiņu pieprasījums jāiekļauj pašrocīgi.
@@ -1886,7 +1895,7 @@ pulls.no_merge_wip=Šo izmaiņu pieprasījumu nav iespējams iekļaut, jo tas ir
pulls.no_merge_not_ready=Šis izmaiņu pieprasījums nav gatavs apvienošanai, jāpārbauda izskatīšanas stāvoklis un stāvokļa pārbaudes.
pulls.no_merge_access=Nav pilnvaru, lai iekļautu šo izmaiņu pieprasījumu.
pulls.merge_pull_request=Izveidot apvienošanas iesūtījumu
-pulls.rebase_merge_pull_request=Pārbāzēt un pārtīt uz priekšu
+pulls.rebase_merge_pull_request=Pārbāzēt, tad pārlēkt
pulls.rebase_merge_commit_pull_request=Pārbāzēt, tad izveidot apvienošanas iesūtījumu
pulls.squash_merge_pull_request=Izveidot saspiešanas iesūtījumu
pulls.merge_manually=Pašrocīgi apvienots
@@ -1899,8 +1908,8 @@ pulls.merge_conflict_summary=Kļūdas ziņojums
pulls.rebase_conflict=Apvienošana neizdevās: iesūtījuma %[1]s pārbāzēšanas laikā radās nesaderība. Norāde: jāmēģina cita pieeja
pulls.rebase_conflict_summary=Kļūdas ziņojums
pulls.unrelated_histories=Apvienošana neizdevās: apvienošanas galotnei un pamatam nav kopējas vēstures. Norāde: jāmēģina cita pieeja
-pulls.merge_out_of_date=Apvienošana neizdevās: apvienošanas laikā pamata zars tika atjaunināts. Norāde: jāmēģina vēlreiz.
-pulls.head_out_of_date=Apvienošana neizdevās: apvienošanas laikā galotne tika atjaunināta. Norāde: jāmēģina vēlreiz.
+pulls.merge_out_of_date=Apvienošana neizdevās: iekļaušanas laikā pamata zars tika atjaunināts. Norāde: jāmēģina vēlreiz.
+pulls.head_out_of_date=Apvienošana neizdevās: iekļaušanas laikā galotne tika atjaunināta. Norāde: jāmēģina vēlreiz.
pulls.has_merged=Neizdevās: izmaiņu pieprasījums tika iekļauts, to nevar darīt atkārtoti vai mainīt mērķa zaru.
pulls.push_rejected=Aizgādāšana neizdevās: aizgādāšana tika noraidīta. Jāpārskata šīs glabātavas Git aizķeres.
pulls.push_rejected_summary=Pilns noraidīšanas ziņojums
@@ -1911,7 +1920,7 @@ pulls.status_checks_success=Visas pārbaudes bija sekmīgas
pulls.status_checks_warning=Dažas pārbaudes ziņoja brīdinājumus
pulls.status_checks_failure=Dažas pārbaudes neizdevās izpildīt
pulls.status_checks_error=Dažu pārbaužu izpildes laikā, radās kļūdas
-pulls.status_checks_requested=Obligāts
+pulls.status_checks_requested=Nepieciešama
pulls.status_checks_details=Papildu informācija
pulls.status_checks_hide_all=Paslēpt visas pārbaudes
pulls.status_checks_show_all=Parādīt visas pārbaudes
@@ -1943,8 +1952,8 @@ pulls.auto_merge_canceled_schedule=Šī izmaiņu pieprasījuma automātiskā apv
pulls.auto_merge_newly_scheduled_comment=`ieplānoja šī izmaiņu pieprasījuma automātisko apvienošanu, kad visas pārbaudes tiks sekmīgi pabeigtas %[1]s`
pulls.auto_merge_canceled_schedule_comment=`atcēla šī izmaiņu pieprasījuma automātisku apvienošanu pēc visu pārbaužu sekmīgas izpildes %[1]s`
-pulls.delete.title=Dzēst šo izmaiņu pieprasījumu?
-pulls.delete.text=Vai patiešām vēlaties dzēst šo izmaiņu pieprasījumu? (Neatgriezeniski tiks izdzēsts viss saturs. Apsveriet iespēju to aizvērt, ja vēlaties informāciju saglabāt vēsturei)
+pulls.delete.title=Izdzēst šo izmaiņu pieprasījumu?
+pulls.delete.text=Vai tiešām izdzēst šo izmaiņu pieprasījumu? (Tiks neatgriezeniski izdzēsts viss saturs. Jāapsver iespēja to aizvērt, ja ir nolūks to paturēt arhivētu)
pulls.recently_pushed_new_branches=Tu aizgādāji izmaiņas zarā %[1]s %[2]s
@@ -1954,7 +1963,7 @@ milestones.new=Jauns atskaites punkts
milestones.closed=Aizvērts %s
milestones.update_ago=Atjaunināts %s
milestones.no_due_date=Bez termiņa
-milestones.open=Atvērta
+milestones.open=Atvērts
milestones.close=Aizvērt
milestones.new_subheader=Atskaites punkti var palīdzēt pārvaldīt pieteikumus un sekot to attīstībai.
milestones.completeness=Pabeigtni %d%%
@@ -1963,7 +1972,7 @@ milestones.title=Virsraksts
milestones.desc=Apraksts
milestones.due_date=Beigu datums (pēc izvēles)
milestones.clear=Notīrīt
-milestones.invalid_due_date_format=Beigu datuma pierakstam ir jābūt 'yyyy-mm-dd'.
+milestones.invalid_due_date_format=Beigu datuma pierakstam ir jābūt "yyyy-mm-dd".
milestones.create_success=Tika izveidots atskaites punkts "%s".
milestones.edit=Labot atskaites punktu
milestones.edit_subheader=Atskaites punkti ļauj sakārtot pieteikumus un sekot attīstībai.
@@ -1973,8 +1982,8 @@ milestones.edit_success=Atskaites punkts "%s" tika atjaunināts.
milestones.deletion=Izdzēst atskaites punktu
milestones.deletion_desc=Atskaites punkta izdzēšana noņems to no visiem saistītajiem pieteikumiem. Turpināt?
milestones.deletion_success=Atskaites punkts tika izdzēsts.
-milestones.filter_sort.earliest_due_data=Tuvākais izpildes datums
-milestones.filter_sort.latest_due_date=Tālākais izpildes datums
+milestones.filter_sort.earliest_due_data=Agrākais izpildes datums
+milestones.filter_sort.latest_due_date=Vēlākais izpildes datums
milestones.filter_sort.least_complete=Vismazāk pabeigtais
milestones.filter_sort.most_complete=Visvairāk pabeigtais
milestones.filter_sort.most_issues=Visvairāk pieteikumu
@@ -2007,7 +2016,7 @@ wiki.filter_page=Meklēt lapu
wiki.new_page=Lapa
wiki.page_title=Lapas virsraksts
wiki.page_content=Lapas saturs
-wiki.default_commit_message=Ierakstiet piezīmes par šīs lapas izmaiņām (neobligāts).
+wiki.default_commit_message=Rakstīt piezīmes par šīs lapas izmaiņām (izvēles).
wiki.save_page=Saglabāt lapu
wiki.last_commit_info=%s laboja lapu %s
wiki.edit_page_button=Labot
@@ -2035,11 +2044,11 @@ activity.period.semiyearly=6 mēneši
activity.period.yearly=1 gads
activity.overview=Pārskats
activity.active_prs_count_1=%d atvērts izmaiņu pieprasījums
-activity.active_prs_count_n=%d aktīvi izmaiņu pieprasījumi
+activity.active_prs_count_n=%d atvērti izmaiņu pieprasījumi
activity.merged_prs_count_1=Iekļauts izmaiņu pieprasījums
activity.merged_prs_count_n=Iekļauti izmaiņu pieprasījumi
activity.opened_prs_count_1=Ierosināts izmaiņu pieprasījums
-activity.opened_prs_count_n=Piedāvāti izmaiņu pieprasījumi
+activity.opened_prs_count_n=Ierosināti izmaiņu pieprasījumi
activity.title.user_1=%d lietotājs
activity.title.user_n=%d lietotāji
activity.title.prs_1=%d izmaiņu pieprasījumu
@@ -2056,11 +2065,11 @@ activity.title.issues_1=%d pieteikumu
activity.title.issues_n=%d pieteikumus
activity.title.issues_closed_from=%s aizvērts no %s
activity.title.issues_created_by=%s izveidoja %s
-activity.closed_issue_label=Slēgta
+activity.closed_issue_label=Aizvēra
activity.new_issues_count_1=Jauns pieteikums
activity.new_issues_count_n=Jauni pieteikumi
-activity.new_issue_label=Atvērta
-activity.title.unresolved_conv_1=%d neatrisināta diskusija
+activity.new_issue_label=Atvēra
+activity.title.unresolved_conv_1=%d neatrisināta saruna
activity.title.unresolved_conv_n=%d neatrisinātu apspriešanu
activity.unresolved_conv_desc=Šie nesen mainītie pieteikumi un izmaiņu pieprasījumi vēl nav atrisināti.
activity.unresolved_conv_label=Atvērts
@@ -2076,9 +2085,9 @@ activity.git_stats_pushed_1=aizgādāja
activity.git_stats_pushed_n=aizgādāja
activity.git_stats_commit_1=%d iesūtījumu
activity.git_stats_commit_n=%d iesūtījumus
-activity.git_stats_push_to_branch=atzarā %s un
+activity.git_stats_push_to_branch=zarā %s un
activity.git_stats_push_to_all_branches=visos zaros.
-activity.git_stats_on_default_branch=Atzarā %s,
+activity.git_stats_on_default_branch=Zarā %s,
activity.git_stats_file_1=%d datne
activity.git_stats_file_n=%d datnes
activity.git_stats_files_changed_1=tika izmainīts
@@ -2126,11 +2135,11 @@ settings.mirror_settings.docs.can_still_use=Lai arī nevar labot esošās spogu
settings.mirror_settings.docs.pull_mirror_instructions=Lai iestatītu atgādāšanas spoguļglabātavu, lūgums pārskatīt:
settings.mirror_settings.docs.more_information_if_disabled=Vairāk par aizgādāšanas un izgūšanas spoguļglabātavām var uzzināt šeit:
settings.mirror_settings.docs.doc_link_title=Kā spoguļot glabātavas?
-settings.mirror_settings.docs.doc_link_pull_section=dokumentācijas nodaļā "Pulling from a remote repository".
+settings.mirror_settings.docs.doc_link_pull_section=dokumentācijas nodaļā "Izgūšana no attālas glabātavas".
settings.mirror_settings.docs.pulling_remote_title=Atgādā no attālas glabātavas
settings.mirror_settings.mirrored_repository=Spoguļotā glabātava
settings.mirror_settings.direction=Virziens
-settings.mirror_settings.direction.pull=Izmaiņu saņemšana
+settings.mirror_settings.direction.pull=Atgādāšana
settings.mirror_settings.direction.push=Aizgādāšana
settings.mirror_settings.last_update=Pēdējās izmaiņas
settings.mirror_settings.push_mirror.none=Nav pievienotu aizgādāšanas spoguļglabātavu
@@ -2139,7 +2148,7 @@ settings.mirror_settings.push_mirror.add=Pievienot aizgādāšanas spoguļglabā
settings.mirror_settings.push_mirror.edit_sync_time=Labot spoguļglabātavas sinhronizēšanas starplaiku
settings.sync_mirror=Sinhronizēt tagad
-settings.pull_mirror_sync_in_progress=Pašlaik tiek saņemtas izmaiņas no attālā %s.
+settings.pull_mirror_sync_in_progress=Pašlaik tiek atgādātas izmaiņas no attālās %s.
settings.push_mirror_sync_in_progress=Pašlaik tiek aizgādātas izmaiņas uz attālo %s.
settings.site=Tīmekļvietne
settings.update_settings=Saglabāt iestatījumus
@@ -2162,7 +2171,7 @@ settings.external_tracker_url_error=Ārējā pieteikumu izsekotāja URL nav der
settings.external_tracker_url_desc=Apmeklētāji tiks novirzīti uz ārējā pieteikumu izsekotāja URL pēc klikšķināšanas uz pieteikumu cilnes.
settings.tracker_url_format=Ārējā pieteikumu izsekotāja URL veidols
settings.tracker_url_format_error=Ārējā pieteikumu izsekotāja URL uzbūve neatbilst derīgam URL.
-settings.tracker_issue_style=Ārējā pieteikumu izsekotājas numuru veidols
+settings.tracker_issue_style=Ārējā pieteikumu izsekotāja numuru veidols
settings.tracker_issue_style.numeric=Cipari
settings.tracker_issue_style.alphanumeric=Burti un cipari
settings.tracker_issue_style.regexp=Regulārā izteiksme
@@ -2174,13 +2183,13 @@ settings.allow_only_contributors_to_track_time=Atļaut uzskaitīt laiku tikai l
settings.pulls_desc=Iespējot glabātavas izmaiņu pieprasījumus
settings.pulls.ignore_whitespace=Nesaderību noteikšanā neņemt vērā atstarpes
settings.pulls.enable_autodetect_manual_merge=Iespējot pašrocīgas apvienošanas noteikšanu (Piezīme: dažos īpašos gadījumos tā var nenostrādāt pareizi)
-settings.pulls.allow_rebase_update=Iespējot izmaiņu pieprasījuma atjaunošanu ar pārbāzēšanu
+settings.pulls.allow_rebase_update=Iespējot izmaiņu pieprasījuma zara atjaunināšanu ar pārbāzēšanu
settings.pulls.default_delete_branch_after_merge=Pēc noklusējuma izdzēst izmaiņu pieprasījuma zaru pēc apvienošanas
settings.pulls.default_allow_edits_from_maintainers=Atļaut uzturētājiem labot pēc noklusējuma
settings.releases_desc=Iespējot glabātavas laidienus
settings.packages_desc=Iespējot glabātavas pakotņu reģistru
settings.projects_desc=Iespējot glabātavas projektus
-settings.actions_desc=Iespējot iekļautos CI/CD cauruļvadus ar Forgejo darbībām
+settings.actions_desc=Iespējot iekļautos CI/CD cauruļvadus ar Forgejo Actions
settings.admin_settings=Pārvaldītāja iestatījumi
settings.admin_enable_health_check=Iespējot glabātavas darbspējas pārbaudes (git fsck)
settings.admin_code_indexer=Koda indeksētājs
@@ -2198,7 +2207,7 @@ settings.convert_notices_1=Šī darbība pārveidos spoguļglabātavu par parast
settings.convert_confirm=Pārveidot glabātavu
settings.convert_succeed=Spoguļglabātava tika pārveidota par parastu glabātavu.
settings.convert_fork=Pārveidot par parastu glabātavu
-settings.convert_fork_desc=Šo atzarojumu var pārveidot par parastu glabātavu. To nevar atdarīt.
+settings.convert_fork_desc=Šo atzarojumu var pārveidot par parastu glabātavu. To nevar atsaukt.
settings.convert_fork_notices_1=Šī darbība pārveidos atzarojumu par parastu glabātavu, un tā nav atsaucama.
settings.convert_fork_confirm=Pārveidot glabātavu
settings.convert_fork_succeed=Atzarojums tika pārveidots par parastu glabātavu.
@@ -2212,7 +2221,7 @@ settings.transfer_desc=Nodot šo glabātavu lietotājam vai apvienībai, kurā T
settings.transfer_form_title=Ievadiet repozitorija nosaukumu, lai apstiprinātu:
settings.transfer_in_progress=Pašlaik jau ir notiekoša nodošana. Lūgums to atcelt, ja ir vēlme nodot šo glabātavu citam lietotājam.
settings.transfer_notices_1=- Tiks zaudēta piekļuve glabātavai, ja tā tiks nodota atsevišķam lietotājam.
-settings.transfer_notices_2=- Tiks saglabāta piekļuve, ja jaunais īpašnieks ir organizācija un esat viens no tās īpašniekiem.
+settings.transfer_notices_2=- Tiks saglabāta piekļuve glabātavai, ja tā tiks nodota apvienībai, kurai esi (līdz)īpašnieks.
settings.transfer_notices_3=- Ja glabātava ir privāta un tā tiek nodota atsevišķam lietotājam, šī darbība pārbauda, vai lietotājam ir vismaz lasīšanas atļauja (un izmaina atļaujas, ja nepieciešams).
settings.transfer_owner=Jaunais īpašnieks
settings.transfer_perform=Veikt nodošanu
@@ -2226,7 +2235,7 @@ settings.trust_model.collaborator=Līdzdalībnieks
settings.trust_model.collaborator.long=Līdzdalībnieks: uzticēties līdzdalībnieku parakstiem
settings.trust_model.collaborator.desc=Derīgi šīs glabātavas līdzdalībnieku paraksti tiks atzīmēti ar "uzticams" (neatkarīgi no tā, vai tie atbilst iesūtītājam vai nē). Pretējā gadījumā derīgi paraksti tiks atzīmēti ar "neuzticams", ja paraksts atbilst iesūtītājam, un ar "neatbilstošs", ja neatbilst.
settings.trust_model.committer=Iesūtītājs
-settings.trust_model.committer.long=Iesūtītājs: uzticēties parakstiem, kas atbilst iesūtītājiem (Šis atbilst GitHub un piespiedīs Forgejo parakstītiem iesūtījumiem norādīt Forgejo kā iesūtītāju)
+settings.trust_model.committer.long=Iesūtītājs: uzticēties parakstiem, kas atbilst iesūtītājiem (Šis atbilst GitHub un uzsspiedīs Forgejo parakstītiem iesūtījumiem norādīt Forgejo kā iesūtītāju)
settings.trust_model.committer.desc=Derīgi paraksti tiks atzīmēti ar "uzticams" tikai tad, ja tie atbildīs iesūtītājam, pretējā gadījumā tie tiks atzīmēti ar "neatbilstošs". Tas nozīmē, ka Forgejo būs iesūtītājs parakstītiem iesūtījumiem, patieso iesūtītāju iesūtījumā atzīmējot ar Co-authored-by: un Co-committed-by: noslēgumu. Noklusējuma Forgejo atslēgai ir jāatbilst lietotājam datu bāzē.
settings.trust_model.collaboratorcommitter=Līdzdalībnieks un iesūtītājs
settings.trust_model.collaboratorcommitter.long=Līdzdalībnieks un iesūtītājs: uzticēties līdzdalībnieku, kas atbilst iesūtītājam, parakstiem
@@ -2256,23 +2265,23 @@ settings.collaborator_deletion_desc=Līdzdalībnieka noņemšana atsauks tā pie
settings.remove_collaborator_success=Līdzdalībnieks tika noņemts.
settings.search_user_placeholder=Meklēt lietotāju…
settings.org_not_allowed_to_be_collaborator=Apvienības nevar tikt pievienotas kā līdzdalībnieki.
-settings.change_team_access_not_allowed=Iespēja mainīt komandu piekļuvi repozitorijam ir organizācijas īpašniekam
-settings.team_not_in_organization=Komanda nav tajā pašā organizācijā kā repozitorijs
+settings.change_team_access_not_allowed=Komandu piekļuves mainīšana glabātavai ir pieejama tikai apvienības īpašniekam
+settings.team_not_in_organization=Komanda nav tajā pašā apvienībā kā glabātava
settings.teams=Komandas
settings.add_team=Pievienot komandu
-settings.add_team_duplicate=Komandai jau ir piekļuve šim repozitorijam
+settings.add_team_duplicate=Komandai jau ir piekļuve glabātavai
settings.add_team_success=Komandai tagad ir piekļuve glabātavai.
settings.search_team=Meklēt komandu…
-settings.change_team_permission_tip=Komandas tiesības tiek uzstādītas komandas iestatījumu lapā un nevar tikt individuāli mainītas katram repozitorijam atsevišķi
-settings.delete_team_tip=Komandai ir piekļuve visiem repozitorijiem un tā nevar tikt noņemta individuāli
-settings.remove_team_success=Komandas piekļuve šim repozitorijam ir noņemta.
+settings.change_team_permission_tip=Komandas atļauja ir iestatīta komandas iestatījumu lapā un nav maināma katrai glabātavai atsevišķi
+settings.delete_team_tip=Komandai ir piekļuve visām glabātavām, un to nevar noņemt
+settings.remove_team_success=Tika noņemta komandas piekļuve glabātavai.
settings.add_webhook=Pievienot tīmekļa aizķeri
settings.add_webhook.invalid_channel_name=Tīmekļa aizķeres plūsmas nosaukums nevar būt tukšs vai saturēt tikai rakstzīmi #.
settings.hooks_desc=Tīmekļa aizķeres automātiski sūta serverim HTTP POST pieprasījumus, kad iedarbojas noteikti Forgejo notikumi. Vairāk ir lasāms tīmekļa aizķeru rokasgrāmatā .
settings.webhook_deletion=Noņemt tīmekļa aizķeri
settings.webhook_deletion_desc=Tīmekļa aizķeres noņemšana izdzēš tās iestatījumus un piegādes vēsturi. Turpināt?
settings.webhook_deletion_success=Tīmekļa aizķere tika noņemta.
-settings.webhook.test_delivery=Izmēģināt piegādi
+settings.webhook.test_delivery=Pārbaudīt piegādi
settings.webhook.test_delivery_desc=Pārbaudīt šo tīmekļa aizķeri ar neīstu notikumu.
settings.webhook.test_delivery_desc_disabled=Lai pārbaudītu šo tīmekļa aizķeri ar neīstu notikumu, tā ir jāiespējo.
settings.webhook.request=Pieprasījums
@@ -2315,8 +2324,8 @@ settings.event_release=Laidiens
settings.event_release_desc=Laists klajā, atjaunināts vai izdzēsts laidiens glabātavā.
settings.event_push=Aizgādāšana
settings.event_push_desc=Git aizgādāšana uz glabātavu.
-settings.event_repository=Repozitorijs
-settings.event_repository_desc=Repozitorijs izveidots vai dzēsts.
+settings.event_repository=Glabātava
+settings.event_repository_desc=Izveidota vai izdzēsta glabātava.
settings.event_header_issue=Pieteikumu notikumi
settings.event_issues=Izmainīšana
settings.event_issues_desc=Pieteikums atvērts, aizvērts, atkārtoti atvērts vai labots.
@@ -2348,11 +2357,11 @@ settings.event_pull_request_review_request_desc=Pieprasīta izmaiņu pieprasīju
settings.event_pull_request_approvals=Izmaiņu pieprasījuma apstiprinājumi
settings.event_pull_request_merge=Izmaiņu pieprasījuma iekļaušana
settings.event_package=Pakotne
-settings.event_package_desc=Repozitorijā izveidota vai dzēsta pakotne.
+settings.event_package_desc=Izveidota vai izdzēsta pakotne glabātavā.
settings.branch_filter=Zaru atlase
settings.branch_filter_desc=Zaru baltais saraksts aizgādāšanas, zaru izveidošanas un izdzēšanas notikumiem, kas ir norādīts kā glob paraugs. Ja tukšs vai *
, tiks nosūtīti visu zaru notikumi. Par pierakstu skatīt%[2]s dokumentācijā. Piemēri: main
, {main,release*}
.
settings.authorization_header=Pilnvarošanas galvene
-settings.authorization_header_desc=Tiks iekļauta kā autorizācijas galvenei pieprasījumiem, ja ir norādīta. Piemēram: %s.
+settings.authorization_header_desc=Tiks iekļauta pieprasījumos kā pilnvarošanas galvene, ja ir norādīta. Piemēram: %s.
settings.active=Aktīvs
settings.active_helper=Informācija par iedarbinātajiem notikumiem tiks nosūtīta uz šo tīmekļa aizķeres URL.
settings.add_hook_success=Tīmekļa aizķere tika pievienota.
@@ -2364,7 +2373,7 @@ settings.hook_type=Aizķeres veids
settings.slack_token=Pilnvara
settings.slack_domain=Domēns
settings.slack_channel=Kanāls
-settings.add_web_hook_desc=Integrēt %s repozitorijā.
+settings.add_web_hook_desc=Iekļaut %s savā glabātavā.
settings.web_hook_name_gitea=Gitea
settings.web_hook_name_forgejo = Forgejo
settings.web_hook_name_gogs=Gogs
@@ -2384,7 +2393,7 @@ settings.packagist_api_token=API pilnvara
settings.packagist_package_url=Packagist pakotnes URL
settings.deploy_keys=Izvietošanas atslēgas
settings.add_deploy_key=Pievienot izvietošanas atslēgu
-settings.deploy_key_desc=Izvietošanas atslēgām ir lasīšanas piekļuve repozitorijam.
+settings.deploy_key_desc=Izvietošanas atslēgām ir lasīšanas piekļuve glabātavai.
settings.is_writable=Iespējot rakstīšanas piekļuvi
settings.is_writable_info=Atļaut šai izvietošanas atslēgai aizgādāt uz glabātavu.
settings.no_deploy_keys=Pagaidām nav nevienas izvietošanas atslēgas.
@@ -2394,26 +2403,26 @@ settings.key_been_used=Izvietošanas atslēga ar šādu saturu jau ir pievienota
settings.key_name_used=Jau pastāv izvietošanas atslēga ar tādu pašu nosaukumu.
settings.add_key_success=Izvietošanas atslēga "%s" tika pievienota.
settings.deploy_key_deletion=Noņemt izvietošanas atslēgu
-settings.deploy_key_deletion_desc=Noņemot izvietošanas atslēgu, tai tiks liegta piekļuve šim repozitorija. Vai turpināt?
+settings.deploy_key_deletion_desc=Izvietošanas atslēgas noņemšana atsauks tās piekļuvi šai glabātavai. Turpināt?
settings.deploy_key_deletion_success=Izvietošanas atslēga tika noņemta.
settings.branches=Zari
-settings.protected_branch=Zaru aizsardzība
-settings.protected_branch.save_rule=Saglabāt noteikumu
-settings.protected_branch.delete_rule=Dzēst noteikumu
+settings.protected_branch=Zaru aizsargāšana
+settings.protected_branch.save_rule=Saglabāt kārtulu
+settings.protected_branch.delete_rule=Izdzēst kārtulu
settings.protected_branch_can_push=Atļaut izmaiņu nosūtīšanu?
settings.protected_branch_can_push_yes=Jūs varat nosūtīt izmaiņas
settings.protected_branch_can_push_no=Jūs nevarat nosūtīt izmaiņas
-settings.branch_protection=Zara "%s " aizsardzības kārtulas
+settings.branch_protection=Zara "%s " aizsargāšanas kārtulas
settings.protect_this_branch=Iespējot atzara aizsardzību
settings.protect_this_branch_desc=Neļauj atzara dzēšanu, kā arī ierobežo izmaiņu iesūtīšanu un sapludināšanu šajā atzarā.
settings.protect_disable_push=Atspējot aizgādāšanu
settings.protect_disable_push_desc=Aizgādāšana šajā zarā netiks ļauta.
settings.protect_enable_push=Iespējot aizgādāšanu
-settings.protect_enable_push_desc=Ikvienam ar rakstīšanas piekļuvi būs ļauts aizgādāt izmaiņas uz šo zaru (bet ne piespiedu aizgādāšana).
+settings.protect_enable_push_desc=Ikvienam ar rakstīšanas piekļuvi būs ļauts aizgādāt izmaiņas uz šo zaru (bet ne uzspiesta aizgādāšana).
settings.protect_enable_merge=Iespējot apvienošanu
settings.protect_enable_merge_desc=Ikvienam ar rakstīšanas tiesībām būs ļauts apvienot izmaiņu pieprasījumus ar šo zaru.
settings.protect_whitelist_committers=Ierobežotas aizgādāšanas izņēmumi
-settings.protect_whitelist_committers_desc=Tikai norādītajiem lietotājiem vai komandām būs ļauts aizgādāt izmaiņas šajā zarā (bet ne piespiedu aizgādāšana).
+settings.protect_whitelist_committers_desc=Tikai norādītajiem lietotājiem vai komandām būs ļauts aizgādāt izmaiņas šajā zarā (bet ne uzspiesta aizgādāšana).
settings.protect_whitelist_deploy_keys=Atļaut izvietošanas atslēgām ar rakstīšanas piekļuvi aizgādāt izmaiņas.
settings.protect_whitelist_users=Lietotāji, kuriem ir ļauts aizgādāt izmaiņas
settings.protect_whitelist_search_users=Meklēt lietotājus…
@@ -2423,16 +2432,16 @@ settings.protect_merge_whitelist_committers=Iespējot apvienošanas atļaušanas
settings.protect_merge_whitelist_committers_desc=Atļaut tikai noteiktiem lietotājiem vai komandām apvienot izmaiņu pieprasījumus ar šo zaru.
settings.protect_merge_whitelist_users=Lietotāji, kuri var veikt apvienošanu
settings.protect_merge_whitelist_teams=Komandas, kuras var veikt apvienošanu
-settings.protect_check_status_contexts=Iespējot statusu pārbaudi
-settings.protect_status_check_patterns=Stāvokļa pārbaudes paraugi
+settings.protect_check_status_contexts=Iespējot stāvokļa pārbaudi
+settings.protect_status_check_patterns=Stāvokļa pārbaužu paraugi
settings.protect_status_check_patterns_desc=Jāievada paraugi, lai norādītu, kurām stāvokļa pārbaudēm sekmīgi jāizpildās, pirms zari var tikt iekļauti zarā, kas atbilst šai kārtulai. Katrā rindā ir norādāms viens paraugs. Paraugi nevar būt tukši.
settings.protect_check_status_contexts_desc=Pirms apvienošanas ir nepieciešama sekmīga stāvokļa pārbaužu izpilde. Kad iespējots, iesūtījumiem vispirms jābūt aizgādātiem citā zarā, tad pēc stāvokļa pārbaužu sekmīgas izpildes iekļautiem vai aizgādātiem tieši zarā, kas atbilst šai kārtulai. Ja nav atbilstošu kontekstu, pēdējam iesūtījumam jābūt sekmīgam neatkarīgi no konteksta.
-settings.protect_check_status_contexts_list=Statusu pārbaudes, kas šim repozitorijam bijušas pēdējās nedēļas laikā
+settings.protect_check_status_contexts_list=Stāvokļa pārbaudes, kas šajā glabātavā atrastas pēdējās nedēļas laikā
settings.protect_status_check_matched=Atbilst
settings.protect_invalid_status_check_pattern=Kļūdains statusa pārbaudes šablons: "%s".
settings.protect_no_valid_status_check_patterns=Nav derīgu stāvokļa pārbaužu paraugu.
settings.protect_required_approvals=Nepieciešamie apstiprinājumi
-settings.protect_required_approvals_desc=Atļaut iekļaut izmaiņu pieprasījumu tikai ar pietiekamu daudzumu apstiprinošu izskatījumu.
+settings.protect_required_approvals_desc=Atļaut iekļaut izmaiņu pieprasījumu tikai ar pietiekamu daudzumu apstiprinošu izskatīšanu.
settings.protect_approvals_whitelist_enabled=Ierobežot apstiprinājumus norādītajiem lietotājiem vai komandām
settings.protect_approvals_whitelist_enabled_desc=Tikai iepriekšnorādītiem lietotāju vai komandu izskatīšanas tiks ieskaitītas nepieciešamo apstiprinājumu skaitā. Bez iepriekšnorādīta apstiprinājumu izskatītāju saraksta izskatīšanas no ikviena, kam ir rakstīšanas piekļuve, tiks ieskaitītas nepieciešamo apstiprinājumu skaitā.
settings.protect_approvals_whitelist_users=Lietotāji, kas var veikt izskatīšanu
@@ -2441,7 +2450,7 @@ settings.dismiss_stale_approvals=Atmest novecojušus apstiprinājumus
settings.dismiss_stale_approvals_desc=Kad zarā tiek aizgādāti jauni iesūtījumi, kas izmaina izmaiņu pieprasījuma saturu, iepriekšējie apstiprinājumi tiks atcelti.
settings.require_signed_commits=Pieprasīt parakstītus iesūtījumus
settings.require_signed_commits_desc=Noraidīt aizgādāšanu uz šo zaru, ja iesūtījumi nav parakstīti vai apliecināmi.
-settings.protect_branch_name_pattern=Aizsargātā zara šablons
+settings.protect_branch_name_pattern=Aizsargātā zara nosaukuma paraugs
settings.protect_branch_name_pattern_desc=Aizsargāto zaru nosaukumu paraugi. Paraugu pierakstu skatīt dokumentācijā . Piemēri: main, release/**
settings.protect_patterns=Šabloni
settings.protect_protected_file_patterns=Aizsargāto datņu paraugs (vairākus atdala ar semikolu ";")
@@ -2450,11 +2459,11 @@ settings.protect_unprotected_file_patterns=Neaizsargāto datņu paraugs (vairāk
settings.protect_unprotected_file_patterns_desc=Neaizsargātās datnes, kuras ir ļauts izmainīt tiešā veidā, apejot aizgādāšanas ierobežojumu, ja lietotājam ir rakstīšanas piekļuve. Vairāki paraugi ir atdalāmi ar semikolu (";"). Paraugu pierakstu skatīt %[2]s dokumentācijā. Piemēri: .drone.yml
, /docs/**/*.txt
.
settings.add_protected_branch=Iespējot aizsargāšanu
settings.delete_protected_branch=Atspējot aizsargāšanu
-settings.update_protect_branch_success=Zara aizsardzības kārtula "%s" tika atjaunināta.
-settings.remove_protected_branch_success=Zara aizsardzības kārtula "%s" tika noņemta.
-settings.remove_protected_branch_failed=Zara aizsardzības kārtulas "%s" noņemšana neizdevās.
-settings.protected_branch_deletion=Izdzēst zara aizsardzību
-settings.protected_branch_deletion_desc=Zara aizsardzības atspējošana ļauj lietotājiem ar rakstīšanas atļauju aizgādāt izmaiņas uz zaru. Turpināt?
+settings.update_protect_branch_success=Zara aizsargāšanas kārtula "%s" tika atjaunināta.
+settings.remove_protected_branch_success=Zara aizsargāšanas kārtula "%s" tika noņemta.
+settings.remove_protected_branch_failed=Zara aizsargāšanas kārtulas "%s" noņemšana neizdevās.
+settings.protected_branch_deletion=Izdzēst zara aizsargāšanu
+settings.protected_branch_deletion_desc=Zara aizsargāšanas atspējošana ļauj lietotājiem ar rakstīšanas atļauju aizgādāt zarā izmaiņas. Turpināt?
settings.block_rejected_reviews=Liegt apvienošanu, ja izskatīšana ir beigusies ar noraidīšanu
settings.block_rejected_reviews_desc=Apvienošana nebūs iespējama, kad oficiālie izskatītāji ir pieprasījuši izmaiņas, pat ja ir pietiekami daudz apstiprinājumu.
settings.block_on_official_review_requests=Liegt apvienošanu, ja ir oficiāli izskatīšanas pieprasījumi
@@ -2467,22 +2476,22 @@ settings.default_merge_style_desc=Noklusējuma apvienošanas veids
settings.choose_branch=Atlasīt zaru…
settings.no_protected_branch=Nav neviena aizsargātā zara.
settings.edit_protected_branch=Labot
-settings.protected_branch_required_rule_name=Nav norādīts noteikuma nosaukums
+settings.protected_branch_required_rule_name=Jānorāda kārtulas nosaukums
settings.protected_branch_duplicate_rule_name=Šai zaru kopai jau pastāv kārtula
settings.protected_branch_required_approvals_min=Pieprasīto izskatīšanu skaits nevar būt mazāks par nulli.
-settings.tags=Tagi
+settings.tags=Birkas
settings.tags.protection=Birku aizsargāšana
settings.tags.protection.pattern=Birku paraugs
settings.tags.protection.allowed=Atļauts
settings.tags.protection.allowed.users=Atļauts lietotājiem
settings.tags.protection.allowed.teams=Atļauts komandām
-settings.tags.protection.allowed.noone=Nevienam
+settings.tags.protection.allowed.noone=Neviens
settings.tags.protection.create=Pievienot kārtulu
settings.tags.protection.none=Nav aizsargātu birku.
settings.tags.protection.pattern.description=Var izmantot vienkāršu nosaukumu vai glob paraugu, vai regulāro izteiksmi, lai atbilstu vairākām birkām. Vairāk ir lasāms norādēs par aizsargātajām birkām .
settings.bot_token=Robotprogrammatūras pilnvara
settings.chat_id=Tērzēšanas ID
-settings.thread_id=Pavediena ID
+settings.thread_id=Pavediena identifikators
settings.matrix.homeserver_url=Mājas servera URL
settings.matrix.room_id=Istabas ID
settings.matrix.message_type=Ziņojuma veids
@@ -2490,16 +2499,16 @@ settings.archive.button=Arhivēt glabātavu
settings.archive.header=Arhivēt šo glabātavu
settings.archive.text=Glabātavas arhivēšana padarīs to tikai lasāmu. Tā nebūs redzama pārskata panelī. Neviens (pat ne Tu) nevarēs izveidot jaunus iesūtījumus vai atvērt pieteikumus vai izmaiņu pieprasījumus.
settings.archive.success=Glabātava tika sekmīgi arhivēts.
-settings.archive.error=Arhivējot repozitoriju radās neparedzēta kļūda. Pārbaudiet kļūdu žurnālu, lai uzzinātu sīkāk.
+settings.archive.error=Atgadījās kļūda, kad tika mēģināts arhivēt glabātavu. Jāapskata žurnāls, lai uzzinātu vairāk.
settings.archive.error_ismirror=Nevar arhivēt spoguļotu glabātavu.
settings.archive.branchsettings_unavailable=Zaru iestatījumi nav pieejami arhivētās glabātavās.
-settings.archive.tagsettings_unavailable=Tagu iestatījumi nav pieejami, ja repozitorijs ir arhivēts.
-settings.unarchive.button=Atcelt repozitorija arhivēšanu
-settings.unarchive.header=Atcelt šī repozitorija arhivēšanu
+settings.archive.tagsettings_unavailable=Birku iestatījumi arhivētās glabātavās nav pieejami.
+settings.unarchive.button=Atcelt glabātavas arhivēšanu
+settings.unarchive.header=Atcelt šīs glabātavas arhivēšanu
settings.unarchive.text=Glabātavas arhivēšanas atcelšana atjaunos tās spēju saņemt izmaiņas, kā arī jaunus pieteikumus un izmaiņu pieprasījumus.
settings.unarchive.success=Glabātavas arhivēšana tika sekmīgi atcelta.
-settings.unarchive.error=Repozitorija arhivēšanas atcelšanas laikā atgadījās kļūda. Vairāk ir redzams žurnālā.
-settings.update_avatar_success=Repozitorija attēls tika atjaunināts.
+settings.unarchive.error=Glabātavas arhivēšanas atcelšanas laikā atgadījās kļūda. Vairāk ir redzams žurnālā.
+settings.update_avatar_success=Glabātavas attēls tika atjaunināts.
settings.lfs=LFS
settings.lfs_filelist=Šajā glabātavā uzglabātās LFS datnes
settings.lfs_no_lfs_files=Šajā glabātavā nav uzglabātu LFS datņu
@@ -2507,17 +2516,17 @@ settings.lfs_findcommits=Atrast iesūtījumus
settings.lfs_lfs_file_no_commits=Šai LFS datnei netika atrasts neviens iesūtījums
settings.lfs_noattribute=Šim ceļam noklusējuma zarā nav slēdzamības atribūta
settings.lfs_delete=Izdzēst LFS datni ar OID %s
-settings.lfs_delete_warning=LFS datnes izdzēšana var izraisīt kļūdu "object does not exist" veicot paņemšanu. Tiešām izdzēst?
+settings.lfs_delete_warning=LFS datnes izdzēšana var izraisīt kļūdu "object does not exist" paņemšanas laikā. Tiešām izdzēst?
settings.lfs_findpointerfiles=Atrast norāžu datnes
-settings.lfs_locks=Bloķēšanas
+settings.lfs_locks=Slēdzenes
settings.lfs_invalid_locking_path=Nederīgs ceļš: %s
settings.lfs_invalid_lock_directory=Nevar slēgt mapi: %s
settings.lfs_lock_already_exists=Slēdzene jau pastāv: %s
-settings.lfs_lock=Bloķēt
+settings.lfs_lock=Slēgt
settings.lfs_lock_path=Slēdzamās datnes ceļš...
settings.lfs_locks_no_locks=Nav slēdzeņu
settings.lfs_lock_file_no_exist=Aizslēgtā datne nepastāv noklusējuma zarā
-settings.lfs_force_unlock=Piespiedu atslēgšana
+settings.lfs_force_unlock=Uzspiest atslēgšanu
settings.lfs_pointers.found=Atrasta(s) %d binārā objekta norāde(s) - %d saistītas, %d nesaistītas (%d trūkstošas glabātuvē)
settings.lfs_pointers.sha=Binārā objekta jaucējkods
settings.lfs_pointers.oid=OID
@@ -2538,7 +2547,7 @@ diff.commit=iesūtījums
diff.git-notes=Piezīmes
diff.data_not_available=Satura salīdzināšana nav pieejama
diff.options_button=Salīdzināšanas iespējas
-diff.show_diff_stats=Rādīt statistiku
+diff.show_diff_stats=Rādīt apkopojumu
diff.download_patch=Lejupielādēt ielāpa datni
diff.download_diff=Lejupielādēt atšķirību datni
diff.show_split_view=Sadalītais skats
@@ -2577,9 +2586,9 @@ diff.review.header=Iesniegt izskatīšanu
diff.review.placeholder=Izskatīšanas piezīmes
diff.review.comment=Pievienot piebildi
diff.review.approve=Apstiprināt
-diff.review.self_reject=Izmaiņu pieprasījuma autors nevar pieprasīt izmaiņas savam izmaiņu pieprasījumam
+diff.review.self_reject=Izmaiņu pieprasījuma iesniedzēji nevar pieprasīt izmaiņas savam izmaiņu pieprasījumam
diff.review.reject=Pieprasīt izmaiņas
-diff.review.self_approve=Izmaiņu pieprasījuma autors nevar apstiprināt savu izmaiņu pieprasījumu
+diff.review.self_approve=Izmaiņu pieprasījuma iesniedzēji nevar apstiprināt savu izmaiņu pieprasījumu
diff.committed_by=iesūtīja
diff.protected=Aizsargāts
diff.image.side_by_side=Blakus
@@ -2589,13 +2598,13 @@ diff.has_escaped=Šajā rindā ir slēptas unikoda rakstzīmes
diff.show_file_tree=Parādīt datņu koku
diff.hide_file_tree=Paslēpt datņu koku
-releases.desc=Pārvaldiet projekta versijas un lejupielādes.
+releases.desc=Projekta versiju un lejupielāžu pārraudzīšana.
release.releases=Laidieni
release.detail=Informācija par laidienu
-release.tags=Tagi
+release.tags=Birkas
release.new_release=Jauns laidiens
release.draft=Melnraksts
-release.prerelease=Pirmslaidiens
+release.prerelease=Pirmsizlaide
release.stable=Stabila
release.compare=Salīdzināt
release.edit=Labot
@@ -2603,8 +2612,8 @@ release.ahead.commits=%d iesūtījumi
release.ahead.target=no %s kopš laidiena publicēšanas
tag.ahead.target=%s kopš šīs birkas
release.source_code=Pirmkods
-release.new_subheader=Laidieni palīdz organizēt projekta versijas.
-release.edit_subheader=Laidieni palīdz organizēt projekta versijas.
+release.new_subheader=Laidieni apkopo projekta versijas.
+release.edit_subheader=Laidieni apkopo projekta versijas.
release.tag_name=Taga nosaukums
release.target=Mērķis
release.tag_helper=Jāizvēlas esoša birka vai jāizveido jauna.
@@ -2612,8 +2621,8 @@ release.tag_helper_new=Jauna birka. Šī birka tiks izveidota no mērķa.
release.tag_helper_existing=Esoša birka.
release.title=Laidiena nosaukums
release.title_empty=Nosaukums nevar būt tukšs.
-release.message=Aprakstiet šo laidienu
-release.prerelease_desc=Atzīmēt kā pirmslaidienu
+release.message=Aprakstīt šo laidienu
+release.prerelease_desc=Atzīmēt kā pirmsizlaidi
release.prerelease_helper=Atzīmēt, ka šo laidienu nav ieteicams lietot produkcijā.
release.cancel=Atcelt
release.publish=Laist klajā laidienu
@@ -2634,7 +2643,7 @@ release.downloads=Lejupielādes
release.download_count=Lejupielādes: %s
release.add_tag_msg=Izmantot laidiena nosaukumu un saturu kā birkas ziņojumu.
release.add_tag=Izveidot birku
-release.releases_for=Repozitorja %s laidieni
+release.releases_for=Glabātavas %s laidieni
release.tags_for=%s birkas
branch.name=Zara nosaukums
@@ -2683,7 +2692,7 @@ tag.create_success=Tags "%s" tika izveidots.
topic.manage_topics=Pārvaldīt tēmas
topic.done=Gatavs
topic.count_prompt=Nevar pievienot vairāk kā 25 tēmas
-topic.format_prompt=Tēmai jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un punktus ('.') un var būt līdz 35 rakstzīmēm gara. Burtiem jābūt mazajiem.
+topic.format_prompt=Tēmai jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ("-") un punktus (".") un var būt līdz 35 rakstzīmēm gara. Jāizmanto mazie burti.
find_file.go_to_file=Atrast datni
find_file.no_matching=Netika atrasta neviena atbilstoša datne
@@ -2756,7 +2765,7 @@ release.download_count_few = %s lejupielādes
settings.rename_branch_failed_protected = Nevar pārdēvēt zaru %s, jo tas ir aizsargāts zars.
release.type_external_asset = Ārējs līdzeklis
release.hide_archive_links = Paslēpt automātiski izveidotos arhīvus
-settings.archive.mirrors_unavailable = Spoguļglabātavas nav pieejamas, ja glabātava ir arhivēta.
+settings.archive.mirrors_unavailable = Spoguļglabātavas nav pieejamas arhivētās glabātavās.
release.type_attachment = Pielikums
settings.enforce_on_admins_desc = Glabātavas pārvaldītāji šo kārtulu nevar apiet.
settings.matrix.access_token_helper = Šim nolūkam ir ieteicams izveidot atsevišķu Matrix kontu. Piekļuves pilnvaru var iegūt Element tīmekļa klientā (privātā/inkognito cilnē) > Lietotāja izvēlne (augšējais kreisais stūris) > Visi iestatījumi > Palīdzība un par > Papildu > Piekļuves pilnvara (tieši zem mājasservera URL). Jāaizver privātā/inkognito cilne (atteikšanās padarītu pilnvaru nederīgu).
@@ -2782,6 +2791,79 @@ issues.review.add_remove_review_requests = pieprasīja izskatīšanas no %[1] un
issues.author.tooltip.pr = Šis lietotājs ir šī izmaiņu pieprasījuma izveidotājs.
pulls.edit.already_changed = Neizdevās saglabāt izmaiņu pieprasījuma izmaiņas. Izskatās, ka saturu jau ir mainījis kāds cits lietotājs. Lūgums atsvaidzināt lapu un mēģināt labot vēlreiz, lai izvairītos no izmaiņu pārrakstīšanas
pulls.blocked_by_user = Tu nevari izveidot izmaiņu pieprasījumu šajā glabātavā, jo tās īpašnieks ir Tevi liedzis.
+issues.all_title = Visi
+pulls.commit_ref_at = ` atsaucāš uz šo izmaiņu pieprasījumu iesūtījumā %[2]s `
+issues.num_participants_one = %d dalībnieks
+pulls.title_desc_one = vēlas iekļaut %[1]d iesūtījumu no %[2]s
%[3]s
+issues.archived_label_description = (Arhivēts) %s
+issues.blocked_by_user = Šajā glabātavā nevari izveidot pieteikumus, jo tās īpašnieks ir liedzis Tevi.
+issues.summary_card_alt = Pieteikuma "%s" kopsavilkuma karte glabātavā %s
+pulls.nothing_to_compare_have_tag = Atlasītie zari/birkas ir vienādi.
+pulls.merged_title_desc_one = iekļāva %[1]d iesūtījumu no %[2]s
%[3]s
%[4]s
+pulls.reopen_failed.head_branch = Izmaiņu pieprasījumu nevar atkārtoti atvērt, jo galotnes zars vairs nepastāv.
+pulls.reopen_failed.base_branch = Izmaiņu pieprasījumu nevar atkārtoti atvērt, jo pamata zars vairs nepastāv.
+pulls.cmd_instruction_merge_warning = Brīdinājums : "Automātiski noteikt pašrocīgu apvienošanu" šajā glabātavā nav iespējots, pēcāk būs nepieciešams atzīmēt šo izmaiņu pieprasījumu kā pašrocīgi apvienotu.
+issues.author.tooltip.issue = Šis lietotājs ir šī pieteikuma izveidotājs.
+issues.review.add_review_requests = pieprasīja izskatīšanu no %[1]s %[2]s
+issues.comment.blocked_by_user = Tu šim pieteikumam nevari pievienot piebildi, jo glabātavas īpašnieks vai pieteikuma izveidotājs ir liedzis Tevi.
+issues.num_reviews_one = %d izskatīšana
+issues.num_reviews_few = %d izskatīšanas
+settings.wiki_branch_rename_failure = Neizdevās normalizēt glabātavas vikivietnes zara nosaukumu.
+settings.discord_icon_url.exceeds_max_length = Ikonas URL nedrīkst būt garāka par 2048 rakstzīmēm
+settings.sourcehut_builds.visibility = Darba redzamība
+pulls.delete_after_merge.head_branch.is_default = Izdzēšamais galotnes zars ir noklusējuma zars, un to nevar izdzēst.
+pulls.delete_after_merge.head_branch.is_protected = Izdzēšamais galotnes zars ir aizsargāts zars, un to nevar izdzēst.
+pulls.delete_after_merge.head_branch.insufficient_branch = Nav atļaujas izdzēst galotnes zaru.
+contributors.contribution_type.deletions = Izdzēšanas
+activity.published_tag_label = Birka
+settings.sourcehut_builds.manifest_path = Būvējuma manifesta ceļš
+settings.federation_settings = Federācijas iestatījumi
+activity.navbar.pulse = Pulss
+settings.federation_not_enabled = Šajā serverī federācija nav iespējota.
+settings.event_pull_request_enforcement = Piemērošana
+settings.sourcehut_builds.secrets = Noslēpumi
+pulls.ready_for_review = Gatavs izskatīšanai?
+pulls.made_using_agit = AGit
+milestones.filter_sort.name = Nosaukums
+wiki.cancel = Atcelt
+activity.navbar.code_frequency = Koda biežums
+activity.navbar.recent_commits = Neseni iesūtījumi
+activity.published_prerelease_label = Pirmsizlaide
+activity.commit = Iesūtījumu darbības
+contributors.contribution_type.additions = Pievienošanas
+settings.graphql_url = GraphQL URL
+wiki.no_search_results = Nekas netika atrasts
+wiki.search = Meklēt vikivietnē
+comments.edit.already_changed = Neizdevās saglabāt piebildes izmaiņas. Izskatās, ka saturu jau ir mainījis kāds cits lietotājs. Lūgums atsvaidzināt lapu un mēģināt labot vēlreiz, lai izvairītos no izmaiņu pārrakstīšanas
+settings.default_update_style_desc = Noklusējuma atjaunināšanas veids izmaiņu pieprasījumu, kuri atpaliek no pamata zara, atjaunināšanai.
+settings.mirror_settings.push_mirror.none_ssh = Neviena
+settings.wiki_branch_rename_success = Glabātavas vikivietnes zara nosaukums tika sekmīgi normalizēts.
+settings.web_hook_name_sourcehut_builds = SourceHut būvējumi
+pulls.fast_forward_only_merge_pull_request = Tikai pārlēkšana
+settings.federation_apapiurl = Šīs glabātavas federācijas URL. Tas ir jāievieto starpliktuvē un jāielīmē citas glabātavas federācijas iestatījumos kā sekojošas glabātavas URL.
+settings.federation_following_repos = Sekojošu glabātavu URL. Atdalīti ar ";", bez atstarpes.
+settings.add_webhook.invalid_path = Ceļš nedrīkst saturēt daļu, kas ir "." vai "..", vai tukša virkne. Tas nevar sākties vai beigties ar slīpsvītru.
+settings.protect_new_rule = Izveidot jaunu zaru aizsargāšanas kārtulu
+settings.sourcehut_builds.secrets_helper = Dot darbam piekļuvi būvēšanas noslēpumiem (nepieciešams nodrošināt SECRETS:RO)
+release.asset_external_url = Ārējais URL
+release.add_external_asset = Pievienot ārēju līdzekli
+release.invalid_external_url = Nederīgs ārējais URL: "%s"
+settings.sourcehut_builds.access_token_helper = Piekļuves pilnvara, kurai ir nodrošināta JOBS:RW. meta.sr.ht jāizveido builds.sr.ht pilnvara vai builds.sr.ht pilnvara ar piekļuvi noslēpumiem .
+release.asset_name = Līdzekļa nosaukums
+pulls.sign_in_require = Pieteikties , lai izveidotu jaunu izmaiņu pieprasījumu.
+new_from_template = Izmantot sagatavi
+new_from_template_description = Var atlasīt šajā serverī esošu glabātavas sagatavi un pielietot tās iestatījumus.
+new_advanced = Papildu iestatījumi
+new_advanced_expand = Klikšķināt, lai izvērstu
+auto_init_description = Sākt ar README Git vēsturē, pēc izvēles pievienojot licences un .gitignore datnes.
+issues.reaction.add = Pievienot reakciju
+issues.reaction.alt_few = %[1]s atsaucās ar %[2]s.
+issues.reaction.alt_many = %[1]s un vēl %[2]d atsaucās ar %[3]s.
+issues.reaction.alt_remove = Noņemt no piebildes %[1] reakciju.
+issues.reaction.alt_add = Pievienot piebildei %[1] reakcijas.
+issues.context.menu = Piebildes izvēlne
+summary_card_alt = Glabātavas %s apkopojuma kartīte
+release.summary_card_alt = Laidiena "%s" apkopojuma kartīte glabātavā %s
[graphs]
component_loading=Ielādē %s...
@@ -2793,35 +2875,35 @@ recent_commits.what = neseni iesūtījumi
contributors.what = sniegumi
[org]
-org_name_holder=Organizācijas nosaukums
-org_full_name_holder=Organizācijas pilnais nosaukums
-org_name_helper=Organizāciju nosaukumiem vēlams būt īsiem un tādiem, ko viegli atcerēties.
-create_org=Izveidot organizāciju
-repo_updated=Atjaunināts %s
+org_name_holder=Apvienības nosaukums
+org_full_name_holder=Apvienības pilnais nosaukums
+org_name_helper=Apvienību nosaukumiem vajadzētu būt īsiem un viegli iegaumējamiem.
+create_org=Izveidot apvienību
+repo_updated=Atjaunināta %s
members=Dalībnieki
teams=Komandas
code=Kods
lower_members=dalībnieki
-lower_repositories=repozitoriji
+lower_repositories=glabātavas
create_new_team=Jauna komanda
create_team=Izveidot komandu
org_desc=Apraksts
team_name=Komandas nosaukums
team_desc=Apraksts
team_name_helper=Komandu nosaukumiem vēlams būt īsiem un tādiem, ko viegli atcerēties.
-team_desc_helper=Aprakstiet komandas mērķi vai lomu.
-team_access_desc=Piekļuve repozitorijiem
+team_desc_helper=Komandas nolūka vai lomas apraksts.
+team_access_desc=Glabātavu piekļuve
team_permission_desc=Atļauja
-team_unit_desc=Atļaut piekļuvi repozitorija sadaļām
+team_unit_desc=Atļaut piekļuvi glabātavas sadaļām
team_unit_disabled=(Atspējots)
-form.name_reserved=Organizācijas nosaukums "%s" ir rezervēts.
-form.name_pattern_not_allowed=Organizācijas nosaukums "%s" nav atļauts.
+form.name_reserved=Apvienības nosaukums "%s" ir aizņemts.
+form.name_pattern_not_allowed="%s" nav ļauts izmantot apvienības nosaukumā.
form.create_org_not_allowed=Nav ļauts izveidot apvienību.
settings=Iestatījumi
-settings.options=Organizācija
-settings.full_name=Pilns vārds, uzvārds
+settings.options=Apvienība
+settings.full_name=Pilns vārds
settings.email=E-pasta adrese saziņai
settings.website=Mājas lapa
settings.location=Atrašanās vieta
@@ -2829,49 +2911,49 @@ settings.permission=Tiesības
settings.repoadminchangeteam=Glabātavas pārvaldītājs var pievienot un noņemt komandu piekļuvi
settings.visibility=Redzamība
settings.visibility.public=Publiska
-settings.visibility.limited=Ierobežots (redzams tikai autentificētiem lietotājiem)
+settings.visibility.limited=Ierobežota (redzama tikai lietotājiem, kuri ir pieteikušies)
settings.visibility.limited_shortname=Ierobežota
-settings.visibility.private=Privāta (redzama tikai organizācijas dalībniekiem)
+settings.visibility.private=Privāta (redzama tikai apvienības dalībniekiem)
settings.visibility.private_shortname=Privāta
settings.update_settings=Atjaunināt iestatījumus
-settings.update_setting_success=Organizācijas iestatījumi tika saglabāti.
+settings.update_setting_success=Apvienības iestatījumi tika atjaunināti.
settings.change_orgname_prompt=Piezīme: apvienības nosaukuma maiņa izmainīs arī apvienības URL un atbrīvos veco nosaukumu.
settings.change_orgname_redirect_prompt=Vecais nosaukums pārvirzīs, līdz tas būs izmantots.
-settings.update_avatar_success=Organizācijas attēls tika saglabāts.
-settings.delete=Dzēst organizāciju
-settings.delete_account=Dzēst šo organizāciju
-settings.delete_prompt=Šī darbība pilnībā dzēsīs šo organizāciju, kā arī tā ir NEATGRIEZENISKA !
+settings.update_avatar_success=Apvienības attēls tika atjaunināts.
+settings.delete=Izdzēst apvienību
+settings.delete_account=Izdzēst šo apvienību
+settings.delete_prompt=Apvienība tiks neatgriezeniski noņemta. To NEVAR atsaukt.
settings.confirm_delete_account=Apstiprināt izdzēšanu
-settings.delete_org_title=Dzēst organizāciju
-settings.delete_org_desc=Organizācija tiks dzēsta neatgriezeniski. Vai turpināt?
+settings.delete_org_title=Izdzēst apvienību
+settings.delete_org_desc=Šī apvienība tiks neatgriezeniski izdzēsta. Turpināt?
settings.hooks_desc=Pievienot tīmekļa aizķeres, kas iedarbosies šīs apvienības visās glabātavās .
settings.labels_desc=Pievienot iezīmes, kas var tikt izmantotas pieteikumos šīs apvienības visās glabātavās .
-members.membership_visibility=Dalībnieka redzamība:
+members.membership_visibility=Dalībnieku redzamība:
members.public=Redzams
-members.public_helper=padarīt slēptu
+members.public_helper=Padarīt slēptu
members.private=Slēpts
-members.private_helper=padarīt redzemu
+members.private_helper=Padarīt redzemu
members.member_role=Dalībnieka loma:
members.owner=Īpašnieks
members.member=Dalībnieks
members.remove=Noņemt
-members.remove.detail=Noņemt lietotāju %[1]s no organizācijas %[2]s?
+members.remove.detail=Noņemt %[1]s no %[2]s?
members.leave=Atstāt
-members.leave.detail=Pamest organizāciju %s?
+members.leave.detail=Vai tiešām pamest apvienību "%s"?
members.invite_desc=Pievienot jaunu dalībnieku pie %s:
members.invite_now=Uzaicināt tagad
teams.join=Pievienoties
teams.leave=Atstāt
-teams.leave.detail=Pamest organizāciju %s?
-teams.can_create_org_repo=Veidot jaunus repozitorijus
+teams.leave.detail=Vai tiešām pamest komandu "%s"?
+teams.can_create_org_repo=Izveidot glabātavas
teams.can_create_org_repo_helper=Dalībnieki apvienībā var izveidot jaunas glabātavas. Izveidotājs iegūs jaunās glabātavas pārvaldītāja piekļuvi.
teams.none_access=Nav piekļuves
teams.none_access_helper="Nav piekļuve" iespēja iedarbojas tikai privātās glabātavās.
-teams.general_access=Vispārēja piekļuve
+teams.general_access=Pielāgota piekļuve
teams.general_access_helper=Komandas tiesības tiks noteiktas pēc tabulas zemāk.
teams.read_access=Skatīšanās
teams.read_access_helper=Komanda varēs skatīties un klonēt šīs organizācijas repozitorijus.
@@ -2882,39 +2964,39 @@ teams.admin_access_helper=Dalībnieki var atgādāt un aizgādāt izmaiņas uz k
teams.no_desc=Komandai nav apraksta
teams.settings=Iestatījumi
teams.owners_permission_desc=Īpašniekiem ir pilna piekļuve visām glabātavām un ir apvienības pārvaldītāja tiesības .
-teams.members=Komandas biedri
+teams.members=Komandas dalībnieki
teams.update_settings=Atjaunināt iestatījumus
-teams.delete_team=Dzēst komandu
-teams.add_team_member=Pievienot komandas biedru
+teams.delete_team=Izdzēst komandu
+teams.add_team_member=Pievienot komandas dalībnieku
teams.invite_team_member=`Uzaicināt komandā "%s"`
-teams.invite_team_member.list=Neapstiprinātie uzaicinājumi
-teams.delete_team_title=Dzēst komandu
-teams.delete_team_desc=Dzēšot komandu, tās biedri var zaudēt piekļuvi dažiem vai pat visiem repozitorijiem. Vai turpināt?
+teams.invite_team_member.list=Neapstiprināti uzaicinājumi
+teams.delete_team_title=Izdzēst komandu
+teams.delete_team_desc=Komandas izdzēšana tās dalībniekiem atsauc piekļuvi glabātavām. Turpināt?
teams.delete_team_success=Komanda tika izdzēsta.
teams.read_permission_desc=Šī komanda nodrošina lasīšanas piekļuvi: dalībnieki var apskatīt un klonēt komandas glabātavas.
teams.write_permission_desc=Šī komanda nodrošina rakstīšanas piekļuvi: dalībnieki var lasīt un aizgādāt izmaiņas uz komandas glabātavām.
teams.admin_permission_desc=Šī komanda nodrošina pārvaldītāja piekļuvi: dalībnieki var lasīt no, aizgādāt izmaiņas uz un pievienot līdzdalībniekus komandas glabātavām.
teams.create_repo_permission_desc=Papildus šī komanda nodrošina atļauju Izveidot glabātavu : dalībnieki apvienībā var izveidot jaunas glabātavas.
-teams.repositories=Komandas repozitoriji
+teams.repositories=Komandas glabātavas
teams.search_repo_placeholder=Meklēt repozitorijā…
-teams.remove_all_repos_title=Noņemt visus komandas repozitorijus
-teams.remove_all_repos_desc=Šī darbība noņems visus repozitorijus no komandas.
-teams.add_all_repos_title=Pievienot visus repozitorijus
-teams.add_all_repos_desc=Šī darbība pievienos visus organizācijas repozitorijus šai komandai.
+teams.remove_all_repos_title=Noņemt visas komandas glabātavas
+teams.remove_all_repos_desc=Šī darbība noņems visas komandas glabātavas.
+teams.add_all_repos_title=Pievienot visas glabātavas
+teams.add_all_repos_desc=Komandai tiks pievienotas visas apvienības glabātavas.
teams.add_nonexistent_repo=Pievienojamā glabātava nepastāv, lūgums vispirms to izveidot.
teams.add_duplicate_users=Lietotājs jau ir šajā komandā.
-teams.repos.none=Šai komandai nav piekļuves nevienam repozitorijam.
+teams.repos.none=Šī komanda nevarēja piekļūt nevienai glabātavai.
teams.members.none=Šajā komandā nav dalībnieku.
-teams.specific_repositories=Atsevišķi repozitoriji
-teams.specific_repositories_helper=Komandas biedriem būs piekļuve tikai pie norādītājiem repozitorijiem. Atzīmējot šo netiks automātiksi noņemti repozitoriji, kas tika pievienoti ar pazīmi Visi repozitoriji .
-teams.all_repositories=Visi repozitoriji
-teams.all_repositories_helper=Šai komandai ir piekļuve visiem repozitorijiem. Atzīmējot šo visi organizācijas repozitoriji tiks pievienoti šai komandai.
+teams.specific_repositories=Noteiktas glabātavas
+teams.specific_repositories_helper=Dalībniekiem būs piekļuve tikai komandai pievienotajām glabātavām. Pēc šī atlasīšanas netiks automātiski noņemtas glabātavas, kas jau tika pievienotas ar Visas glabātavas .
+teams.all_repositories=Visas glabātavas
+teams.all_repositories_helper=Komandai ir piekļuve visām glabātavām. Šī atlasīšana komandai pievienos visas esošās glabātavas.
teams.all_repositories_read_permission_desc=Šī komanda piešķirt skatīšanās tiesības visiem repozitorijiem : komandas biedri var skatīties un klonēt visus organizācijas repozitorijus.
teams.all_repositories_write_permission_desc=Šī komanda piešķirt labošanas tiesības visiem repozitorijiem : komandas biedri var skatīties un nosūtīt izmaiņas visiem organizācijas repozitorijiem.
teams.all_repositories_admin_permission_desc=Šī komanda piešķirt administratora tiesības visiem repozitorijiem : komandas biedri var skatīties, nosūtīt izmaiņas un mainīt iestatījumus visiem organizācijas repozitorijiem.
-teams.invite.title=Tu esi uzaicināts pievienoties organizācijas %[2]s komandai %[1]s .
+teams.invite.title=Tevi uzaicināja pievienoties komandai %s apvienībā %s .
teams.invite.by=Uzaicināja %s
-teams.invite.description=Nospiediet pogu zemāk, lai pievienotos komandai.
+teams.invite.description=Lūgums nospiest zemāk esošo pogu, lai pievienotos komandai.
open_dashboard = Atvērt pārskata paneli
follow_blocked_user = Tu nevari sekot šai apvienībai, jo tā ir liegusi Tevi.
@@ -2923,13 +3005,13 @@ dashboard=Pārskata panelis
self_check=Pašpārbaude
identity_access=Identitāte un piekļuve
users=Lietotāju konti
-organizations=Organizācijas
-assets=Koda aktīvi
-repositories=Repozitoriji
+organizations=Apvienības
+assets=Koda līdzekļi
+repositories=Glabātavas
hooks=Tīmekļa aizķeres
integrations=Integrācijas
authentication=Autentificēšanas avoti
-emails=Lietotāja e-pasts
+emails=Lietotāju e-pasta adreses
config=Konfigurācija
notices=Sistēmas paziņojumi
monitor=Uzraudzība
@@ -2941,7 +3023,7 @@ settings=Pārvaldīšanas iestatījumi
dashboard.new_version_hint=Ir pieejama Forgejo %s, pašlaik darbojas %s. Vairāk informācijas ir atrodama emuārā .
dashboard.statistic=Kopsavilkums
dashboard.operations=Uzturēšanas darbības
-dashboard.system_status=Sistēmas statuss
+dashboard.system_status=Sistēmas stāvoklis
dashboard.operation_name=Darbības nosaukums
dashboard.operation_switch=Pārslēgt
dashboard.operation_run=Palaist
@@ -2956,38 +3038,38 @@ dashboard.task.unknown=Nezināms uzdevums: %[1]s
dashboard.cron.started=Uzsākts Cron: %[1]s
dashboard.cron.process=Cron: %[1]s
dashboard.cron.cancelled=Cron: %[1]s atcelts: %[3]s
-dashboard.cron.error=Kļūda Cron: %s: %[3]s
+dashboard.cron.error=Cron kļūda: %s: %[3]s
dashboard.cron.finished=Cron: %[1]s pabeigts
dashboard.delete_inactive_accounts=Izdzēst visus neaktivētos kontus
dashboard.delete_inactive_accounts.started=Ir uzsākts visu neaktivēto kontu izdzēšanas uzdevums.
-dashboard.delete_repo_archives=Dzēst visu repozitoriju arhīvus (ZIP, TAR.GZ utt.)
-dashboard.delete_repo_archives.started=Uzdevums visu repozitoriju arhīvu dzēšanai uzsākts.
+dashboard.delete_repo_archives=Izdzēst visus glabātavu arhīvus (ZIP, TAR.GZ utt.)
+dashboard.delete_repo_archives.started=Visu glabātavas arhīvu izdzēšanas uzdevums ir uzsākts.
dashboard.delete_missing_repos=Izdzēst visas glabātavas, kurām trūkst Git datņu
dashboard.delete_missing_repos.started=Uzsākts uzdevums visu glabātavu, kurām trūkst Git datņu, izdzēšanai.
dashboard.delete_generated_repository_avatars=Izdzēst izveidotos glabātavu attēlus
dashboard.sync_repo_branches=Sinhronizēšana datubāzēs izlaida zarus no Git datiem
dashboard.update_mirrors=Atjaunināt spoguļglabātavas
-dashboard.repo_health_check=Pārbaudīt visu repozitoriju veselību
-dashboard.check_repo_stats=Pārbaudīt visu repozitoriju statistiku
-dashboard.archive_cleanup=Dzēst repozitoriju vecos arhīvus
+dashboard.repo_health_check=Pārbaudīt visu glabātavu darbspēju
+dashboard.check_repo_stats=Pārbaudīt visu glabātavas apkopojumu
+dashboard.archive_cleanup=Izdzēst vecos glabātavu arhīvus
dashboard.deleted_branches_cleanup=Notīrīt izdzēstos zarus
-dashboard.update_migration_poster_id=Atjaunināt pārcelšanas autora identifikatorus
-dashboard.git_gc_repos=Veikt atkritumu uzkopšanas darbus visiem repozitorijiem
-dashboard.resync_all_sshkeys=Atjaunināt datni '.ssh/authorized_keys' ar Forgejo SSH atslēgām.
+dashboard.update_migration_poster_id=Atjaunināt pārcelšanas ierosinātāja identifikatorus
+dashboard.git_gc_repos=Veikt drazu savākšanu visās glabātavās
+dashboard.resync_all_sshkeys=Atjaunināt datni ".ssh/authorized_keys" ar Forgejo SSH atslēgām.
dashboard.resync_all_sshprincipals=Atjaunināt datni ".ssh/authorized_principals" ar Forgejo SSH identitātēm.
-dashboard.resync_all_hooks=Atkārtoti sinhroznēt pirmssaņemšanas, atjaunināšanas un pēcsaņemšans aizķeres visās glabātavās
+dashboard.resync_all_hooks=Atkārtoti sinhronizēt pirmssaņemšanas, atjaunināšanas un pēcsaņemšans aizķeres visās glabātavās
dashboard.reinit_missing_repos=Atkārtoti sāknēt visas trūkstošās Git glabātavas, par kurām ir ieraksti
dashboard.sync_external_users=Sinhronizēt ārējo lietotāju datus
dashboard.cleanup_hook_task_table=Iztīrīt tabulu hook_task
dashboard.cleanup_packages=Notīrīt novecojušās pakotnes
dashboard.cleanup_actions=Notīrīt darbību izbeigušos žurnālus un artefaktus
dashboard.server_uptime=Servera darbības laiks
-dashboard.current_goroutine=Izmantotās Gorutīnas
+dashboard.current_goroutine=Pašreizējās gorutīnas
dashboard.current_memory_usage=Pašreizējais atmiņas lietojums
dashboard.total_memory_allocated=Kopējā iedalītā atmiņa
dashboard.memory_obtained=Iegūtā atmiņa
-dashboard.pointer_lookup_times=Rādītāju pārlūkošanas reizes
-dashboard.memory_allocate_times=Atmiņas piešķīrumi
+dashboard.pointer_lookup_times=Rādītāju uzmeklēšanas reizes
+dashboard.memory_allocate_times=Atmiņas iedalīšanas
dashboard.memory_free_times=Atmiņas atbrīvošanas
dashboard.current_heap_usage=Pašreizējais grēdas lietojums
dashboard.heap_memory_obtained=Iegūtā grēdas atmiņa
@@ -2995,77 +3077,77 @@ dashboard.heap_memory_idle=Neizmantotā grēdas atmiņa
dashboard.heap_memory_in_use=Izmantotā grēdas atmiņa
dashboard.heap_memory_released=Atbrīvotā grēdas atmiņa
dashboard.heap_objects=Grēdas objekti
-dashboard.bootstrap_stack_usage=Izmantotais sāknēšanas steka lielums
-dashboard.stack_memory_obtained=Iegūtā steka atmiņa
-dashboard.mspan_structures_usage=Izmantotās MSpan struktūras
+dashboard.bootstrap_stack_usage=Sākumielādētāja viengala rindas lietojums
+dashboard.stack_memory_obtained=Iegūtā viengala rindas atmiņa
+dashboard.mspan_structures_usage=MSpan struktūru lietojums
dashboard.mspan_structures_obtained=Iegūtās MSpan struktūras
-dashboard.mcache_structures_usage=Izmantotās MCache struktūras
+dashboard.mcache_structures_usage=MCache struktūru lietojums
dashboard.mcache_structures_obtained=Iegūtās MCache struktūras
-dashboard.profiling_bucket_hash_table_obtained=Iegūtā profilēšanas kausa jaucējtabula
+dashboard.profiling_bucket_hash_table_obtained=Iegūtā profilēšanas groza jaucējtabula
dashboard.gc_metadata_obtained=Iegūtie GC metadati
-dashboard.other_system_allocation_obtained=Iegūtās citas sistēmas sadales
-dashboard.next_gc_recycle=Nākošā GC atkritne
+dashboard.other_system_allocation_obtained=Citas iegūtās sistēmas sadales
+dashboard.next_gc_recycle=Nākamā GC atkritne
dashboard.last_gc_time=Laiks kopš pēdējās GC
dashboard.total_gc_time=Kopējais GC izpildes laiks
-dashboard.total_gc_pause=Kopējais GC izpildes laiks
-dashboard.last_gc_pause=Pedējās GC izpildes laiks
+dashboard.total_gc_pause=Kopējais GC pārtraukums
+dashboard.last_gc_pause=Pedējais GC pārtraukums
dashboard.gc_times=GC reizes
-dashboard.delete_old_actions=Dzēst visas darbības no datu bāzes
-dashboard.delete_old_actions.started=Uzsākta visu novecojušo darbību dzēšana no datu bāzes.
+dashboard.delete_old_actions=Izdzēst visas novecojušās darbības no datubāzes
+dashboard.delete_old_actions.started=Uzsākta visu novecojušo darbību izdzēšana no datubāzes.
dashboard.update_checker=Atjauninājumu pārbaudītājs
dashboard.delete_old_system_notices=Dzēst vecos sistēmas paziņojumus no datubāzes
dashboard.gc_lfs=Veikt atkritumu uzkopšanas darbus LFS meta objektiem
-dashboard.stop_zombie_tasks=Apturēt zombija uzdevumus
-dashboard.stop_endless_tasks=Apturēt nepārtrauktus uzdevumus
-dashboard.cancel_abandoned_jobs=Atcelt pamestus darbus
-dashboard.start_schedule_tasks=Sākt plānotos uzdevumus
+dashboard.stop_zombie_tasks=Apturēt darbību zombijuzdevumus
+dashboard.stop_endless_tasks=Apturēt bezgalīgus darbību uzdevumus
+dashboard.cancel_abandoned_jobs=Atcelt pamestus darbību darbus
+dashboard.start_schedule_tasks=Uzsākt paredzētos darbību uzdevumus
dashboard.sync_branch.started=Uzsākta zaru sinhronizēšana
dashboard.rebuild_issue_indexer=Pārbūvēt pieteikumu indeksētāju
-users.user_manage_panel=Lietotāju kontu pārvaldība
+users.user_manage_panel=Pārvaldīt lietotāju kontus
users.new_account=Izveidot lietotāja kontu
users.name=Lietotājvārds
-users.full_name=Vārds, uzvārds
+users.full_name=Pilns vārds
users.activated=Aktivēts
users.admin=Pārvaldītājs
users.restricted=Ierobežots
users.reserved=Aizņemts
-users.bot=Bots
+users.bot=Robotprogrammatūra
users.remote=Attāls
users.2fa=2FA
-users.repos=Repozitoriji
+users.repos=Glabātavas
users.created=Izveidots
users.last_login=Pēdējā pieteikšanās
-users.never_login=Pieteikšanās nekad nav veikta
-users.send_register_notify=Nosūtīt lietotājam reģistrācijas paziņojumu
+users.never_login=Pieteikšanās nekad nav notikusi
+users.send_register_notify=Paziņot par reģistrāciju e-pastā
users.new_success=Lietotāja konts "%s" tika izveidots.
users.edit=Labot
-users.auth_source=Autentificēšanas avots
+users.auth_source=Autentificēšanās avots
users.local=Iebūvētā
-users.auth_login_name=Autentifikācijas pieteikšanās vārds
+users.auth_login_name=Autentificēšanās pieteikšanās vārds
users.password_helper=Atstāt paroli tukšu, lai paturētu to neizmainītu.
users.update_profile_success=Lietotāja konts tika atjaunināts.
users.edit_account=Labot lietotāja kontu
-users.max_repo_creation=Maksimālais repozitoriju skaits
+users.max_repo_creation=Lielākais pieļaujamais glabātavu skaits
users.max_repo_creation_desc=(Jāievada -1, lai izmantotu vispārējo noklusējuma ierobežojumu)
users.is_activated=Aktivēts konts
-users.prohibit_login=Atspējota pieteikšanās
+users.prohibit_login=Apturēta pieteikšanās
users.is_admin=Pārvaldītāja konts
-users.is_restricted=Ir ierobežots
+users.is_restricted=Ierobežots konts
users.allow_git_hook=Var izveidot Git aizķeres
users.allow_git_hook_tooltip=Git aizķeres tiek izpildītas ar OS lietotāju, ar kuru tiek palaists Forgejo, un tām ir tāda paša līmeņa piekļuve sistēmai. Iznākumā lietotāji ar šo īpašo Git aizķeru tiesību var piekļūt un mainīt visas Forgejo glabātavas, kā arī Forgejo izmantoto datu bāzi. Tātad tie var arī iegūt Forgejo pārvaldītāja tiesības.
-users.allow_import_local=Atļauts importēt lokālus repozitorijus
-users.allow_create_organization=Atļauts veidot organizācijas
-users.update_profile=Mainīt lietotāja kontu
-users.delete_account=Dzēst lietotāja kontu
+users.allow_import_local=Var ievietot vietējas glabātavas
+users.allow_create_organization=Var izveidot apvienības
+users.update_profile=Atjaunināt lietotāja kontu
+users.delete_account=Izdzēst lietotāja kontu
users.cannot_delete_self=Nevar izdzēst sevi
-users.still_own_repo=Lietotājam pieder repozitoriji, tos sākumā ir nepieciešams izdzēst vai mainīt to īpašnieku.
-users.still_has_org=Šis lietotājs ir vienas vai vairāku organizāciju biedrs, lietotāju sākumā ir nepieciešams pamest šīs organizācijas vai viņu no tām ir jāizdzēš.
-users.purge=Attīrīt lietotu
-users.purge_help=Veikt lietotāja un visu tam piederošo glabātavu, apvienību un pakotņu piespiedu izdzēšanu. Tiks izdzēstas visas piebildes un lietotāja izveidotie pieteikumi.
+users.still_own_repo=Šim lietotājam joprojām pieder viena vai vairākas glabātavas. Tās vispirms jāizdzēš vai jānodod.
+users.still_has_org=Šis lietotājs ir apvienības dalībnieks. Vispirms lietotājs ir jānoņem no visām apvienībām.
+users.purge=Atbrīvoties no lietotāja
+users.purge_help=Veikt lietotāja un visu tam piederošo glabātavu, apvienību un pakotņu uzspiestu izdzēšanu. Tiks izdzēstas visas piebildes un lietotāja izveidotie pieteikumi.
users.still_own_packages=Šim lietotājam pieder viena vai vairākas pakotnes, tās nepieciešams izdzēst.
users.deletion_success=Lietotāja konts tika izdzēsts.
-users.reset_2fa=Noņemt 2FA
+users.reset_2fa=Atiestatīt 2FA
users.list_status_filter.menu_text=Filtrs
users.list_status_filter.reset=Atiestatīt
users.list_status_filter.is_active=Aktīvs
@@ -3074,33 +3156,33 @@ users.list_status_filter.is_admin=Pārvaldītājs
users.list_status_filter.not_admin=Nav pārvaldītājs
users.list_status_filter.is_restricted=Ierobežots
users.list_status_filter.not_restricted=Nav ierobežots
-users.list_status_filter.is_prohibit_login=Nav atļauta autorizēšanās
-users.list_status_filter.not_prohibit_login=Atļaut autorizāciju
-users.list_status_filter.is_2fa_enabled=2FA iespējots
-users.list_status_filter.not_2fa_enabled=2FA nav iespējots
+users.list_status_filter.is_prohibit_login=Neļaut pieteikšanos
+users.list_status_filter.not_prohibit_login=Atļaut pieteikšanos
+users.list_status_filter.is_2fa_enabled=2FA iespējota
+users.list_status_filter.not_2fa_enabled=2FA atspējota
users.details=Lietotāja informācija
-emails.email_manage_panel=Lietotāju e-pastu pārvaldība
-emails.primary=Primārais
+emails.email_manage_panel=Pārvaldīt lietotāju e-pasta adreses
+emails.primary=Galvenā
emails.activated=Aktivēta
emails.filter_sort.email=E-pasts
emails.filter_sort.email_reverse=E-pasta adrese (pretēji alfabētiski)
emails.filter_sort.name=Lietotājvārds
-emails.filter_sort.name_reverse=Lietotāja vārds (pretēji alfabētiski)
+emails.filter_sort.name_reverse=Lietotāja vārds (apvērsti)
emails.updated=E-pasta adrese atjaunināta
-emails.not_updated=Neizdevās atjaunot pieprasīto e-pasta adresi: %v
+emails.not_updated=Neizdevās atjaunināt pieprasīto e-pasta adresi: %v
emails.duplicate_active=E-pasta adrese jau ir aktīva citam lietotājam.
-emails.change_email_header=Atjaunot e-pasta rekvizītus
-emails.change_email_text=Vai patiešām vēlaties atjaunot šo e-pasta adresi?
+emails.change_email_header=Atjaunināt e-pasta īpašības
+emails.change_email_text=Vai tiešām atjaunināt šo e-pasta adresi?
-orgs.org_manage_panel=Organizāciju pārvaldība
+orgs.org_manage_panel=Pārvaldīt apvienības
orgs.name=Nosaukums
orgs.teams=Komandas
orgs.members=Dalībnieki
-orgs.new_orga=Jauna organizācija
+orgs.new_orga=Jauna apvienība
-repos.repo_manage_panel=Repozitoriju pārvaldība
-repos.unadopted=Nepārņemtie repozitoriji
+repos.repo_manage_panel=Pārvaldīt glabātavas
+repos.unadopted=Nepieemtās glabātavas
repos.unadopted.no_more=Nav atrasta neviena nepieņemta glabātava.
repos.owner=Īpašnieks
repos.name=Nosaukums
@@ -3110,11 +3192,11 @@ repos.stars=Zvaigznes
repos.forks=Atdalītie
repos.issues=Pieteikumi
repos.size=Izmērs
-repos.lfs_size=LFS izmērs
+repos.lfs_size=LFS lielums
-packages.package_manage_panel=Pakotņu pārvaldība
-packages.total_size=Kopējais izmērs: %s
-packages.unreferenced_size=Izmērs bez atsauces: %s
+packages.package_manage_panel=Pārvaldīt pakotnes
+packages.total_size=Kopējais lielums: %s
+packages.unreferenced_size=Lielums bez atsauces: %s
packages.cleanup=Notīrīt novecojušos datus
packages.cleanup.success=Izbeigušies dati sekmīgi notīrīti
packages.owner=Īpašnieks
@@ -3122,7 +3204,7 @@ packages.creator=Izveidotājs
packages.name=Nosaukums
packages.version=Versija
packages.type=Veids
-packages.repository=Repozitorijs
+packages.repository=Glabātava
packages.size=Izmērs
packages.published=Publicēts
@@ -3136,25 +3218,25 @@ systemhooks.desc=Tīmekļa aizķeres automātiski nosūta HTTP POST pieprasījum
systemhooks.add_webhook=Pievienot sistēmas tīmekļa aizķeri
systemhooks.update_webhook=Atjaunināt sistēmas tīmekļa aizķeri
-auths.auth_manage_panel=Autentifikācijas avotu pārvaldība
-auths.new=Pievienot autentifikācijas avotu
+auths.auth_manage_panel=Pārvaldīt autentificēšanās avotus
+auths.new=Pievienot autentificēšanas avotu
auths.name=Nosaukums
auths.type=Veids
auths.enabled=Iespējots
auths.syncenabled=Iespējot lietotāju sinhronizāciju
auths.updated=Atjaunināta
-auths.auth_type=Autentifikācijas tips
-auths.auth_name=Autentifikācijas nosaukums
+auths.auth_type=Autentificēšanas veids
+auths.auth_name=Autentificēšanas nosaukums
auths.security_protocol=Drošības protokols
auths.domain=Domēns
auths.host=Resursdators
auths.port=Ports
auths.bind_dn=Saistīšanas DN
auths.bind_password=Saistīšanas parole
-auths.user_base=Lietotāja pamatnosacījumi
+auths.user_base=Lietotāju meklēšanas pamatnosacījumi
auths.user_dn=Lietotāja DN
auths.attribute_username=Lietotājvārda atribūts
-auths.attribute_username_placeholder=Atstāt tukšu, lai izmantotu Gitea ievadīto lietotājvārdu.
+auths.attribute_username_placeholder=Atstāt tukšu, lai izmantotu Forgejo ievadīto lietotājvārdu.
auths.attribute_name=Vārda atribūts
auths.attribute_surname=Uzvārda atribūts
auths.attribute_mail=E-pasta atribūts
@@ -3162,59 +3244,59 @@ auths.attribute_ssh_public_key=Publiskās SSH atslēgas atribūts
auths.attribute_avatar=Profila attēla atribūts
auths.attributes_in_bind=Nolasīt atribūtus no saistīšanas DN konteksta
auths.allow_deactivate_all=Ļaut tukšam meklēšanas iznākumam deaktivēt visus lietotājus
-auths.use_paged_search=Izmantot, dalīto pa lapām, meklēšanu
-auths.search_page_size=Lapas izmērs
-auths.filter=Lietotāju filts
+auths.use_paged_search=Izmantot meklēšanu ar lapotāju
+auths.search_page_size=Lapas lielums
+auths.filter=Lietotāju atlase
auths.admin_filter=Pārvaldītāju atlase
-auths.restricted_filter=Ierobežoto lietotāju filtrs
+auths.restricted_filter=Ierobežoto lietotāju atlase
auths.restricted_filter_helper=Atstāt tukšu, lai nenorādītu nevienu lietotāju kā ierobežotu. Zvaigznīte ('*') ir izmantojama, lai norādītu visus lietotājus, kas neatbilst pārvaldītāju atlasei, kā ierobežotus.
auths.verify_group_membership=Pārbaudīt piederību LDAP kopai (atstāt atlasi tukšu, lai izlaistu)
-auths.group_search_base=Grupas pamatnosacījumi
+auths.group_search_base=Grupas meklēšanas pamata DN
auths.group_attribute_list_users=Grupas atribūts, kas satur sarakstu ar lietotājiem
-auths.user_attribute_in_group=Grupas atribūts, kas nosaka lietotāju
+auths.user_attribute_in_group=Lietotāja atribūts, kas ir uzskaitīts grupā
auths.map_group_to_team=Sasaistīt LDAP kopas ar apvienības komandām (atstāt lauku tukšu, lai izlaistu)
auths.map_group_to_team_removal=Noņemt lietotājus no sinhronizētajām komandām, ja lietotājs nav piesaistīts attiecīgajai LDAP grupai
auths.enable_ldap_groups=Iespējot LDAP grupas
auths.ms_ad_sa=MS AD meklēšanas atribūti
-auths.smtp_auth=SMTP autentifikācijas tips
+auths.smtp_auth=SMTP autentificēšanas veids
auths.smtphost=SMTP resursdators
auths.smtpport=SMTP ports
auths.allowed_domains=Atļautie domēni
auths.allowed_domains_helper=Atstāt tukšu, lai atļautu visus domēnus. Vairāki domēni ir atdalāmi ar komatu (",").
auths.skip_tls_verify=Izlaist TLS pārbaudi
-auths.force_smtps=Piespiedu SMTPS izmantošana
-auths.force_smtps_helper=SMTPS vienmēr tiks izmantots, ja ports ir 465. Uzstādiet šo, ja nepieciešams izmantot SMTPS ar citiem portiem. (Neatzīmējot tiks izmantots STARTTLS, ja serveris to atbalsta.)
-auths.helo_hostname=HELO resursa nosaukums
+auths.force_smtps=Uzspiest SMTPS izmantošana
+auths.force_smtps_helper=Portam 465 vienmēr tiek izmantots SMTPS. Iestatīt šo, lai piespiestu izmantot SMTPS citiem portiem. (Pretējā gadījumā portiem tiks izmantots STARTTLS, ja saimniekdators to nodrošina.)
+auths.helo_hostname=HELO resursdatora nosaukums
auths.helo_hostname_helper=Saimniekdatora nosaukums, ko sūtīt ar HELO. Atstāt tukšu, lai izmantotu pašreizējo saimniekdatora nosaukumu.
auths.disable_helo=Atspējot HELO
-auths.pam_service_name=PAM servisa nosaukums
-auths.pam_email_domain=PAM e-pasta domēns (neobligāts)
-auths.oauth2_provider=OAuth2 pakalpojuma sniedzējs
+auths.pam_service_name=PAM pakalpojuma nosaukums
+auths.pam_email_domain=PAM e-pasta domēna vārds (izvēles)
+auths.oauth2_provider=OAuth2 nodrošinātājs
auths.oauth2_icon_url=Ikonas URL
auths.oauth2_clientID=Klienta ID (atslēga)
auths.oauth2_clientSecret=Klienta noslēpums
auths.openIdConnectAutoDiscoveryURL=OpenID Connect automātiskās atklāšanas URL
auths.oauth2_use_custom_url=Izmantot pielāgotus URL noklusējuma URL vietā
auths.oauth2_tokenURL=Pilnvaras URL
-auths.oauth2_authURL=Autorizācijas URL
+auths.oauth2_authURL=Pilnvarot URL
auths.oauth2_profileURL=Profila URL
auths.oauth2_emailURL=E-pasta adreses URL
-auths.skip_local_two_fa=Izlaist vietējo divu faktoru autorizāciju
-auths.skip_local_two_fa_helper=Atstājot neatzīmētu, nozīmē, ka lokālajiem lietotājiem, kam ir uzstādīta divu faktoru autorizācija, būs nepieciešams iziet tās pārbaudi, lai autorizētos
+auths.skip_local_two_fa=Izlaist vietējo divupakāpju pieteikšanos
+auths.skip_local_two_fa_helper=Atstāt neiestatītu nozīmē, ka vietējiem lietotājiem, kuriem ir iestatīta divpakāpju pieteikšanās, tā būs jāizmanto, lai pieteiktos
auths.oauth2_tenant=Nomnieks
auths.oauth2_scopes=Papildu tvērumi
auths.oauth2_required_claim_name=Nepieciešamās prasības nosaukums
-auths.oauth2_required_claim_name_helper=Uzstādiet šo nosaukumu, lai ierobežotu, kas var autorizēties, izmantojot, šo avotu, ar norādīto prasības nosaukumu un vertību
+auths.oauth2_required_claim_name_helper=Šis nosaukums ir iestatāms, lai ierobežotu pieteikšanos no šī avota lietotājiem, kuriem ir prasība ar šādu nosaukumu
auths.oauth2_required_claim_value=Nepieciešamās prasības vērtība
-auths.oauth2_required_claim_value_helper=Uzstādiet šo vērtību, lai ierobežotu, kas var autorizēties, izmantojot, šo avotu, ar norādīto prasības nosaukumu un vertību
-auths.oauth2_group_claim_name=Prasības nosaukums, kas nodrošina grupu nosaukumus šim avotam. (Neobligāts)
+auths.oauth2_required_claim_value_helper=Šī vērtība ir iestatāma, lai ierobežotu pieteikšanos no šī avota lietotājiem, kuriem ir prasība ar šādu nosaukumu un vērtību
+auths.oauth2_group_claim_name=Prasības nosaukums, kas šim avotam nodrošina grupu nosaukumus. (Pēc izvēles)
auths.oauth2_admin_group=Kopas prasības vērtība pārvaldītājiem. (Izvēles - nepieciešams augstāk esošais prasības nosaukums)
-auths.oauth2_restricted_group=Grupas prasības vērtība ierobežotajiem lietotājiem. (Neobligāta - nepieciešams prasības nosaukums augstāk)
-auths.oauth2_map_group_to_team=Sasaistīt prasības grupas ar organizācijas komandām. (Neobligāts - nepieciešams prasības nosaukums augstāk)
+auths.oauth2_restricted_group=Grupas prasības vērtība ierobežotajiem lietotājiem. (Izvēles - nepieciešams augstāk esošais prasības nosaukums)
+auths.oauth2_map_group_to_team=Sasaistīt pieprasītās kopas ar apvienības komandām. (Izvēles - nepieciešams augstāk esošais prasības nosaukums)
auths.oauth2_map_group_to_team_removal=Noņemt lietotājus no sinhronizētajām komandām, ja lietotājs nav piesaistīts attiecīgajai grupai.
auths.enable_auto_register=Iespējot automātisko reģistrāciju
auths.sspi_auto_create_users=Automātiski izveidot lietotājus
-auths.sspi_auto_create_users_helper=Ļauj SSPI autentifikācijas metodei automātiski izveidot jaunus kontus lietotājiem, kas autorizējas pirmo reizi
+auths.sspi_auto_create_users_helper=Ļauj SSPI autentificēšanās veidam automātiski izveidot jaunus kontus lietotājiem, kas piesakās pirmo reizi
auths.sspi_auto_activate_users=Automātiski aktivēt lietotājus
auths.sspi_auto_activate_users_helper=Ļauj SSPI autentificēšanas viedam automātiski aktivēt jaunus lietotājus
auths.sspi_strip_domain_names=Noņemt domēna vārdus no lietotāju vārdiem
@@ -3224,29 +3306,29 @@ auths.sspi_separator_replacement_helper=Rakstzīme, ko izmantot, lai aizstātu a
auths.sspi_default_language=Lietotāju noklusējuma valoda
auths.sspi_default_language_helper=Noklusējuma valoda lietotājiem, kurus automātiski izveido SSPI autentificēšanās veids. Atstāt tukšu, ja ir vēlams, lai valoda tiktu noteikta automātiski.
auths.tips=Padomi
-auths.tips.oauth2.general=OAuth2 autentifikācija
-auths.tips.oauth2.general.tip=Kad tiek reģistrēta jauna OAuth2 autentifikācija, atzvanīšanas/pārvirzīšanas URL vajadzētu būt:
-auths.tip.oauth2_provider=OAuth2 pakalpojuma sniedzējs
+auths.tips.oauth2.general=OAuth2 autentificēšanās
+auths.tips.oauth2.general.tip=Kad tiek reģistrēta jauna OAuth2 autentificēšana, atzvanīšanas/pārvirzīšanas URL vajadzētu būt:
+auths.tip.oauth2_provider=OAuth2 nodrošinātājs
auths.tip.bitbucket=Jāizveido jauns OAuth patērētājs %s un jāpievieno atļauja "Account" - "Read"
auths.tip.nextcloud=Reģistrēt jaunu OAuth patērētāju savā serverī var izvēlnē "Iestatījumi -> Drošība -> OAuth 2.0 klients"
auths.tip.dropbox=Jāizveido jauna lietotne %s
auths.tip.facebook=Jāizveido jauna lietotne %s un jāpievieno produkts "Facebook Login"
auths.tip.github=Jāizveido jauna OAuth lietotne %s
auths.tip.gitlab=Reģistrējiet jaunu aplikāciju adresē https://gitlab.com/profile/applications
-auths.tip.google_plus=Iegūstiet OAuth2 klienta pilnvaru no Google API konsoles adresē %s
+auths.tip.google_plus=OAuth2 klienta piekļuves dati ir iegūstami Google API konsolē %s
auths.tip.openid_connect=Jāizmanto OpenID savienošanās atklāšanas URL (/.well-known/openid-configuration), lai norādītu galapunktus
auths.tip.twitter=Jādodas uz %s, jāizveido lietotne un jānodrošina, ka iespēja "Allow this application to be used to Sign in with Twitter" ir iespējota
auths.tip.discord=Jāizveido jauna lietotne %s
-auths.tip.gitea=Pievienot jaunu OAuth2 lietojumprogrammu. Dokumentācija ir pieejama %s
+auths.tip.gitea=Pievienot jaunu OAuth2 lietotni. Norādes ir atrodamas %s
auths.tip.yandex=%s jāizveido jauna lietotne. Sadaļā "Yandex.Passport API" jāatlasa šīs atļaujas: "Access to email address", "Access to user avatar" un "Access to username, first name and surname, gender"
auths.tip.mastodon=Jāievada pielāgota Mastodon servera URL, ar kuru vēlies autentificēties (vai jāizmanto noklusējuma)
-auths.edit=Labot autentifikācijas avotu
-auths.activated=Autentifikācijas avots ir atkivizēts
+auths.edit=Labot autentificēšanas avotu
+auths.activated=Autentificēšanas avots ir atkivēts
auths.new_success=Jauna autentifikācija "%s" tika pievienota.
auths.update_success=Autentificēšanās avots tika atjaunināts.
-auths.update=Atjaunot autentifikācijas avotu
-auths.delete=Dzēst autentifikācijas avotu
-auths.delete_auth_title=Dzēst autentifikācijas avotu
+auths.update=Atjaunināt autentificēšanās avotu
+auths.delete=Izdzēst autentificēšanas avotu
+auths.delete_auth_title=Izdzēst autentificēšanas avotu
auths.delete_auth_desc=Izdzēšot autentifikācijas avotu, tā lietotājiem nebūs iespējams pieteikties. Vai turpināt?
auths.still_in_used=Šo autentificēšanās avotu joprojām izmanto viens vai vairāki lietotāji, tos nepieciešams izdzēst vai pārvietot uz citu autentificēšanās avotu.
auths.deletion_success=Autentificēšanās avots tika izdzēsts.
@@ -3256,42 +3338,42 @@ auths.unable_to_initialize_openid=Nevarēja inicializēt OpenID Connect sliedzē
auths.invalid_openIdConnectAutoDiscoveryURL=Nederīgs automātiskās atklāšanas URL (tam jābūt derīgam URL, kas sākas ar http:// vai https://)
config.server_config=Servera konfigurācija
-config.app_name=Vietnes nosaukums
+config.app_name=Servera nosaukums
config.app_ver=Forgejo versija
-config.app_url=Forgejo pamata URL
+config.app_url=Pamata URL
config.custom_conf=Konfigurācijas datnes ceļš
config.custom_file_root_path=Pielāgoto datņu pamata ceļš
-config.domain=Servera domēns
+config.domain=Servera domēna vārds
config.offline_mode=Bezsaistes režīms
-config.disable_router_log=Atspējot maršrutētāja žurnalizēšanu
-config.run_user=Izpildes lietotājs
-config.run_mode=Izpildes režīms
+config.disable_router_log=Atspējot maršrutētāja žurnālu
+config.run_user=Lietotājs, ar kuru palaist
+config.run_mode=Palaišanas veids
config.git_version=Git versija
config.app_data_path=Lietotnes datu ceļš
-config.repo_root_path=Repozitoriju glabāšanas vieta
-config.lfs_root_path=LFS saknes ceļš
-config.log_file_root_path=Žurnalizēšanas ceļš
+config.repo_root_path=Glabātavu atrašanās vieta
+config.lfs_root_path=LFS pamatmapes ceļš
+config.log_file_root_path=Žurnālu atrašanās vieta
config.script_type=Skripta veids
-config.reverse_auth_user=Reversā lietotāja autentifikācija
+config.reverse_auth_user=Apvērstā starpniekservera autentificēšanās lietotājs
config.ssh_config=SSH konfigurācija
config.ssh_enabled=Iespējots
config.ssh_start_builtin_server=Izmantot iebūvēto serveri
-config.ssh_domain=SSH servera domēns
+config.ssh_domain=SSH servera domēna vārds
config.ssh_port=Ports
config.ssh_listen_port=Klausīšanās ports
-config.ssh_root_path=Saknes ceļš
+config.ssh_root_path=Atrašanās vieta
config.ssh_key_test_path=Atslēgu pārbaudes ceļš
-config.ssh_keygen_path=Keygen ('ssh-keygen') ceļš
-config.ssh_minimum_key_size_check=Minimālā atslēgas lieluma pārbaude
-config.ssh_minimum_key_sizes=Minimālais atslēgas lielums
+config.ssh_keygen_path=Keygen ("ssh-keygen") atrašanās vieta
+config.ssh_minimum_key_size_check=Mazākā pieļaujamā atslēgas lieluma pārbaude
+config.ssh_minimum_key_sizes=Mazākie pieļaujamie atslēgu lielumi
config.lfs_config=LFS konfigurācija
config.lfs_enabled=Iespējots
-config.lfs_content_path=LFS satura ceļš
-config.lfs_http_auth_expiry=LFS HTTP autorizācijas beigšanās
+config.lfs_content_path=LFS satura atrašanās vieta
+config.lfs_http_auth_expiry=LFS HTTP pilnvarošanas derīguma laiks
-config.db_config=Datu bāzes konfigurācija
+config.db_config=Datubāzes konfigurācija
config.db_type=Veids
config.db_host=Resursdators
config.db_name=Nosaukums
@@ -3301,24 +3383,24 @@ config.db_ssl_mode=SSL
config.db_path=Ceļš
config.service_config=Pakalpojuma konfigurācija
-config.register_email_confirm=Reģistrējoties pieprasīt apstiprināt e-pasta adresi
-config.disable_register=Atspējot lietotāju reģistrāciju
-config.allow_only_internal_registration=Atļaut reģistrāciju tikai no Forgejo
-config.allow_only_external_registration=Atļaut reģistrēties tikai ar ārējiem servisiem
-config.enable_openid_signup=Iespējot reģistrāciju, izmantojot OpenID
+config.register_email_confirm=Pieprasīt e-pasta adreses apstiprināšanu, lai reģistrētos
+config.disable_register=Atspējot pašreģistrēšanos
+config.allow_only_internal_registration=Atļaut reģistrēšanos tikai Forgejo
+config.allow_only_external_registration=Atļaut reģistrēšanos tikai caur ārējiem pakalpojumiem
+config.enable_openid_signup=Iespējot pašreģistrēšanos ar OpenID
config.enable_openid_signin=Iespējot pieteikšanos ar OpenID
config.show_registration_button=Rādīt reģistrēšanās pogu
config.require_sign_in_view=Pieprasīt pieteikšanos, lai aplūkotu lapas
config.mail_notify=Iespējot e-pasta paziņojumus
config.enable_captcha=Iespējot drošības kodu
-config.active_code_lives=Aktīvā koda ilgums
-config.reset_password_code_lives=Konta atjaunošanas koda beigšanās laiks
+config.active_code_lives=Aktivēšanas koda derīguma laiks
+config.reset_password_code_lives=Atkopšanas koda derīguma laiks
config.default_keep_email_private=Pēc noklusējuma slēpt e-pasta adreses
-config.default_allow_create_organization=Pēc noklusējuma ļaut veidot organizācijas
+config.default_allow_create_organization=Pēc noklusējuma ļaut apvienību izveidošanu
config.enable_timetracking=Iespējot laika uzskaiti
config.default_enable_timetracking=Pēc noklusējuma iespējot laika uzskaiti
config.default_allow_only_contributors_to_track_time=Atļaut uzskaitīt laiku tikai līdzdalībniekiem
-config.no_reply_address=Neatbildēt e-pasta adreses domēns
+config.no_reply_address=Slēpjamo e-pasta adrešu domēna vārds
config.default_visibility_organization=Noklusējuma redzamība jaunām apvienībām
config.default_enable_dependencies=Pēc noklusējuma iespējot pieteikumu atkarības
@@ -3332,42 +3414,42 @@ config.mailer_enabled=Iespējota
config.mailer_enable_helo=Iespējot HELO
config.mailer_name=Nosaukums
config.mailer_protocol=Protokols
-config.mailer_smtp_addr=SMTP adrese
+config.mailer_smtp_addr=SMTP saimniekdators
config.mailer_smtp_port=SMTP ports
config.mailer_user=Lietotājs
config.mailer_use_sendmail=Izmantot Sendmail
-config.mailer_sendmail_path=Ceļš līdz sendmail programmai
+config.mailer_sendmail_path=Sendmail ceļš
config.mailer_sendmail_args=Papildu Sendmail argumenti
config.mailer_sendmail_timeout=Sendmail noildze
config.mailer_use_dummy=Tukšs
config.test_email_placeholder=E-pasts (piemēram, test@example.com)
-config.send_test_mail=Nosūtīt pārbaudes e-pastu
+config.send_test_mail=Nosūtīt pārbaudes e-pasta ziņojumu
config.send_test_mail_submit=Sūtīt
-config.test_mail_failed=Neizdevās nosūtīt pārbaudes e-pastu uz "%s": %v
-config.test_mail_sent=Pārbaudes e-pasts tika nosūtīts uz "%s".
+config.test_mail_failed=Neizdevās nosūtīt pārbaudes e-pasta ziņojumu uz "%s": %v
+config.test_mail_sent=Pārbaudes e-pasta ziņojums tika nosūtīts uz "%s".
config.oauth_config=OAuth konfigurācija
config.oauth_enabled=Iespējots
config.cache_config=Kešatmiņas konfigurācija
config.cache_adapter=Kešatmiņas adapteris
-config.cache_interval=Kešatmiņas intervāls
-config.cache_conn=Kešatmiņas pieslēguma parametri
+config.cache_interval=Kešatmiņas starplaiks
+config.cache_conn=Kešatmiņas savienojums
config.cache_item_ttl=Kešatmiņas vienuma TTL
config.session_config=Sesijas konfigurācja
config.session_provider=Sesijas nodrošinātājs
-config.provider_config=Pakalpojumu sniedzēja konfigurācija
+config.provider_config=Nodrošinātāja konfigurācija
config.cookie_name=Sīkdatnes nosaukums
-config.gc_interval_time=GC laika intervāls
+config.gc_interval_time=GC starplaiks
config.session_life_time=Sesijas ilgums
config.https_only=Tikai HTTPS
config.cookie_life_time=Sīkdatņu glabāšanas ilgums
-config.picture_config=Attēlu un profila bilžu konfigurācija
-config.picture_service=Lokāli attēli
+config.picture_config=Attēlu un profila attēlu konfigurācija
+config.picture_service=Attēlu pakalpojums
config.disable_gravatar=Atspējot Gravatar
-config.enable_federated_avatar=Iespējot apvienotās profila bildes
+config.enable_federated_avatar=Iespējot vienotos profila attēlus
config.git_config=Git konfigurācija
config.git_disable_diff_highlight=Atspējot salīdzināšanas sintakses iekrāsošanu
@@ -3381,10 +3463,10 @@ config.git_clone_timeout=Klonēšanas darbības noildze
config.git_pull_timeout=Atgādāšanas darbības noildze
config.git_gc_timeout=GC darbības noildze
-config.log_config=Žurnalizēšanas konfigurācija
+config.log_config=Žurnāla konfigurācija
config.logger_name_fmt=Žurnalizētājs: %s
config.disabled_logger=Atspējots
-config.access_log_mode=Piekļuves žurnalizēšanas veids
+config.access_log_mode=Piekļuves žurnalēšanas veids
config.access_log_template=Piekļuves žurnāla sagatave
config.xorm_log_sql=SQL žurnalizēšana
@@ -3392,14 +3474,14 @@ config.set_setting_failed=`Neizdevās uzstādīt iestatījumu "%s"`
monitor.stats=Statistika
-monitor.cron=Cron uzdevumi
+monitor.cron=Atkārtojamie uzdevumi
monitor.name=Nosaukums
monitor.schedule=Grafiks
-monitor.next=Nākošās izpildes laiks
+monitor.next=Nākamā reize
monitor.previous=Pēdējās izpildes laiks
monitor.execute_times=Izpildes
monitor.process=Darbojošies procesi
-monitor.stacktrace=Steka izsekojamība
+monitor.stacktrace=Steka trasējums
monitor.processes_count=%d procesi
monitor.download_diagnosis_report=Lejupielādēt diagnostikas atskaiti
monitor.desc=Apraksts
@@ -3418,7 +3500,7 @@ monitor.queue.type=Veids
monitor.queue.exemplar=Eksemplāra veids
monitor.queue.numberworkers=Strādņu skaits
monitor.queue.activeworkers=Darbojošies strādņi
-monitor.queue.maxnumberworkers=Maksimālais strādņu skaits
+monitor.queue.maxnumberworkers=Lielākais pieļaujamais strādņu skaits
monitor.queue.numberinqueue=Skaits rindsarakstā
monitor.queue.review_add=Pārskatīt/pievienot strādņus
monitor.queue.settings.title=Pūla iestatījumi
@@ -3427,20 +3509,20 @@ monitor.queue.settings.maxnumberworkers=Maksimālais strādņu skaits
monitor.queue.settings.maxnumberworkers.placeholder=Pašalaik %[1]d
monitor.queue.settings.maxnumberworkers.error=Maksimālajam strādņu skaitam ir jābūt skaitlim
monitor.queue.settings.submit=Atjaunināt iestatījumus
-monitor.queue.settings.changed=Iestatījumi saglabāti
+monitor.queue.settings.changed=Iestatījumi atjaunināti
monitor.queue.settings.remove_all_items=Noņemt visus
monitor.queue.settings.remove_all_items_done=Visi rindsaraksta vienumi tika noņemti.
notices.system_notice_list=Sistēmas paziņojumi
-notices.view_detail_header=Skatīt paziņojuma detaļas
+notices.view_detail_header=Apskatīt paziņojuma informāciju
notices.operations=Darbības
-notices.select_all=Iezīmēt visu
-notices.deselect_all=Atcelt visa iezīmēšanu
-notices.inverse_selection=Apgriezeniskā iezīmēšana
-notices.delete_selected=Dzēst iezīmēto
-notices.delete_all=Dzēst visus paziņojumus
+notices.select_all=Atlasīt visus
+notices.deselect_all=Atcelt visa atlasīšanu
+notices.inverse_selection=Apvērst atlasīto
+notices.delete_selected=Izdzēst atlasītos
+notices.delete_all=Izdzēst visus paziņojumus
notices.type=Veids
-notices.type_1=Repozitorijs
+notices.type_1=Glabātava
notices.type_2=Uzdevums
notices.desc=Apraksts
notices.op=Op.
@@ -3462,9 +3544,23 @@ self_check.database_fix_mysql = MySQL/MariaDB lietotāji var izmantot komandu "f
config.app_slogan = Servera sauklis
config.allow_dots_in_usernames = Ļaut lietotājiem izmantot punktus savā lietotājvārdā. Neietekmē esošos kontus.
users.restricted.description = Ļaut mijiedarbību tikai ar glabātavām un apvienībām, kurās šis lietotājs ir pievienots kā līdzdalībnieks. Tas neļauj piekļūt šī servera publiskajām glabātavām.
+dashboard.sync_tag.started = Uzsākta birku sinhronizēšana
+users.organization_creation.description = Ļaut jaunu apvienību izveidošanu.
+users.block.description = Liegt šī lietotāja mijiedarbību ar šo serveri caur tā kontu un neļaut pieteikšanos.
+users.admin.description = Nodrošināt šim lietotājam pilnu piekļuvi visām pārvaldīšanas iespējām ar tīmekļa saskarni un API.
+users.local_import.description = Ļaut glabātavu ievietošanu no servera vietējās datņu sistēmas. Tā var būt drošības nepilnība.
+emails.delete = Izdzēst e-pasta adresi
+emails.delete_desc = Vai tiešām izdzēst šo e-pasta adresi?
+emails.deletion_success = E-pasta adrese tika izdzēsta.
+emails.delete_primary_email_error = Nevar izdzēst galveno e-pasta adresi.
+auths.tips.gmail_settings = Gmail iestatījumi:
+users.activated.description = E-pasta adreses apliecināšanas pabeigšana. Neaktivēta konta īpašnieks nevarēs pieteikties, kamēr e-pasta adreses apliecināšana nebūs pabeigta.
+auths.default_domain_name = Noklusējuma domēna vārds, kas tiek izmantots e-pasta adresēs
+dashboard.sync_repo_tags = Datubāzē sinhronizēt birkas no Git datiem
+monitor.duration = Ilgums (s)
[action]
-create_repo=izveidoja repozitoriju %s
+create_repo=izveidoja glabātavu %s
rename_repo=pārdēvēja glabātavu %[1]s
par %[3]s
commit_repo=aizgādāja izmaiņas uz %[3]s glabātavā %[4]s
create_issue=`atvēra pieteikumu %[3]s#%[2]s `
@@ -3477,7 +3573,7 @@ comment_issue=`pievienoja piebildi pieteikumam %[3]s#%[2]s `
comment_pull=`pievienoja piebildi izmaiņu pieprasījumam %[3]s#%[2]s `
merge_pull_request=`iekļāva izmaiņu pieprasījumu %[3]s#%[2]s `
auto_merge_pull_request=`automātiski iekļāva izmaiņu pieprasījumu %[3]s#%[2]s `
-transfer_repo=mainīja repozitorija %s
īpašnieku uz %s
+transfer_repo=glabātavu %s
nodeva %s
push_tag=aizgādāja birku %[3]s uz %[4]s
delete_tag=izdzēsa birku %[2]s no %[3]s
delete_branch=izdzēsa zaru %[2]s no %[3]s
@@ -3489,7 +3585,7 @@ mirror_sync_create=sinhronizēja jaunu atsauci %[3]s uz %[2]s %[3]s no spoguļglabātavas
approve_pull_request=`apstiprināja izmaiņu pieprasījumu %[3]s#%[2]s `
reject_pull_request=`ieteica izmaiņas izmaiņu pieprasījumam %[3]s#%[2]s `
-publish_release=`izveidoja versiju "%[4]s" repozitorijā %[3]s `
+publish_release=`izdeva laidienu %[4]s %[3]s `
review_dismissed=`atmeta izskatīšanu no %[4]s %[3]s#%[2]s `
review_dismissed_reason=Iemesls:
create_branch=izveidoja zaru %[3]s glabātavā %[4]s
@@ -3508,7 +3604,7 @@ future=nākotnē
1y=1 gada
seconds=%d sekundēm
minutes=%d minūtēm
-hours=%d stundām
+hours=%d stundās
days=%d dienas
weeks=%d nedēļām
months=%d mēnešiem
@@ -3541,7 +3637,7 @@ default_key=Parakstīts ar noklusējuma atslēgu
error.extract_sign=Neizdevās izgūt parakstu
error.generate_hash=Neizdevās izveidot iesūtījuma jaucējkodu
error.no_committer_account=Iesūtītāja e-pasta adrese nav piesaistīta nevienam kontam
-error.no_gpg_keys_found=Šim parakstam datu bāzē netika atrasta zināma atslēga
+error.no_gpg_keys_found=Šim parakstam datubāzē netika atrasta zināma atslēga
error.not_signed_commit=Nav parakstīts iesūtījums
error.failed_retrieval_gpg_keys=Neizdevās iegūt nevienu iesūtītāja kontam piesaistītu atslēgu
error.probable_bad_signature=UZMANĪBU! Lai arī datubāzē ir atslēga ar šādu identifikatoru, tā neapliecina šo iesūtījumu. Šis iesūtījums ir AIZDOMĪGS.
@@ -3554,28 +3650,28 @@ error.unit_not_allowed=Nav ļauts piekļūt šai glabātavas sadaļai.
[packages]
title=Pakotnes
-desc=Pārvaldīt repozitorija pakotnes.
+desc=Pārvaldīt glabātavas pakotnes.
empty=Pašlaik šeit nav nevienas pakotnes.
empty.documentation=Papildu informācija par pakotņu reģistru ir pieejama dokumentācijā .
empty.repo=Šeit netiek parādīta augšupielādēta pakotne? Jādodas uz pakotņu iestatījumiem un jāsasaista tā ar šo glabātavu.
-registry.documentation=Vairāk informācija par %s reģistru ir pieejama dokumentācijā .
+registry.documentation=Vairāk informācijas par %s reģistru ir dokumentācijā .
filter.type=Veids
filter.type.all=Visas
filter.no_result=Pēc norādītajiem kritērijiem nekas netika atrasts.
filter.container.tagged=Ar atzīmi
filter.container.untagged=Bez atzīmes
published_by=Publicēja %[3]s %[1]s
-published_by_in=Publicēja %[3]s %[1]s repozitorijā %[5]s
-installation=Instalācija
+published_by_in=%[3]s laida klajā %[1]s %[5]s
+installation=Uzstādīšana
about=Par šo pakotni
requirements=Prasības
dependencies=Atkarības
keywords=Atslēgvārdi
details=Papildu informācija
details.author=Autors
-details.project_site=Projekta lapa
-details.repository_site=Repozitorija vietne
-details.documentation_site=Dokumentācijas lapa
+details.project_site=Projekta tīmekļvietne
+details.repository_site=Glabātavas tīmekļvietne
+details.documentation_site=Dokumentācijas tīmekļvietne
details.license=Licence
assets=Resursi
versions=Versijas
@@ -3586,24 +3682,24 @@ alpine.registry=Iestatīt šo reģistru ar URL pievienošanu datnē /etc/a
alpine.registry.key=Reģistra publiskā RSA atslēga jālejupielādē mapē /etc/apk/keys/
, lai apliecinātu indeksa parakstu:
alpine.registry.info=No zemāk esošā saraksta jāizvēlas $branch un $repository.
alpine.install=Lai uzstādītu pakotni, ir jāizpilda šī komanda:
-alpine.repository=Repozitorija informācija
+alpine.repository=Glabātavas informācija
alpine.repository.branches=Zari
-alpine.repository.repositories=Repozitoriji
+alpine.repository.repositories=Glabātavas
alpine.repository.architectures=Arhitektūras
cargo.registry=Iestatīt šo reģistru Cargo konfigurācijas datnē (piemēram, ~/.cargo/config.toml
):
-cargo.install=Lai instalētu Cargo pakotni, izpildiet sekojošu komandu:
+cargo.install=Lai uzstādītu pakotni ar Cargo, jāizpilda šī komanda:
chef.registry=Iestatīt šo reģistru datnē ~/.chef/config.rb
:
chef.install=Lai uzstādītu pakotni, ir jāizpilda šī komanda:
composer.registry=Iestatīt šo reģistru datnē ~/.composer/config.json
:
-composer.install=Lai instalētu Composer pakotni, izpildiet sekojošu komandu:
+composer.install=Lai uzstādīt pakotni ar Composer, jāizpilda šī komanda:
composer.dependencies=Atkarības
composer.dependencies.development=Izstrādes atkarības
-conan.details.repository=Repozitorijs
-conan.registry=Šis reģistrs ir uzstādāms komandrindā:
-conan.install=Lai instalētu Conan pakotni, izpildiet sekojošu komandu:
+conan.details.repository=Glabātava
+conan.registry=Šis reģistra uzstādīšana komandrindā:
+conan.install=Lai uzstādītu pakotni ar Conan, jāizpilda šī komanda:
conda.registry=Izveidot šo reģistru kā Conda glabātavu datnē .condarc
:
-conda.install=Lai instalētu Conda pakotni, izpildiet sekojošu komandu:
-container.details.type=Attēla formāts
+conda.install=Lai uzstādītu pakotni ar Conda, jāizpilda šī komanda:
+container.details.type=Attēla veids
container.details.platform=Platforma
container.pull=Atgādāt attēlu komandrindā:
container.digest=Īssavilkums
@@ -3614,91 +3710,91 @@ container.labels.key=Atslēga
container.labels.value=Vērtība
cran.registry=Iestatīt šo reģistru datnē Rprofile.site
:
cran.install=Lai uzstādītu pakotni, ir jāizpilda šī komanda:
-debian.registry=Šis reģistrs ir uzstādāms komandrindā:
+debian.registry=Šis reģistra uzstādīšana komandrindā:
debian.registry.info=No zemāk esošā saraksta jāizvēlas $distribution un $component.
debian.install=Lai uzstādītu pakotni, ir jāizpilda šī komanda:
-debian.repository=Repozitorija informācija
+debian.repository=Glabātavas informācija
debian.repository.distributions=Distribūcijas
debian.repository.components=Komponentes
debian.repository.architectures=Arhitektūras
generic.download=Lejupielādēt pakotni, izmantojot, komandrindu:
-go.install=Instalēt pakotni no komandrindas:
-helm.registry=Šis reģistrs ir uzstādāms komandrindā:
-helm.install=Lai instalētu pakotni, nepieciešams izpildīt sekojošu komandu:
+go.install=Uzstādīt pakotni komandrindā:
+helm.registry=Šī reģistra uzstādīšana komandrindā:
+helm.install=Lai uzstādītu pakotni, ir jāizpilda šī komanda:
maven.registry=Iestatīt šo reģistru sava projekta datnē pom.xml
:
maven.install=Lai izmantotu pakotni, datnes pom.xml
sadaļā dependencies
jāievieto šīs rindas:
-maven.install2=Izpildiet no komandrindas:
-maven.download=Izpildiet no komandrindas, lai lejupielādētu šo atkarību:
-nuget.registry=Šis reģistrs ir uzstādāms komandrindā:
-nuget.install=Lai instalētu NuGet pakotni, izpildiet sekojošu komandu:
+maven.install2=Jāizpilda komandrindā:
+maven.download=Jāizpilda komandrindā, lai lejupielādētu šo atkarību:
+nuget.registry=Šī reģistra uzstādīšana komandrindā:
+nuget.install=Lai uzstādītu pakotni ar NuGet, jāizpilda šī komanda:
nuget.dependency.framework=Mērķa ietvars
npm.registry=Iestatīt šo reģistru sava projekta datnē .npmrc
:
-npm.install=Lai instalētu npm pakotni, izpildiet sekojošu komandu:
+npm.install=Lai uzstādītu pakotni ar npm, jāizpilda šī komanda:
npm.install2=vai datnē package.json jāpievieno:
npm.dependencies=Atkarības
npm.dependencies.development=Izstrādes atkarības
-npm.dependencies.peer=Netiešās atkarības
-npm.dependencies.optional=Neobligātās atkarības
+npm.dependencies.peer=Līdzatkarības
+npm.dependencies.optional=Izvēles atkarības
npm.details.tag=Tags
-pub.install=Lai instalētu Dart pakotni, izpildiet sekojošu komandu:
+pub.install=Lai uzstādītu pakotni ar Dart, jāizpilda šī komanda:
pypi.requires=Nepieciešams Python
-pypi.install=Lai instalētu pip pakotni, izpildiet sekojošu komandu:
-rpm.registry=Šis reģistrs ir uzstādāms komandrindā:
+pypi.install=Lai uzstādītu pakotni ar pip, jāizpilda šī komanda:
+rpm.registry=Šī reģistra uzstādīšana komandrindā:
rpm.distros.redhat=uz RedHat balstītās operētājsistēmās
rpm.distros.suse=uz SUSE balstītās operētājsistēmās
rpm.install=Lai uzstādītu pakotni, ir jāizpilda šī komanda:
-rpm.repository=Repozitorija informācija
+rpm.repository=Glabātavas informācija
rpm.repository.architectures=Arhitektūras
-rubygems.install=Lai instalētu gem pakotni, izpildiet sekojošu komandu:
+rubygems.install=Lai uzstādītu pakotni ar gem, jāizpilda šī komanda:
rubygems.install2=vai jāpievieno tas Gemfile:
rubygems.dependencies.runtime=Izpildlaika atkarības
rubygems.dependencies.development=Izstrādes atkarības
rubygems.required.ruby=Nepieciešamā Ruby versija
rubygems.required.rubygems=Nepieciešamā RubyGem versija
-swift.registry=Šis reģistrs ir uzstādāms komandrindā:
+swift.registry=Šī reģistra uzstādīšana komandrindā:
swift.install=Pakotne jāpievieno datnē Package.swift
:
-swift.install2=un izpildiet sekojošu komandu:
-vagrant.install=Lai pievienotu Vagrant kasti, izpildiet sekojošu komandu:
-settings.link=Piesaistīt pakotni šim repozitorijam
-settings.link.description=Sasaistot pakotni ar repozitoriju, tā tiks attēlota repozitorija pakotņu sarakstā.
-settings.link.select=Norādiet repozitoriju
-settings.link.button=Atjaunot repozitorija saiti
+swift.install2=vai jāpievieno tā Gemfile:
+vagrant.install=Lai pievienotu Vagrant kasti, jāizpilda šī komanda:
+settings.link=Piesaistīt šo pakotni glabātavai
+settings.link.description=Ja pakotne tiek sasaistīta ar glabātavu, tā tiek attēlota glabātavas pakotņu sarakstā.
+settings.link.select=Atlasīt glabātavu
+settings.link.button=Atjaunināt glabātavas saiti
settings.link.success=Glabātavas saite tika sekmīgi atjaunināta.
-settings.link.error=Neizdevās atjaunot repozitorija saiti.
+settings.link.error=Neizdevās atjaunināt glabātavas saiti.
settings.delete=Dzēst pakotni
settings.delete.description=Pakotne tiks neatgriezeniski izdzēsta.
-settings.delete.notice=Tiks dzēsts %s (%s). Šī darbība ir neatgriezeniska. Vai vēlaties turpināt?
+settings.delete.notice=Tiks izdzēsta pakotne %s (%s). Šī darbība ir neatgriezeniska. Tiešām turpināt?
settings.delete.success=Pakotne tika izdzēsta.
settings.delete.error=Neizdevās izdzēst pakotni.
owner.settings.cargo.title=Cargo reģistra inkdess
-owner.settings.cargo.initialize=Inicializēt indeksu
-owner.settings.cargo.initialize.description=Ir nepieciešams īpašs indeksa Git repozitorijs, lai izmantotu Cargo reģistru. Šīs iespējas izmantošana (atkārtoti) izveidos repozitoriju un automātiski to iestatīs.
+owner.settings.cargo.initialize=Sāknēt indeksu
+owner.settings.cargo.initialize.description=Ir nepieciešams īpaša indeksa Git glabātava, lai izmantotu Cargo reģistru. Šīs iespējas izmantošana (atkārtoti) izveidos glabātavu un automātiski to iestatīs.
owner.settings.cargo.initialize.error=Neizdevās inicializēt Cargo indeksu: %v
owner.settings.cargo.initialize.success=Cargo indekss tika sekmīgi izveidots.
owner.settings.cargo.rebuild=Pārbūvēt indeksu
owner.settings.cargo.rebuild.description=Pārbūvēšana var būt noderīga, ja indekss nav sinhronizēts ar saglabātajām Cargo pakotnēm.
owner.settings.cargo.rebuild.error=Neizdevās pārbūvēt Cargo indeksu: %v
owner.settings.cargo.rebuild.success=Cargo indekss tika sekmīgi pārbūvēts.
-owner.settings.cleanuprules.title=Pārvaldīt notīrīšanas noteikumus
-owner.settings.cleanuprules.add=Pievienot notīrīšanas noteikumu
-owner.settings.cleanuprules.edit=Labot notīrīšanas noteikumu
-owner.settings.cleanuprules.none=Nav pievienoti tīrīšanas noteikumi. Sīkāku informāciju iespējams iegūt dokumentācijā.
+owner.settings.cleanuprules.title=Notīrīšanas kārtulas
+owner.settings.cleanuprules.add=Pievienot notīrīšanas kārtulu
+owner.settings.cleanuprules.edit=Labot notīrīšanas kārtulu
+owner.settings.cleanuprules.none=Vēl nav pieejama neviena tīrīšanas kārtula.
owner.settings.cleanuprules.preview=Attīrīšanas kārtulas priekšskatījums
owner.settings.cleanuprules.preview.overview=Ir ieplānota %d paku dzēšana.
-owner.settings.cleanuprules.preview.none=Notīrīšanas noteikumam neatbilst neviena pakotne.
+owner.settings.cleanuprules.preview.none=Notīrīšanas kārtulai neatbilst neviena pakotne.
owner.settings.cleanuprules.enabled=Iespējots
owner.settings.cleanuprules.pattern_full_match=Piešķirt šablonu visam pakotnes nosaukumam
-owner.settings.cleanuprules.keep.title=Versijas, kas atbilst šiem noteikumiem tiks saglabātas, pat ja tās atbilst noņemšanas noteikumiem zemāk.
+owner.settings.cleanuprules.keep.title=Versijas, kas atbilst šīm kārtulām, tiks paturētas, pat ja tās atbildīs zemāk esošajai noņemšanas kārtulai.
owner.settings.cleanuprules.keep.count=Saglabāt jaunāko versiju
owner.settings.cleanuprules.keep.count.1=1 versija katrai pakotnei
owner.settings.cleanuprules.keep.count.n=%d versijas katrai pakotnei
owner.settings.cleanuprules.keep.pattern=Paturēt versijas, kas atbilst
owner.settings.cleanuprules.keep.pattern.container=Versija latest
vienmēr tiks paturēta konteineru pakotnēm.
-owner.settings.cleanuprules.remove.title=Versijas, kas atbilst šiem noteikumiem tiks noņemtas, ja vien neatbilst arī noteikumiem augstāk, lai tās paturētu.
+owner.settings.cleanuprules.remove.title=Versijas, kas atbilst šīm kārtulām, tiks noņemtas, ja vien augstāk esošā kārtula nenosaka, ka tās ir jāpatur.
owner.settings.cleanuprules.remove.days=Noņemt versijas vecākas kā
owner.settings.cleanuprules.remove.pattern=Noņemt versijas, kas atbilst
-owner.settings.cleanuprules.success.update=Notīrīšanas noteikumi tika atjaunoti.
-owner.settings.cleanuprules.success.delete=Notīrīšanas noteikumi tika izdzēsti.
+owner.settings.cleanuprules.success.update=Notīrīšanas kārtula tika atjaunināta.
+owner.settings.cleanuprules.success.delete=Notīrīšanas kārtula tika izdzēsta.
owner.settings.chef.title=Chef reģistrs
owner.settings.chef.keypair=Izveidot atslēgu pāri
owner.settings.chef.keypair.description=Atslēgu pāris ir nepieciešams, lai autentificētos Chef reģistrā. Ja iepriekš ir izveidots atslēgu pāris, jauna pāra izveidošana veco atslēgu pāri padarīs nederīgu.
@@ -3710,6 +3806,26 @@ arch.pacman.sync = Jāsinhronizē pakotne ar pacman:
arch.version.description = Apraksts
arch.version.provides = Nodrošina
arch.pacman.conf = /etc/pacman.conf
jāpievieno serveris ar atbilstošu distribūciju un arhitektūru:
+arch.version.groups = Kopa
+arch.version.replaces = Aizvieto
+arch.version.checkdepends = Pārbaudīt atkarības
+arch.version.conflicts = Nesaderības
+npm.dependencies.bundle = Iekļautās atkarības
+container.images.title = Attēli
+arch.version.optdepends = Izvēles atkarības
+arch.version.makedepends = Izveidot atkarības
+arch.version.backup = Rezerves kopija
+arch.version.depends = Atkarības
+rpm.repository.multiple_groups = Šī pakotne ir pieejama vairākās kopās.
+owner.settings.cargo.rebuild.no_index = Nevar pārbūvēt, nav sāknēts neviens indekss.
+search_in_external_registry = Meklēt %s
+alt.registry = Šī reģistra uzstādīšana komandrindā:
+alt.registry.install = Lai uzstādītu pakotni, jāizpilda šī komanda:
+alt.install = Uzstādīt pakotni
+alt.setup = Pievienot glabātavu savienoto glabātavu sarakstā ('_arch_' vietā jāizvēlas nepieciešamā arhitektūra):
+alt.repository = Informācija par glabātavu
+alt.repository.architectures = Arhitektūras
+alt.repository.multiple_groups = Šī pakotne ir pieejama vairākās kopās.
[secrets]
secrets=Noslēpumi
@@ -3717,14 +3833,14 @@ description=Noslēpumi tiks padoti atsevišķām darbībām un citādi nevar tik
none=Pagaidām nav neviena noslēpuma.
creation=Pievienot noslēpumu
creation.name_placeholder=reģistrnejutīgs, tikai burti, cipari un apakšsvītras, nevar sākties ar GITEA_ vai GITHUB_
-creation.value_placeholder=Ievadiet jebkādu saturu. Atstarpes sākumā un beigā tiks noņemtas.
+creation.value_placeholder=Jāievada jebkāds saturs. Atstarpes sākumā un beigās tiks izlaistas.
creation.success=Noslēpums "%s" tika pievienots.
creation.failed=Neizdevās pievienot noslēpumu.
deletion=Dzēst noslēpumu
deletion.description=Noslēpuma dzēšana ir neatgriezeniska. Vai turpināt?
deletion.success=Noslēpums tika izdzēsts.
deletion.failed=Neizdevās dzēst noslēpumu.
-management=Noslēpumu pārvaldība
+management=Pārvaldīt noslēpumus
[actions]
actions=Darbības
@@ -3734,15 +3850,15 @@ unit.desc=Iebūvēto CI/CD cauruļvadu pārvaldīšana ar Forgejo Actions.
status.unknown=Nezināms
status.waiting=Gaida
status.running=Izpildās
-status.success=Pabeigts
+status.success=Sekmīgi
status.failure=Atteice
status.cancelled=Atcelts
status.skipped=Izlaists
-status.blocked=Bloķēts
+status.blocked=Aizturēts
runners=Izpildītāji
-runners.runner_manage_panel=Izpildītāju pārvaldība
-runners.new=Pievienot jaunu izpildītāju
+runners.runner_manage_panel=Pārvaldīt izpildītājus
+runners.new=Izveidot jaunu izpildītāju
runners.new_notice=Kā uzstādīt izpildītāju
runners.status=Statuss
runners.id=ID
@@ -3756,7 +3872,7 @@ runners.task_list=Pēdējās darbības, kas izpildītas
runners.task_list.no_tasks=Vēl nav uzdevumu.
runners.task_list.run=Izpildījums
runners.task_list.status=Statuss
-runners.task_list.repository=Repozitorijs
+runners.task_list.repository=Glabātava
runners.task_list.commit=Iesūtījums
runners.task_list.done_at=Beigu laiks
runners.edit_runner=Labot izpildītāju
@@ -3777,15 +3893,15 @@ runners.version=Versija
runners.reset_registration_token=Atiestatīt reģistrācijas pilnvaru
runners.reset_registration_token_success=Izpildītāja reģistrācijas pilnvara tika sekmīgi atiestatīta
-runs.all_workflows=Visas darbaplūsmas
-runs.commit=Iesūtījums
+runs.all_workflows=Visas darbplūsmas
+runs.commit=Iesūtījumu
runs.scheduled=Ieplānots
runs.pushed_by=aizgādāja
runs.invalid_workflow_helper=Darbplūsmas konfigurācijas datne ir nederīga. Lūgums pārbaudīt konfigurācijas datni: %s
-runs.no_matching_online_runner_helper=Nav pieejami izpildītāji, kas atbilstu šai iezīmei: %s
-runs.actor=Aktors
+runs.no_matching_online_runner_helper=Nav tiešsaistē esošu izpildītāju, kas atbilstu iezīmei: %s
+runs.actor=Izraisītājs
runs.status=Statuss
-runs.actors_no_select=Visi aktori
+runs.actors_no_select=Visi izraisītāji
runs.status_no_select=Visi stāvokļi
runs.no_results=Netika atrasts nekas atbilstošs.
runs.no_workflows=Vēl nav nevienas darbplūsmas.
@@ -3801,11 +3917,11 @@ workflow.disabled=Darbplūsma ir atspējota.
need_approval_desc=Nepieciešams apstiprinājums, lai izpildītu darbplūsmas izmaiņu pieprasījumos no atzarojumiem.
variables=Mainīgie
-variables.management=Mainīgo pārvaldība
+variables.management=Pārvaldīt mainīgos
variables.creation=Pievienot mainīgo
variables.none=Vēl nav neviena mainīgā.
variables.deletion=Noņemt mainīgo
-variables.deletion.description=Mainīgā noņemšana ir neatgriezeniska un nav atsaucama. Vai turpināt?
+variables.deletion.description=Mainīgā noņemšana ir neatgriezeniska un nav atsaucama. Turpināt?
variables.description=Mainīgie tiks padoti noteiktām darbībām, un citādāk tos nevar nolasīt.
variables.id_not_exist=Mainīgais ar identifikatoru %d nepastāv.
variables.edit=Labot mainīgo
@@ -3815,11 +3931,25 @@ variables.creation.failed=Neizdevās pievienot mainīgo.
variables.creation.success=Mainīgais "%s" tika pievienots.
variables.update.failed=Neizdevās labot mainīgo.
variables.update.success=Mainīgais tika labots.
+workflow.dispatch.invalid_input_type = Nederīgs ievades mainīgā veids "%s".
+workflow.dispatch.run = Izpildīt darbplūsmu
+workflow.dispatch.success = Darbplūsmas izpildīšana tika sekmīgi pieprasīta.
+workflow.dispatch.use_from = Izmantot darbplūsmu no
+runs.workflow = Darbplūsma
+runs.no_job_without_needs = Darbplūsmā ir jābūt vismaz vienam darbam bez atkarībām.
+workflow.dispatch.input_required = Nepieciešama vērtība ievades mainīgajam "%s".
+runs.expire_log_message = Žurnāli tika iztīrīti, jo tie bija pārāk veci.
+runs.no_workflows.help_no_write_access = Lai uzzinātu par Forgejo Acties, jāieskatās dokumentācijā .
+runs.no_job = Darbplūsmā ir jābūt vismaz vienam darbam
+runs.no_workflows.help_write_access = Nav skaidrs, kā sākt izmantot Forgejo Actions? Jāieskatās ātrajā ievadā lietotāja dokumentācijā , lai uzrakstītu savu pirmo darbplūsmu, tad jāiestata Forgejo izpildītājs , lai izpildītu savus darbus.
+workflow.dispatch.warn_input_limit = Attēlo tikai pirmos %d ievades mainīgos.
+workflow.dispatch.trigger_found = Šai darbplūsmai ir workflow_dispatch notikuma izraisītājs.
[projects]
-type-1.display_name=Individuālais projekts
-type-2.display_name=Repozitorija projekts
-type-3.display_name=Organizācijas projekts
+type-1.display_name=Atsevišķs projekts
+type-2.display_name=Glabātavas projekts
+type-3.display_name=Apvienības projekts
+deleted.display_name = Izdzēsts projekts
[git.filemode]
changed_filemode=%[1]s → %[2]s
@@ -3867,6 +3997,18 @@ ext_issues = Piekļūt ārēja pieteikumu izsekotāja saitei. Atļaujas tiek pā
packages.write = Rakstīt: pievienot un izdzēst glabātavai piesaistītās pakotnes.
actions.read = Lasīt: skatīt iekļautos CI/CD cauruļvadus un to žurnālus.
code.write = Rakstīt: aizgādāta izmaiņas uz glabātavu, izveidot zarus un birkas.
+pulls.write = Rakstīt: aizvērt izmaiņu pieprasījumus un pāŗvaldīt tādus metadatus kā iezīmes, atskaites punktus, atbildīgos, beigu datumus un atkarības.
+pulls.read = Lasīt: lasīšana un izveidot izmaiņu pieprasījumus.
+code.read = Lasīt : piekļūt glabātavas kodam un klonēt to.
+issues.read = Lasīt : lasīt un izveidot pieteikumus un piebildes.
+issues.write = Rakstīt : aizvērt pieteikums un pārvaldīt tādus metadatus kā iezīmes, atskaites punktus, atbildīgos, beigu datumus un atkarības.
+wiki.read = Lasīt : lasīt iebūvēto vikivietni un tās vēsturi.
+projects.write = Rakstīt : izveidot projektus un slejas un labot tās.
+packages.read = Lasīt : apskatīt un lejupielādēt glabātavai piesaistītās pakotnes.
+releases.read = Lasīt : apskatīt un lejupielādēt laidienus.
+releases.write = Rakstīt : laist klajā, labot un izdzēst laidienus un to līdzekļus.
+wiki.write = Rakstīt : izveidot, atjaunināt un izdzēst iebūvētās vikivietnes lapas.
+projects.read = Lasīt : piekļūt glabātavas projektu dēļiem.
[munits.data]
@@ -3876,4 +4018,12 @@ gib = GiB
tib = TiB
kib = KiB
eib = EiB
-b = B
\ No newline at end of file
+b = B
+
+[markup]
+filepreview.line = %[1]d. rinda %[2]s
+filepreview.lines = %[1]d. līdz %[2]d. rinda %[3]s
+filepreview.truncated = Priekšskatījums tika saīsināts
+
+[translation_meta]
+test = Šī ir pārbaudes virkne. Tā netiek attēlota Forgejo saskarnē, bet tiek izmantota pārbaudes nolūkiem. Droši var ievadīt "ok", lai ietaupītu laiku (vai kādu jautru faktu pēc izvēles), lai sasniegtu to saldo 100% pabeigšanas atzīmi.
\ No newline at end of file
diff --git a/options/locale/locale_nb_NO.ini b/options/locale/locale_nb_NO.ini
index 3a4dd27d54..18c9835df0 100644
--- a/options/locale/locale_nb_NO.ini
+++ b/options/locale/locale_nb_NO.ini
@@ -123,13 +123,26 @@ sign_out = Logg ut
sign_up = Opprett konto
confirm_delete_artifact = Er du sikker på at du vil slette artefakten "%s" ?
webauthn_sign_in = Trykk på knappen på sikkerhetsnøkkelen din. Dersom nøkkelen din ikke har en knapp, sett den inn på nytt.
+copy_path = Kopier sti
+webauthn_error_unable_to_process = Tjeneren kunne ikke behandle forespørselen din.
+webauthn_error_empty = Du må gi nøkkelen et navn.
[search]
search = Søk...
type_tooltip = Søketype
fuzzy = Fuzzy
union = Union
+regexp = RegExp
+exact = Nøyaktig
[auth]
verify = Bekreft
-sign_up_button = Opprett konto nå.
\ No newline at end of file
+sign_up_button = Opprett konto nå.
+change_unconfirmed_email_error = Kan ikke endre e-postadresse: %v
+login_userpass = Logg inn
+oauth_signup_tab = Registrer ny konto
+oauth_signup_title = Fullfør ny konto
+oauth_signup_submit = Fullfør konto
+
+[home]
+uname_holder = Brukernavn eller e-postadresse
\ No newline at end of file
diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini
index f9d6e9efd4..7e80d116c2 100644
--- a/options/locale/locale_nds.ini
+++ b/options/locale/locale_nds.ini
@@ -833,7 +833,7 @@ confirm_delete_account = Lösken utwiesen
email_notifications.disable = Nich över E-Mail benarichtigen
visibility.public_tooltip = Elkeen kann ’t sehen
password_username_disabled = Frömde Brukers könen hör Brukernaam nich ännern. Bidde kuntakteer dienen Sied-Chef för mehr Informatioonen.
-profile_desc = Richt in, wo dien Profil to anner Brukers wiest word. Diene Höövd-E-Mail-Adress word för Narichtens, Passwoord-Torügghalen un Git-Aktioonen över ’t Internett bruukt.
+profile_desc = Över di
hidden_comment_types_description = Kommentaar-Arden, wat hier utköört sünd, worden in Gefall-Sieden nich wiest. Wenn du to’n Bispööl »Vermark« utköörst, worden all de »›Bruker‹ hett ›Vermark‹ hentoföögt/wegdaan«-Kommentaren wegdaan.
email_desc = Diene Höövd-E-Mail-Adress word för Narichtens, Passwoord-Torügghalen un, wenn se nich verburgen is, Git-Aktioonen över ’t Internett bruukt.
can_not_add_email_activations_pending = Een Aktiveren staht noch ut. Wenn du eene neje E-Mail-Adress hentofögen willst, versöök dat in een paar Menüten noch eenmaal.
@@ -841,7 +841,7 @@ email_deletion_desc = De E-Mail-Adress un daarmit verbunnen Informatioon word ut
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 = Dat word diene E-Mail-Adress vun dienem Profil verbargen. Dann is dat nich mehr de Normaalweert för Kommitterens, wat du över de Internett-Schnittstee maakst, so as Datei-Upladens un Bewarkens, un word nich in Tosamenföhrens-Kommitterens bruukt. In Stee daarvun kann eene besünnere Adress %s bruukt worden, um Kommitterens mit dienem Konto to verbinnen. Wees wiss, dat dat Ännern vun deeser Instellen bestahn Kommitterens nich ännert.
+keep_email_private_popup = Diene E-Mail-Adress word vun dienem Profil verbargen un is nich de Normaalweert för Kommitterens, wat du över de Internett-Schnittstee maakst, so as Datei-Upladens, Bewarkens un Tosamenföhrens-Kommitterens. In Stee daarvun kann eene besünnere Adress %s bruukt worden, um Kommitterens mit dienem Konto to verbinnen. Deese Instellen ännert keene bestahn Kommitterens.
ssh_helper = Bruukst du Hülp? Kiek de Inföhren an, wo du diene eegenen SSH-Slötels maakst of hülp gewohnten Probleemen of, över wat man mit SSH mennigmaal strukelt.
access_token_desc = Utköört Teken-Verlöövnissen begrenzen dat Anmellen blots up de tohörig API -Padden. Lees de Dokumenteren för mehr Informatioonen.
oauth2_confidential_client = Diskreeter Klient. Köör dat för Programmen ut, wat dat Geheemst diskreet behanneln, as Internett-Sieden. Köör dat nich för stedenwies Programmen ut, as Schrievdisk- un Telefoon-Programmens.
@@ -851,6 +851,8 @@ oauth2_application_locked = Forgejo vermarkt vörweg eenige OAuth2-Programmen bi
twofa_desc = Um dien Konto tegen Passwoordklau to schütten, kannst du een Smart-Telefoon of anner Geraadskupp bruken, um tied-baseerte Eenmaalpasswoorden (»TOTP«) to kriegen.
twofa_recovery_tip = Wenn du dien Geraadskupp verlüst, kannst du eenen Eenmaal-Bruuk-Torügghalens-Slötel bruken, um weer in dien Konto to komen.
webauthn_desc = Sekerheids-Slötels sünd Geraadskuppen, wat kryptographisk Slötels enthollen. Se könen för dat Anmellen mit Twee Faktooren bruukt worden. Sekerheids-Slötels mutten de »WebAuthn Authenticator «-Standard unnerstütten.
+user_block_yourself = Du kannst di nich sülvst blockeren.
+pronouns_custom_label = Eegene Pronomens
[repo]
rss.must_be_on_branch = Du muttst up eenem Twieg wesen, um eenen RSS-Schuuv to hebben.
@@ -914,7 +916,7 @@ mirror_interval = Tiedofstand för ’t Spegeln (gültige Tied-Eenheiden sünd
issue_labels = Vermarkens
issue_labels_helper = Köör eene Vermarkens-Sammlung ut
license = Lizenz
-auto_init = Repositorium inrichten (Föögt .gitignore, Lizenz un LEESMI hento)
+auto_init = Repositorium inrichten
mirror_sync_on_commit = Spegeln, wenn Kommitterens schuuvt worden
repo_gitignore_helper_desc = Köör ut eener List vun Vörlagen för bekannte Spraken ut, welke Dateien nich verfolgt worden. Normaale Objekten, wat vun de Bauwarktüüg vun elkeen Spraak utgeven worden, sünd in deeser .gitignore dann al enthollen.
default_branch = Höövd-Twieg
@@ -2548,6 +2550,21 @@ diff.git-notes.remove-body = Deeses Anmarken word wegdaan.
issues.num_reviews_one = %d Nakieken
issues.summary_card_alt = Tosamenfatens-Kaart vun eenem Gefall mit de Naam »%s« im Repositorium %s
issues.num_reviews_few = %d Nakiekens
+settings.default_update_style_desc = Normaale Vernejens-Aard, wat bruukt word, um Haalvörslagens to vernejen, wat achter de Grund-Twieg torügg sünd.
+pulls.sign_in_require = Mell di an , um eenen nejen Haalvörslag to maken.
+new_from_template = Bruuk eene Vörlaag
+new_advanced = Mehr Instellens
+new_advanced_expand = Klick, um mehr to wiesen
+auto_init_description = Begünn de Git-Histoorje mit eenem LEESMI un föög, wenn du willst, Lizenz- un .gitignore-Dateien hento.
+new_from_template_description = Du kannst eene bestahn Repositoriums-Vörlaag up deeser Instanz utkören un hör Instellens anwennen.
+summary_card_alt = Tosamenfatens-Kaart vun de Repositorium %s
+issues.reaction.alt_add = De %[1]s-Reageren to de Kommentaar hentofögen.
+issues.reaction.add = Reageren hentofögen
+issues.reaction.alt_few = %[1]s hett mit %[2]s reageert.
+issues.reaction.alt_many = %[1]s un %[2]d anner hebben mit %[3]s reageert.
+issues.reaction.alt_remove = De %[1]s-Reageren vun de Kommentaar wegdoon.
+issues.context.menu = Kommentaar-Menü
+release.summary_card_alt = Tosamenfatens-Kaart vun eenem Publizeren mit de Naam »%s« im Repositorium %s
[repo.permissions]
code.read = Lesen: De Quelltext vun deesem Repositorium ankieken un klonen.
@@ -3215,6 +3232,7 @@ config.allow_only_external_registration = Registreren blots dör frömde Deenste
config.ssh_keygen_path = Slötelmakens-Padd (»ssh-keygen«)
config.open_with_editor_app_help = De »Mit … opmaken«-Bewarkers im Kloon-Menü. Wenn du dat leeg lettst, word de Normaalweert bruukt. Verwieder, um de Normaalweert antokieken.
auths.tip.yandex = Maak een nejes Programm up %s. Köör deese Verlöövnissen ut de Deel »Yandex.Passport API« ut: »Togriep up E-Mail-Adress«, »Togriep up Bruker-Kontobill« un »Togriep up Brukernaam, Vörnaam un Achternaam, Geschlecht«
+monitor.duration = Düür (s)
[action]
rename_repo = hett een Repositorium vun %[1]s
na %[3]s umbenöömt
@@ -3600,6 +3618,7 @@ owner.settings.chef.keypair = Slötelpaar maken
owner.settings.chef.keypair.description = Een Slötelpaar is nödig, um sik bi de Chef-Paketlist antomellen. Wenn du al een Slötelpaar maakt hest, word dat olle Slötelpaar wegdaan, wenn du een nejes Slötelpaar maakst.
conan.install = Um dat Paket mit Conan to installeren, föhr deese Oorder ut:
container.images.title = Avbillers
+search_in_external_registry = In %s söken
[secrets]
secrets = Geheemsten
diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini
index 8290930543..30d2c0ebdf 100644
--- a/options/locale/locale_nl-NL.ini
+++ b/options/locale/locale_nl-NL.ini
@@ -800,7 +800,7 @@ emails=E-mailadressen
manage_emails=E-mailadressen beheren
manage_themes=Standaardthema
manage_openid=OpenID-adressen
-theme_desc=Dit zal het standaardthema worden op de gehele site.
+theme_desc=Dit thema wordt gebruikt voor de webinterface wanneer je bent aangemeld.
primary=Primair
activated=Geactiveerd
requires_activation=Vereist activering
@@ -987,7 +987,7 @@ visibility.private=Privé
blocked_users = Geblokkeerde gebruikers
uid = UID
biography_placeholder = Vertel anderen een beetje over uzelf! (Markdown is ondersteund)
-profile_desc = Controleer hoe uw profiel aan andere gebruikers wordt getoond. Uw primaire e-mailadres zal worden gebruikt voor notificaties, wachtwoord herstel en web-gebaseerde Git-operaties.
+profile_desc = Over u
update_language_not_found = Taal "%s" is niet beschikbaar.
change_username_prompt = Opmerking: Het veranderen van uw gebruikersnaam zal ook de URL van uw account veranderen.
change_username_redirect_prompt = De oude gebruikersnaam zal worden doorverwezen totdat iemand deze opeist.
@@ -1020,7 +1020,7 @@ at_least_one_permission = Je moet minstens één machtiging kiezen om een token
permission_write = Lees en schrijf
oauth2_client_secret_hint = Dit geheim zal niet meer worden getoond nadat u deze pagina heeft verlaten of vernieuwd. Zorg ervoor dat u het heeft opgeslagen.
revoke_oauth2_grant_success = Toegang succesvol ingetrokken.
-keep_email_private_popup = Dit zal je e-mailadres verbergen van uw profielpagina. Het zal niet langer de standaard zijn voor commits die via de webinterface gemaakt worden, zoals bestandsuploads en bewerkingen, en het zal niet gebruikt worden voor samenvoeg commits. In plaats daarvan kan een speciaal adres %s gebruikt worden om commits met je account te associëren. Merk op dat het veranderen van deze optie geen effect heeft op bestaande commits.
+keep_email_private_popup = Uw e-mailadres zal niet getoond worden op uw profiel en zal niet de standaard zijn voor commits die via de webinterface gemaakt worden, zoals bestandsuploads, bewerkingen en samenvoeg commits. In plaats daarvan kan een speciaal adres %s gebruikt worden om commits aan uw account te koppelen. Deze optie zal bestaande commits niet beïnvloeden.
create_oauth2_application_success = U heeft met succes een OAuth2 applicatie gecreëerd.
permissions_access_all = Alle (publiek, privé en gelimiteerd)
oauth2_application_remove_description = Door een OAuth2-applicatie te verwijderen, krijgt deze geen toegang meer tot geautoriseerde gebruikersaccounts op deze instantie. Doorgaan?
@@ -1056,6 +1056,8 @@ language.title = Standaard taal
keep_activity_private.description = Uw publieke activiteit zal alleen zichtbaar zijn voor u en de beheerders van de instantie.
language.description = Deze taal wordt opgeslagen in uw account en wordt als standaardtaal gebruikt nadat u zich heeft aangemeld.
language.localization_project = Help ons Forgejo in uw taal te vertalen! Leer meer .
+user_block_yourself = U kunt niet zichzelf blokkeren.
+pronouns_custom_label = Aangepaste voornaamwoorden
[repo]
owner=Eigenaar
@@ -1093,11 +1095,11 @@ issue_labels=Labels
issue_labels_helper=Selecteer een labelset
license=Licentie
license_helper=Selecteer een licentie bestand
-license_helper_desc=Een licentie bepaalt wat anderen wel en niet met je code kunnen doen. Niet zeker welke juist is voor jouw project? Zie Kies een licentie.
+license_helper_desc=Een licentie bepaalt wat anderen wel en niet met je code kunnen doen. Niet zeker welke juist is voor jouw project? Zie Kies een licentie .
readme=README
readme_helper=Selecteer een README-bestandssjabloon
readme_helper_desc=Dit is de plek waar je een volledige beschrijving van je project kunt schrijven.
-auto_init=Initialiseer repository (voegt .gitignore, License en README toe)
+auto_init=Initialiseer repository
trust_model_helper=Selecteer het vertrouwensmodel voor handtekeningverificatie. Mogelijke opties zijn:
trust_model_helper_collaborator=Samenwerker: Vertrouw handtekeningen door samenwerker
trust_model_helper_committer=Committer: Vertrouw handtekeningen die overeenkomen met de committers
@@ -1161,8 +1163,8 @@ template.issue_labels=Issue labels
template.one_item=Moet ten minste één sjabloon selecteren
template.invalid=Moet een sjabloon repository selecteren
-archive.issue.nocomment=Deze repo is gearchiveerd. U kunt niet reageren op problemen.
-archive.pull.nocomment=Deze repo is gearchiveerd. U kunt niet reageren op pull requests.
+archive.issue.nocomment=Deze repository is gearchiveerd. U kunt niet reageren op problemen.
+archive.pull.nocomment=Deze repository is gearchiveerd. U kunt niet reageren op pull requests.
form.reach_limit_of_creation_1=U heeft al uw limiet van %d repository bereikt.
form.reach_limit_of_creation_n=U heeft al uw limiet van %d repositories bereikt.
@@ -2194,8 +2196,8 @@ settings.archive.header=Archiveer deze repo
settings.archive.success=De repo is succesvol gearchiveerd.
settings.archive.error=Er is een fout opgetreden tijdens het archiveren van de repo. Zie het logboek voor meer informatie.
settings.archive.error_ismirror=U kunt geen gespiegelde repository archiveren.
-settings.archive.branchsettings_unavailable=Branch instellingen zijn niet beschikbaar als de repo is gearchiveerd.
-settings.archive.tagsettings_unavailable=Labelinstellingen zijn niet beschikbaar als de repo is gearchiveerd.
+settings.archive.branchsettings_unavailable=Branchinstellingen zijn niet beschikbaar in gearchiveerde repo's.
+settings.archive.tagsettings_unavailable=Tag-instellingen zijn niet beschikbaar in gearchiveerde repo's.
settings.update_avatar_success=De repository avatar is bijgewerkt.
settings.lfs=LFS
settings.lfs_filelist=LFS bestanden opgeslagen in deze repository
@@ -2408,7 +2410,7 @@ issues.review.option.hide_outdated_comments = Verouderde reacties verbergen
pulls.expand_files = Alle bestanden uitklappen
pulls.collapse_files = Alle bestanden inklappen
pulls.show_all_commits = Alle commits weergeven
-new_repo_helper = Een repository bevat alle projectbestanden, inclusief revisiegeschiedenis. Host je er al ergens anders een? Repository migreren.
+new_repo_helper = Een repository bevat alle projectbestanden, inclusief revisiegeschiedenis. Host je er al ergens anders een? Repository migreren .
editor.fail_to_update_file = Mislukt bij het bijwerken/creëren van bestand "%s".
editor.file_is_a_symlink = `"%s" is een symbolische link. Symbolische links kunnen niet worden bewerkt in de webeditor`
editor.filename_is_a_directory = Bestandsnaam "%s" wordt al gebruikt als naam van een map in deze repository.
@@ -2478,7 +2480,7 @@ tree_path_not_found_tag = Pad %[1]s bestaat niet in tag %[2]s
transfer.no_permission_to_reject = Je hebt geen rechten om deze overdracht af te wijzen.
settings.transfer_owner = Nieuwe eigenaar
mirror_address_protocol_invalid = De opgegeven URL is ongeldig. Alleen http(s):// of git:// locaties kunnen gebruikt worden voor spiegelen.
-archive.title = Deze repo is gearchiveerd. Je kunt bestanden bekijken en klonen, maar geen issues of pull requests pushen of openen.
+archive.title = Deze repository is gearchiveerd. Je kunt bestanden bekijken en klonen, maar geen issues of pull requests pushen of openen.
archive.title_date = Deze repository is gearchiveerd op %s. Je kunt bestanden bekijken en klonen, maar je kunt niet pushen of issues of pull requests openen.
migrate_options_lfs_endpoint.placeholder = Als dit leeg gelaten wordt, zal het eindpunt afgeleid worden van de kloon URL
invisible_runes_description = `Dit bestand bevat onzichtbare Unicode-tekens die voor mensen niet te onderscheiden zijn, maar door een computer anders verwerkt kunnen worden. Als je denkt dat dit opzettelijk is, kun je deze waarschuwing gerust negeren. Gebruik de Escape knop om ze te onthullen.`
@@ -2610,7 +2612,7 @@ settings.remove_protected_branch_success = Branchbescherming voor regel "%s" is
settings.remove_protected_branch_failed = Verwijderen van branchbeschermings regel "%s" is mislukt.
settings.merge_style_desc = Samenvoegstijl
settings.thread_id = Thread ID
-settings.archive.mirrors_unavailable = Mirrors zijn niet beschikbaar als de repo is gearchiveerd.
+settings.archive.mirrors_unavailable = Mirrors zijn niet beschikbaar in gearchiveerde repo's.
settings.unarchive.header = Deze repo uit het archief halen
settings.unarchive.text = Het uit het archief halen van de repo zal het vermogen herstellen om commits en pushes te ontvangen, evenals nieuwe issues en pull requests.
settings.unarchive.error = Er is een fout opgetreden bij het uit het archief halen van de repo. Bekijk de logs voor meer details.
@@ -2846,6 +2848,21 @@ diff.git-notes.remove-body = Deze notitie zal worden verwijderd.
issues.summary_card_alt = Overzichtskaart van een issue met de titel "%s" in repository %s
issues.num_reviews_one = %d beoordeling
issues.num_reviews_few = %d beoordelingen
+settings.default_update_style_desc = Standaard update stijl gebruikt voor het updaten van pull requests die achter de basis branch liggen.
+pulls.sign_in_require = Aanmelden om een nieuwe pull request aan te maken.
+new_advanced = Geavanceerde instellingen
+new_advanced_expand = Klik om uit te breiden
+new_from_template_description = Je kunt een bestaand repositorysjabloon op deze instantie selecteren en de instellingen toepassen.
+new_from_template = Een sjabloon gebruiken
+auto_init_description = De Git geschiedenis starten met een README en optioneel License en .gitignore bestanden toevoegen.
+issues.reaction.add = Reactie toevoegen
+issues.reaction.alt_few = %[1]s reageerde %[2]s.
+issues.reaction.alt_add = Voeg %[1]s reactie toe aan commentaar.
+issues.context.menu = Commentaar menu
+summary_card_alt = Overzichtskaart van repository %s
+release.summary_card_alt = Samenvattende kaart van een release met de titel "%s" in repository %s
+issues.reaction.alt_remove = Verwijder %[1]s reactie van bericht.
+issues.reaction.alt_many = %[1]s en %[2]d meer gereageerd %[3]s.
@@ -3541,6 +3558,7 @@ emails.delete_desc = Weet u zeker dat u deze e-mailadres wilt verwijderen?
emails.delete_primary_email_error = U kunt de primaire e-mail niet verwijderen.
emails.delete = E-mail verwijderen
emails.deletion_success = Het e-mailadres is verwijderd.
+monitor.duration = Duur (s)
[action]
@@ -3666,16 +3684,16 @@ cargo.install = Voer de volgende opdracht uit om het pakket met Cargo te install
chef.install = Voer het volgende commando uit om het pakket te installeren:
composer.registry = Stel dit register in je ~/.composer/config.json
bestand:
composer.dependencies = Afhankelijkheden
-composer.dependencies.development = Ontwikkelings Afhankelijkheden
+composer.dependencies.development = Ontwikkelings afhankelijkheden
conan.registry = Stel dit register in vanaf de terminal:
conan.install = Voer het volgende commando uit om het pakket met Conan te installeren:
conda.registry = Stel dit register in als een Conda repository in je .condarc
bestand:
-container.details.type = Afbeelding Type
+container.details.type = Afbeelding type
container.details.platform = Platform
container.pull = Haal de afbeelding op vanaf de terminal:
container.digest = Digest
container.multi_arch = Besturingssysteem / Arch
-container.layers = Afbeelding Lagen
+container.layers = Afbeelding lagen
container.labels = Labels
container.labels.key = Sleutel
debian.repository = Repository informatie
@@ -3697,7 +3715,7 @@ rpm.repository.architectures = Architecturen
rpm.repository.multiple_groups = Dit pakket is beschikbaar in meerdere groepen.
rubygems.install = Voer het volgende commando uit om het pakket met gem te installeren:
rubygems.install2 = of voeg het toe aan het Gemfile:
-rubygems.dependencies.development = Ontwikkelings Dependencies
+rubygems.dependencies.development = Ontwikkelings dependencies
swift.registry = Stel dit register in vanaf de terminal:
swift.install = Voeg het pakket toe in je Package.swift
bestand:
swift.install2 = en voer het volgende commando uit:
@@ -3715,7 +3733,7 @@ nuget.install = Voer het volgende commando uit om het pakket met NuGet te instal
npm.install = Voer het volgende commando uit om het pakket met npm te installeren:
npm.install2 = of voeg het toe aan het package.json bestand:
npm.dependencies = Afhankelijkheden
-npm.dependencies.development = Ontwikkelings Afhankelijkheden
+npm.dependencies.development = Ontwikkelings afhankelijkheden
npm.dependencies.peer = Peer afhankelijkheden
npm.dependencies.optional = Optionele afhankelijkheden
owner.settings.cargo.title = Cargo register index
@@ -3737,7 +3755,7 @@ owner.settings.cleanuprules.keep.count = Bewaar de meest recente
owner.settings.cleanuprules.keep.count.1 = 1 versie per pakket
owner.settings.cleanuprules.keep.count.n = %d versies per pakket
pub.install = Voer het volgende commando uit om het pakket met Dart te installeren:
-rubygems.dependencies.runtime = Runtime Dependencies
+rubygems.dependencies.runtime = Runtime dependencies
settings.delete.error = Het verwijderen van het pakket is mislukt.
alpine.registry = Stel dit register in door de url toe te voegen aan je /etc/apk/repositories
bestand:
maven.registry = Stel dit register in het pom.xml
bestand van je project:
@@ -3802,6 +3820,14 @@ arch.version.replaces = Vervangt
arch.version.backup = Back-up
arch.version.makedepends = Maken is afhankelijk van
container.images.title = Afbeeldingen
+search_in_external_registry = Zoeken in %s
+alt.registry.install = Voer het volgende commando uit om het pakket te installeren:
+alt.repository = Repository info
+alt.repository.architectures = Architecturen
+alt.repository.multiple_groups = Dit pakket is beschikbaar in meerdere groepen.
+alt.registry = Stel dit register in vanaf de opdrachtregel:
+alt.install = Pakket installeren
+alt.setup = Voeg een repository toe aan de lijst met gekoppelde repositories (kies de benodigde architectuur in plaats van '_arch_'):
[secrets]
secrets = Geheimen
diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini
index ef20124ec9..7192f6a366 100644
--- a/options/locale/locale_pl-PL.ini
+++ b/options/locale/locale_pl-PL.ini
@@ -166,6 +166,7 @@ new_repo.link = Nowe repozytorium
new_migrate.link = Nowa migracja
new_org.link = Nowa organizacja
filter.not_fork = Nie forki
+copy_path = Skopiuj ścieżkę
[aria]
navbar = Pasek nawigacji
@@ -254,7 +255,7 @@ err_empty_db_path=Ścieżka do bazy danych SQLite3 nie może być pusta.
no_admin_and_disable_registration=Nie możesz wyłączyć możliwości samodzielnej rejestracji kont użytkowników bez stworzenia konta administratora.
err_empty_admin_password=Hasło administratora nie może być puste.
err_empty_admin_email=Pole adresu e-mail administratora nie może być puste.
-err_admin_name_is_reserved=Nazwa użytkownika administratora jest nieprawidłowa, pseudonim jest zastrzeżony
+err_admin_name_is_reserved=Nazwa użytkownika administratora jest nieprawidłowa, pseudonim jest zarezerwowany
err_admin_name_pattern_not_allowed=Nazwa użytkownika administratora jest nieprawidłowa, pseudonim zawiera zastrzeżone znaki
err_admin_name_is_invalid=Nazwa użytkownika administratora jest nieprawidłowa
@@ -477,6 +478,7 @@ sign_in_openid = Kontynuuj z OpenID
hint_login = Masz już konto? Zaloguj się teraz!
sign_up_button = Zarejestruj się.
use_onetime_code = Użyj kodu jednorazowego
+unauthorized_credentials = Dane uwierzytelniające są nieprawidłowe lub wygasły. Spróbuj ponownie wykonać polecenie lub zobacz %s, aby uzyskać więcej informacji
[mail]
view_it_on=Zobacz na %s
diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini
index 2a6aea6b60..f6cf73620c 100644
--- a/options/locale/locale_pt-BR.ini
+++ b/options/locale/locale_pt-BR.ini
@@ -748,7 +748,7 @@ webauthn=Chaves de segurança
public_profile=Perfil público
biography_placeholder=Conte um pouco sobre você! (Markdown é suportado)
location_placeholder=Compartilhe sua localização aproximada com outras pessoas
-profile_desc=Controle como o seu perfil é exibido para outros usuários. Seu endereço de e-mail principal será usado para notificações, recuperação de senha e operações do Git baseadas na Web.
+profile_desc=Sobre você
password_username_disabled=Usuários não-locais não podem alterar seus nomes de usuário. Por favor contate o administrador do site para mais informações.
full_name=Nome completo
website=Site
@@ -813,7 +813,7 @@ manage_emails=Gerenciar endereços de e-mail
manage_themes=Tema padrão
manage_openid=Endereços OpenID
email_desc=Seu endereço de e-mail principal será usado para notificações, recuperação de senha e, desde que não esteja oculto, para operações do Git baseadas na Web.
-theme_desc=Este será o seu tema padrão em todo o site.
+theme_desc=Este tema será usado para a interface web quando você fizer login.
primary=Principal
activated=Ativado
requires_activation=Requer ativação
@@ -839,7 +839,7 @@ add_email_success=O novo endereço de e-mail foi adicionado.
email_preference_set_success=Preferência de e-mail definida com sucesso.
add_openid_success=O novo endereço de OpenID foi adicionado.
keep_email_private=Ocultar endereço de e-mail
-keep_email_private_popup=Isso ocultará seu endereço de e-mail do seu perfil. Ele não será mais o padrão para commits feitos pela interface web, como envios de arquivos e modificações, e não será usado para commits de merge. Em vez disso, um endereço especial %s pode ser usado para associar commits com a sua conta. Note que modificar esta opção não irá afetar commits já existentes.
+keep_email_private_popup=Seu endereço de email não será exibido no seu perfil e não será o padrão para commits feitos pela interface web, como envios de arquivos, modificações e commits de merge. Em vez disso, um endereço especial %s pode ser usado para associar commits com a sua conta. Esta opção não irá afetar commits já existentes.
openid_desc=OpenID permite delegar autenticação para um provedor externo.
manage_ssh_keys=Gerenciar chaves SSH
@@ -1055,6 +1055,8 @@ update_hints_success = As dicas foram atualizadas.
keep_activity_private.description = A sua atividade pública estará visível apenas para si e para os administradores do servidor.
language.localization_project = Ajude-nos a traduzir Forgejo para o seu idioma! Mais informações .
language.description = Essa língua será salva em sua conta e será usada como padrão após você iniciar a sessão.
+user_block_yourself = Você não pode se bloquear.
+pronouns_custom_label = Pronomes personalizados
[repo]
owner=Proprietário
@@ -1094,11 +1096,11 @@ issue_labels=Etiquetas
issue_labels_helper=Selecione um conjunto de etiquetas
license=Licença
license_helper=Selecione um arquivo de licença
-license_helper_desc=Uma licença define o que os outros podem e não podem fazer com o seu código. Não tem certeza qual é a mais adequada para o seu projeto? Veja Escolher uma licença.
+license_helper_desc=Uma licença define o que os outros podem e não podem fazer com o seu código. Não tem certeza qual é a mais adequada para o seu projeto? Veja Escolher uma licença .
readme=LEIA-ME
readme_helper=Selecione um modelo de arquivo README
readme_helper_desc=Aqui você pode escrever uma descrição completa para o seu projeto.
-auto_init=Inicializar o repositório (Adiciona arquivos .gitignore, licença e README)
+auto_init=Inicializar repositório
trust_model_helper=Selecione o modelo de confiança para verificação de assinatura. As opções possíveis são:
trust_model_helper_collaborator=Colaborador: Confiar em assinaturas de colaboradores
trust_model_helper_committer=Committer: Confiar em assinaturas que correspondem aos committers
@@ -1171,8 +1173,8 @@ template.invalid=Deve-se selecionar um repositório de modelo
archive.title=Este repositório está arquivado. Você pode visualizar arquivos e cloná-lo, mas não pode fazer push, abrir issues ou pull requests.
archive.title_date=Este repositório foi arquivado em %s. Você pode visualizar arquivos e cloná-lo, mas não pode fazer push, abrir issues ou pull requests.
-archive.issue.nocomment=Este repositório está arquivado. Você não pode comentar nas issues.
-archive.pull.nocomment=Este repositório está arquivado. Você não pode comentar nos pull requests.
+archive.issue.nocomment=Este repositório está arquivado. Você não pode comentar em issues.
+archive.pull.nocomment=Este repositório está arquivado. Você não pode comentar em pull requests.
form.reach_limit_of_creation_1=Você já atingiu o seu limite de %d repositório.
form.reach_limit_of_creation_n=Você já atingiu o limite de %d repositórios.
@@ -2440,8 +2442,8 @@ settings.archive.header=Arquivar este repositório
settings.archive.success=O repositório foi arquivado com sucesso.
settings.archive.error=Um erro ocorreu enquanto estava sendo arquivado o repositório. Veja o log para mais detalhes.
settings.archive.error_ismirror=Você não pode arquivar um repositório espelhado.
-settings.archive.branchsettings_unavailable=Configurações do branch não estão disponíveis quando o repositório está arquivado.
-settings.archive.tagsettings_unavailable=As configurações de tag não estão disponíveis se o repositório estiver arquivado.
+settings.archive.branchsettings_unavailable=Configurações de branch não estão disponíveis em repositórios arquivados.
+settings.archive.tagsettings_unavailable=Configurações de tag não estão disponíveis em repositórios arquivados.
settings.update_avatar_success=O avatar do repositório foi atualizado.
settings.lfs=LFS
settings.lfs_filelist=Arquivos LFS armazenados neste repositório
@@ -2641,7 +2643,7 @@ settings.unarchive.success = O repositório foi desarquivado.
settings.unarchive.button = Desarquivar repositório
settings.unarchive.header = Desarquivar este repositório
diff.comment.add_line_comment = Adicionar comentário na linha
-new_repo_helper = Um repositório contém todos os arquivos de projeto, incluindo o histórico de revisões. Já hospeda um repositório em outra plataforma? Migrar repositório
+new_repo_helper = Um repositório contém todos os arquivos de projeto, incluindo o histórico de revisões. Já hospeda um repositório em outra plataforma? Migrar repositório .
blame.ignore_revs.failed = Falha ao ignorar as revisões em .git-blame-ignore-revs .
migrate.forgejo.description = Migrar dados do codeberg.org ou outras servidores Forgejo.
commits.browse_further = Ver mais
@@ -2726,7 +2728,7 @@ comments.edit.already_changed = Falha ao salvar as alterações ao comentário.
activity.navbar.code_frequency = Frequência de código
settings.protect_status_check_matched = Correspondente
branch.tag_collision = O ramo "%s" não pode ser criado porque já existe uma etiqueta com o mesmo nome no repositório.
-settings.archive.mirrors_unavailable = As réplicas ficarão indisponíveis se o repositório estiver arquivado.
+settings.archive.mirrors_unavailable = Réplicas não estão disponíveis em repositórios arquivados.
release.download_count_one = %s download
settings.mirror_settings.docs.no_new_mirrors = O seu repositório está replicando alterações de ou para outro repositório. Observe que não é possível criar novas réplicas no momento.
settings.mirror_settings.docs.pull_mirror_instructions = Para configurar uma réplica de outro repositório, consulte:
@@ -2847,6 +2849,21 @@ diff.git-notes.remove-body = Esta anotação será removida.
issues.num_reviews_one = %d revisão
issues.summary_card_alt = Cartão de resumo de um issue com o título "%s" no repositório %s
issues.num_reviews_few = %d revisões
+settings.default_update_style_desc = Estilo padrão de atualização usado para atualizar pull requests que estão atrasados em relação ao branch base.
+pulls.sign_in_require = Entre para criar um novo pull request.
+new_from_template = Use um modelo
+new_from_template_description = Você pode selecionar um modelo de repositório nesta instância e aplicar suas configurações.
+new_advanced = Configurações avançadas
+new_advanced_expand = Clique para expandir
+auto_init_description = Inicializar o histórico do Git com um README e opcionalmente adicionar arquivos License e .gitignore.
+issues.reaction.alt_remove = Remover reação %[1]s deste comentário.
+issues.reaction.alt_add = Adicionar reação %[1]s ao comentário.
+issues.context.menu = Menu de comentário
+issues.reaction.add = Adicionar reação
+issues.reaction.alt_few = %[1]s reagiu com %[2]s.
+issues.reaction.alt_many = %[1]s e mais %[2]d reagiram com %[3]s.
+summary_card_alt = Cartão de resumo do repositório %s
+release.summary_card_alt = Cartão de resumo de um release intitulado "%s" no repositório %s
[graphs]
component_loading = Carregando %s...
@@ -3540,6 +3557,7 @@ users.restricted.description = Permitir interação somente com os repositórios
users.organization_creation.description = Permitir a criação de novas organizações.
users.local_import.description = Permitir importar repositórios do sistema de arquivos local do servidor. Isso pode ser um problema de segurança.
self_check.database_collation_case_insensitive = O banco de dados está usando um ordenamento %s, que é um ordenamento insensível. Embora o Forgejo possa funcionar com ele, pode haver alguns casos raros que não funcionam como esperado.
+monitor.duration = Duração (s)
[action]
@@ -3675,18 +3693,18 @@ chef.install=Para instalar o pacote, execute o seguinte comando:
composer.registry=Configure este registro em seu arquivo ~/.composer/config.json
:
composer.install=Para instalar o pacote usando o Composer, execute o seguinte comando:
composer.dependencies=Dependências
-composer.dependencies.development=Dependências de Desenvolvimento
+composer.dependencies.development=Dependências de desenvolvimento
conan.details.repository=Repositório
conan.registry=Configure este registro pela linha de comando:
conan.install=Para instalar o pacote usando o Conan, execute o seguinte comando:
conda.registry=Configure este registro como um repositório Conda no arquivo .condarc
:
conda.install=Para instalar o pacote usando o Conda, execute o seguinte comando:
-container.details.type=Tipo de Imagem
+container.details.type=Tipo de imagem
container.details.platform=Plataforma
container.pull=Puxe a imagem pela linha de comando:
container.digest=Digest
container.multi_arch=S.O. / Arquitetura
-container.layers=Camadas da Imagem
+container.layers=Camadas da imagem
container.labels=Rótulos
container.labels.key=Chave
container.labels.value=Valor
@@ -3714,9 +3732,9 @@ npm.registry=Configure este registro no arquivo .npmrc
do seu proje
npm.install=Para instalar o pacote usando o npm, execute o seguinte comando:
npm.install2=ou adicione-o ao arquivo package.json:
npm.dependencies=Dependências
-npm.dependencies.development=Dependências de Desenvolvimento
-npm.dependencies.peer=Dependências Peer
-npm.dependencies.optional=Dependências Opcionais
+npm.dependencies.development=Dependências de desenvolvimento
+npm.dependencies.peer=Dependências peer
+npm.dependencies.optional=Dependências opcionais
npm.details.tag=Tag
pub.install=Para instalar o pacote usando Dart, execute o seguinte comando:
pypi.requires=Requer Python
@@ -3729,8 +3747,8 @@ rpm.repository = Informações do repositório
rpm.repository.architectures = Arquiteturas
rubygems.install=Para instalar o pacote usando gem, execute o seguinte comando:
rubygems.install2=ou adicione-o ao Gemfile:
-rubygems.dependencies.runtime=Dependências de Execução
-rubygems.dependencies.development=Dependências de Desenvolvimento
+rubygems.dependencies.runtime=Dependências de tempo de execução
+rubygems.dependencies.development=Dependências de desenvolvimento
rubygems.required.ruby=Requer o Ruby versão
rubygems.required.rubygems=Requer o RubyGem versão
swift.registry=Configure este registro pela linha de comando:
@@ -3777,11 +3795,11 @@ owner.settings.cleanuprules.success.delete=Regra de limpeza foi excluída.
owner.settings.chef.title=Registro Chef
owner.settings.chef.keypair=Gerar par de chaves
rpm.repository.multiple_groups = Este pacote está disponível em vários grupos.
-npm.dependencies.bundle = Dependências empacotadas
+npm.dependencies.bundle = Dependências em bundle
registry.documentation = Para mais informações sobre o registro %s, veja a documentação .
arch.version.replaces = Substitui
arch.version.conflicts = Conflitos
-arch.version.properties = Propriedades de Versão
+arch.version.properties = Propriedades da versão
arch.version.description = Descrição
arch.version.groups = Grupo
arch.version.provides = Fornece
@@ -3801,6 +3819,7 @@ arch.version.checkdepends = Verificar dependências
owner.settings.cargo.initialize.description = É necessário um repositório Git especial de índice para usar o registro Cargo. Usar esta opção irá (re-)criar o repositório e configurá-lo automaticamente.
owner.settings.chef.keypair.description = É necessário um par de chaves para autenticar no registro Chef. Se você já gerou um par de chaves, gere um novo par e descarte o antigo.
container.images.title = Imagens
+search_in_external_registry = Buscar em %s
[secrets]
secrets=Segredos
diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini
index 5e07cfb43e..ca1199dd54 100644
--- a/options/locale/locale_pt-PT.ini
+++ b/options/locale/locale_pt-PT.ini
@@ -142,7 +142,7 @@ confirm_delete_selected=Confirma a exclusão de todos os itens marcados?
name=Nome
value=Valor
-filter.is_fork = Derivações
+filter.is_fork = Derivado
filter.is_mirror = Réplicas
filter.is_template = Modelos
filter.public = Público
@@ -156,7 +156,7 @@ filter.clear = Retirar filtros
filter.is_archived = Arquivado
filter.not_template = Não modelos
toggle_menu = Comutar menu
-filter = Filtro
+filter = Filtrar
copy_generic = Copiar para a área de transferência
test = Teste
error413 = Você esgotou a sua quota.
@@ -166,6 +166,7 @@ new_org.title = Nova organização
new_repo.link = Novo repositório
new_migrate.link = Nova migração
new_org.link = Nova organização
+copy_path = Copiar caminho
[aria]
navbar=Barra de navegação
@@ -212,7 +213,7 @@ string.desc=Z - A
[error]
occurred=Ocorreu um erro
-report_message=Se acredita de que se trata de um erro do Forgejo, procure, por favor, questões relacionadas no GitHub ou abra uma nova questão, se necessário.
+report_message=Se acredita de que se trata de um erro do Forgejo, procure, por favor, questões relacionadas no Codeberg ou abra uma nova questão, se necessário.
missing_csrf=Pedido inválido: não há código CSRF
invalid_csrf=Pedido inválido: código CSRF inválido
not_found=Não foi possível encontrar o destino.
@@ -747,7 +748,7 @@ webauthn=Autenticação em dois passos (chaves de segurança)
public_profile=Perfil público
biography_placeholder=Diga aos outros um pouco sobre si! (Markdown é suportado)
location_placeholder=Partilhe a sua localização aproximada com outros
-profile_desc=Controle como o seu perfil é apresentado aos outros utilizadores. O seu endereço de email principal será usado para notificações, recuperação de senha e operações Git baseadas na web.
+profile_desc=Sobre si
password_username_disabled=Utilizadores não-locais não podem mudar os seus nomes de utilizador. Entre em contacto com o administrador do sítio saber para mais detalhes.
full_name=Nome completo
website=Sítio web
@@ -812,7 +813,7 @@ manage_emails=Gerir endereços de email
manage_themes=Tema padrão
manage_openid=Endereços OpenID
email_desc=O seu endereço de email principal irá ser usado para notificações, recuperação de senha e, desde que não esteja oculto, operações Git baseados na web.
-theme_desc=Este será o seu tema padrão em todo o sítio.
+theme_desc=Este tema será usado para a interface web quando tiver sessão iniciada.
primary=Principal
activated=Em uso
requires_activation=Tem que ser habilitado
@@ -838,7 +839,7 @@ add_email_success=O novo endereço de email foi adicionado.
email_preference_set_success=As preferências relativas ao email foram definidas com sucesso.
add_openid_success=O novo endereço OpenID foi adicionado.
keep_email_private=Ocultar endereço de email
-keep_email_private_popup=Isto irá ocultar o seu endereço de email no seu perfil. Não será mais o predefinido nos cometimentos feitos através da interface web, tais como carregamentos de ficheiros e edições, e não será usado para cometimentos de integração. Ao invés disso, um endereço especial %s poderá ser usado para associar cometimentos à sua conta. Note que mudar esta opção não irá alterar os cometimentos existentes.
+keep_email_private_popup=O seu endereço de e-mail não será mostrado no seu perfil e não será o predefinido para cometimentos feitos através da interface web, tais como upload de arquivos, edições e cometimentos de integração. Ao invés disso, um endereço especial %s poderá ser usado para vincular cometimentos à sua conta. Esta opção não irá alterar os cometimentos existentes.
openid_desc=O OpenID permite delegar a autenticação num fornecedor externo.
manage_ssh_keys=Gerir chaves SSH
@@ -1054,6 +1055,8 @@ language.title = Idioma predefinido
keep_activity_private.description = O seu trabalho público apenas estará visível para si e para os administradores da instância.
language.description = Este idioma vai ser guardado na sua conta e ser usado como o predefinido depois de iniciar sessão.
language.localization_project = Ajude-nos a traduzir o Forgejo para o seu idioma! Saiba mais .
+pronouns_custom_label = Pronomes personalizados
+user_block_yourself = Não se pode bloquear a si próprio.
[repo]
new_repo_helper=Um repositório contém todos os ficheiros do trabalho, incluindo o histórico das revisões. Já tem um hospedado noutro sítio? Migre o repositório .
@@ -1096,13 +1099,13 @@ issue_labels=Rótulos
issue_labels_helper=Escolha um conjunto de rótulos
license=Licença
license_helper=Escolha um ficheiro de licença
-license_helper_desc=Uma licença rege o que os outros podem, ou não, fazer com o seu código fonte. Não tem a certeza sobre qual a mais indicada para o seu trabalho? Veja: Escolher uma licença.
+license_helper_desc=Uma licença rege o que os outros podem, ou não, fazer com o seu código fonte. Não tem a certeza sobre qual a mais indicada para o seu trabalho? Veja: Escolher uma licença .
object_format=Formato dos elementos
object_format_helper=Formato dos elementos do repositório. Não poderá ser alterado mais tarde. SHA1 é o mais compatível.
readme=README
readme_helper=Escolha um modelo de ficheiro README
readme_helper_desc=Este é o sítio onde pode escrever uma descrição completa do seu trabalho.
-auto_init=Inicializar repositório (adiciona `.gitignore`, `LICENSE` e `README.md`)
+auto_init=Inicializar repositório
trust_model_helper=Escolha o modelo de confiança para a validação das assinaturas. As opções são:
trust_model_helper_collaborator=Colaborador: Confiar nas assinaturas dos colaboradores
trust_model_helper_committer=Autor do cometimento: Confiar nas assinaturas que correspondem a autores de cometimentos
@@ -1180,7 +1183,7 @@ template.issue_labels=Rótulos das questões
template.one_item=Tem que escolher pelo menos um item do modelo
template.invalid=Tem que escolher um repositório modelo
-archive.title=Este repositório está arquivado. Pode ver os seus ficheiros e cloná-lo, mas não pode fazer envios para o repositório nem lançar questões ou fazer pedidos de integração.
+archive.title=Este repositório está arquivado. Pode ver os ficheiros e cloná-lo, mas não pode fazer envios ou abrir questões ou pedidos de integração.
archive.title_date=Este repositório foi arquivado em %s. Pode ver os ficheiros e cloná-lo, mas não pode fazer envios ou abrir questões/pedidos de integração.
archive.issue.nocomment=Este repositório está arquivado. Não pode comentar nas questões.
archive.pull.nocomment=Este repositório está arquivado. Não pode comentar nos pedidos de integração.
@@ -2514,9 +2517,9 @@ settings.archive.text=Arquivar o repositório irá torná-lo apenas de leitura.
settings.archive.success=O repositório foi arquivado com sucesso.
settings.archive.error=Ocorreu um erro enquanto decorria o processo de arquivo do repositório. Veja os registo para obter mais detalhes.
settings.archive.error_ismirror=Não pode arquivar um repositório que tenha sido replicado.
-settings.archive.branchsettings_unavailable=As configurações dos ramos não estão disponíveis quando o repositório está arquivado.
-settings.archive.tagsettings_unavailable=As configurações sobre etiquetas não estão disponíveis quando o repositório está arquivado.
-settings.archive.mirrors_unavailable=As réplicas não estão disponíveis se o repositório estiver arquivado.
+settings.archive.branchsettings_unavailable=As configurações dos ramos não estão disponíveis em repositórios arquivados.
+settings.archive.tagsettings_unavailable=As configurações sobre etiquetas não estão disponíveis em repositórios arquivados.
+settings.archive.mirrors_unavailable=As réplicas não estão disponíveis em repositórios arquivados.
settings.unarchive.button=Desarquivar repositório
settings.unarchive.header=Desarquivar este repositório
settings.unarchive.text=Desarquivar o repositório irá restaurar a capacidade de receber cometimentos e envios, assim como novas questões e pedidos de integração.
@@ -2828,7 +2831,7 @@ mirror_use_ssh.text = Utilizar a autenticação SSH
mirror_denied_combination = Não é possível usar a autenticação baseada em chave pública e senha em combinação.
settings.mirror_settings.push_mirror.copy_public_key = Copiar chave pública
settings.mirror_settings.push_mirror.none_ssh = Nenhuma
-settings.protect_new_rule = Criar uma nova regra de salvaguarda do ramo
+settings.protect_new_rule = Criar uma nova regra de proteção de ramo
mirror_use_ssh.helper = O Forgejo irá replicar o repositório via Git sobre SSH e criar um par de chaves para si quando escolher esta opção. Tem que se certificar que a chave pública gerada está autorizada a enviar para o repositório de destino. Não pode usar a autorização baseada numa senha quando escolher isto.
mirror_use_ssh.not_available = A autenticação por SSH não está disponível.
issues.new.assign_to_me = Atribuir a mim
@@ -2844,9 +2847,25 @@ issues.review.add_remove_review_requests = pedidos de revisão de %[1]s e pedido
pulls.delete_after_merge.head_branch.is_default = O ramo de topo que pretende eliminar é o ramo predefinido e não pode ser eliminado.
pulls.delete_after_merge.head_branch.is_protected = O ramo de topo que pretende eliminar é um ramo protegido e não pode ser eliminado.
pulls.delete_after_merge.head_branch.insufficient_branch = Não tem permissão para eliminar o ramo de topo.
-issues.summary_card_alt = Sumário de uma questão com o título "%s" no repositório %s
+issues.summary_card_alt = Cartão de resumo de uma questão com o título "%s" no repositório %s
issues.num_reviews_one = %d revisão
issues.num_reviews_few = %d revisões
+editor.add_tmpl.filename = nome do ficheiro
+new_from_template = Utilize um template
+settings.default_update_style_desc = Estilo de atualização predefinido utilizado para atualizar pedidos de integração que estão atrasados em relação ao ramo base.
+pulls.sign_in_require = Inicie sessão para criar um novo pedido de integração.
+new_advanced = Configurações avançadas
+new_advanced_expand = Clique para expandir
+new_from_template_description = Pode selecionar um modelo de repositório existente nesta instância e aplicar as suas definições.
+auto_init_description = Iniciar o histórico do Git com um README e, opcionalmente, adicione os ficheiros License e .gitignore.
+issues.reaction.add = Adicionar reação
+issues.reaction.alt_few = %[1]s reagiu com %[2]s.
+issues.reaction.alt_many = %[1]s e mais %[2]d reagiram com %[3]s.
+issues.reaction.alt_remove = Remover reação %[1]s deste comentário.
+issues.reaction.alt_add = Adicionar reação %[1]s ao comentário.
+issues.context.menu = Menu de comentário
+summary_card_alt = Cartão de resumo do repositório %s
+release.summary_card_alt = Cartão de resumo de um lançamento com o título "%s" no repositório %s
[graphs]
component_loading=A carregar %s...
@@ -3167,8 +3186,8 @@ orgs.members=Membros
orgs.new_orga=Nova organização
repos.repo_manage_panel=Gerir repositórios
-repos.unadopted=Repositórios não adoptados
-repos.unadopted.no_more=Não foram encontrados mais repositórios não adoptados
+repos.unadopted=Repositórios não adotados
+repos.unadopted.no_more=Não foram encontrados repositórios não adotados.
repos.owner=Proprietário(a)
repos.name=Nome
repos.private=Privado
@@ -3275,9 +3294,9 @@ auths.oauth2_required_claim_name_helper=Defina este nome para restringir o iníc
auths.oauth2_required_claim_value=Valor de reivindicação obrigatório
auths.oauth2_required_claim_value_helper=Defina este valor para restringir o início de sessão desta fonte a utilizadores que tenham uma reivindicação com este nome e este valor
auths.oauth2_group_claim_name=Reivindicar nome que fornece nomes de grupo para esta fonte. (Opcional)
-auths.oauth2_admin_group=Valor da reivindicação de grupo para utilizadores administradores (opcional — exige a reivindicação de nome acima).
-auths.oauth2_restricted_group=Valor da reivindicação de grupo para utilizadores restritos (opcional — exige a reivindicação de nome acima).
-auths.oauth2_map_group_to_team=Mapear grupos reclamados em equipas da organização (opcional — requer nome de reclamação acima).
+auths.oauth2_admin_group=Valor da reivindicação de grupo para utilizadores administradores. (Opcional — exige a reivindicação de nome acima)
+auths.oauth2_restricted_group=Valor da reivindicação de grupo para utilizadores restritos. (Opcional — exige a reivindicação de nome acima)
+auths.oauth2_map_group_to_team=Mapear grupos reclamados em equipas da organização. (Opcional — requer nome de reclamação acima)
auths.oauth2_map_group_to_team_removal=Remover utilizadores das equipas sincronizadas se esses utilizadores não pertencerem ao grupo correspondente.
auths.enable_auto_register=Habilitar o registo automático
auths.sspi_auto_create_users=Criar utilizadores automaticamente
@@ -3540,6 +3559,7 @@ emails.delete = Eliminar email
emails.deletion_success = O endereço de email foi eliminado.
emails.delete_primary_email_error = Não pode eliminar o endereço de email principal.
emails.delete_desc = Tem a certeza que quer eliminar este endereço de email?
+monitor.duration = Duração (s)
[action]
create_repo=criou o repositório %s
@@ -3664,7 +3684,7 @@ alpine.registry=Configure este registo adicionando o URL no seu ficheiro /
alpine.registry.key=Descarregue a chave RSA pública do registo para dentro da pasta /etc/apk/keys/
para verificar a assinatura do índice:
alpine.registry.info=Escolha $branch e $repository da lista abaixo.
alpine.install=Para instalar o pacote, execute o seguinte comando:
-alpine.repository=Informação do repositório
+alpine.repository=Informações do repositório
alpine.repository.branches=Ramos
alpine.repository.repositories=Repositórios
alpine.repository.architectures=Arquitecturas
@@ -3684,9 +3704,9 @@ conda.install=Para instalar o pacote usando o Conda, execute o seguinte comando:
container.details.type=Tipo de imagem
container.details.platform=Plataforma
container.pull=Puxar a imagem usando a linha de comandos:
-container.digest=Resumo:
+container.digest=Resumo
container.multi_arch=S.O. / Arquit.
-container.layers=Camadas de imagem
+container.layers=Camadas da imagem
container.labels=Rótulos
container.labels.key=Chave
container.labels.value=Valor
@@ -3695,7 +3715,7 @@ cran.install=Para instalar o pacote, execute o seguinte comando:
debian.registry=Configurar este registo usando a linha de comandos:
debian.registry.info=Escolha $distribution e $component da lista abaixo.
debian.install=Para instalar o pacote, execute o seguinte comando:
-debian.repository=Informação do repositório
+debian.repository=Informações do repositório
debian.repository.distributions=Distribuições
debian.repository.components=Componentes
debian.repository.architectures=Arquitecturas
@@ -3725,12 +3745,12 @@ rpm.registry=Configurar este registo usando a linha de comandos:
rpm.distros.redhat=em distribuições baseadas no RedHat
rpm.distros.suse=em distribuições baseadas no SUSE
rpm.install=Para instalar o pacote, execute o seguinte comando:
-rpm.repository=Informação do repositório
+rpm.repository=Informações do repositório
rpm.repository.architectures=Arquitecturas
rpm.repository.multiple_groups=Este pacote está disponível em vários grupos.
rubygems.install=Para instalar o pacote usando o gem, execute o seguinte comando:
rubygems.install2=ou adicione-o ao ficheiro Gemfile
:
-rubygems.dependencies.runtime=Dependências do tempo de execução (runtime)
+rubygems.dependencies.runtime=Dependências em tempo de execução
rubygems.dependencies.development=Dependências de desenvolvimento
rubygems.required.ruby=Requer a versão do Ruby
rubygems.required.rubygems=Requer a versão do RubyGem
@@ -3791,7 +3811,7 @@ arch.version.provides = Fornece
arch.pacman.helper.gpg = Adicionar certificado de confiança para o pacman:
arch.pacman.conf = Adicionar servidor com distribuição e arquitectura relacionadas a /etc/pacman.conf
:
arch.pacman.repo.multi = %s tem a mesma versão em distribuições diferentes.
-arch.version.optdepends = Dependências opcionais
+arch.version.optdepends = Depende opcionalmente
arch.version.depends = Depende de
arch.version.makedepends = Dependências do make
arch.version.groups = Grupo
@@ -3799,6 +3819,8 @@ arch.version.checkdepends = Verificar dependências
arch.version.conflicts = Conflitos
arch.version.backup = Cópia de segurança
arch.version.replaces = Substitui
+container.images.title = Imagens
+search_in_external_registry = Procurar em %s
[secrets]
secrets=Segredos
@@ -3991,8 +4013,8 @@ projects.read = Ler: Aceder aos quadros de planeamento do repositório.
projects.write = Escrever: Criar planeamentos e colunas e editá-las.
packages.read = Ler: Ver e descarregar pacotes atribuídos ao repositório.
packages.write = Escrever: Publicar e eliminar pacotes atribuídos ao repositório.
-actions.read = Ler: Ver canais CI/CD integrados e os seus registos.
-actions.write = Escrever: Despoletar, reiniciar, cancelar ou aprovar manualmente canais CI/CD pendentes.
+actions.read = Ler: Ver sequências CI/CD integrados e os seus registos.
+actions.write = Escrever: Despoletar, reiniciar, cancelar ou aprovar manualmente sequências CI/CD pendentes.
ext_issues = Aceder à ligação para um rastreador de questões externo. As permissões são geridas externamente.
ext_wiki = Aceder à ligação para um wiki externo. As permissões são geridas externamente.
issues.write = Escrever: Fechar questões e gerir metadados, tais como rótulos, etapas, encarregados, datas de vencimento e dependências.
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index 9fec174ec5..5ed8dae67b 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -234,7 +234,7 @@ license_desc=Всё это на документацией , прежде чем изменять любые настройки.
+docker_helper=Если вы запускаете Forgejo под Docker, прежде чем изменять любые настройки, пожалуйста, ознакомьтесь с документацией .
require_db_desc=Forgejo требуется MySQL, PostgreSQL, SQLite3 или TiDB (по протоколу MySQL).
db_title=Настройки базы данных
db_type=Тип базы данных
@@ -267,16 +267,16 @@ repo_path=Путь до каталога репозиториев
repo_path_helper=Все удалённые Git репозитории будут сохранены в этом каталоге.
lfs_path=Путь до корневого каталога Git LFS
lfs_path_helper=В этом каталоге будут храниться файлы Git LFS. Оставьте пустым, чтобы отключить LFS.
-run_user=Выполнение под пользователем
+run_user=Работа под пользователем
run_user_helper=Имя пользователя операционной системы, под которым работает Forgejo. Обратите внимание, что этот пользователь должен иметь доступ к корневому пути репозиториев.
domain=Домен сервера
domain_helper=Домен или адрес хоста для сервера.
ssh_port=Порт SSH-сервера
-ssh_port_helper=Номер порта, используемый SSH-сервером. Оставьте пустым для отключения доступа по SSH.
+ssh_port_helper=Номер порта, используемый для входящих подключений по SSH. Оставьте пустым для отключения доступа по SSH.
http_port=Порт HTTP-сервера
http_port_helper=Номер порта, используемый веб-сервером Forgejo.
-app_url=Базовый URL Forgejo
-app_url_helper=Этот параметр влияет на URL для клонирования по HTTP/HTTPS и на некоторые уведомления по эл. почте.
+app_url=Базовый URL
+app_url_helper=Этот параметр влияет на URL клонирования по HTTP/HTTPS и на ссылки в уведомлениях по эл. почте.
log_root_path=Путь журналов
log_root_path_helper=Файлы журнала будут записываться в этот каталог.
@@ -284,9 +284,9 @@ optional_title=Дополнительные настройки
email_title=Настройки эл. почты
smtp_addr=Адрес SMTP
smtp_port=Порт SMTP
-smtp_from=Отправлять письма от
+smtp_from=Отправитель
smtp_from_helper=Адрес эл. почты, который будет использоваться Forgejo. Введите обычный адрес эл. почты или используйте формат "Имя" .
-mailer_user=Логин SMTP
+mailer_user=Имя пользователя SMTP
mailer_password=Пароль SMTP
register_confirm=Требовать подтверждение по эл. почте для регистрации
mail_notify=Уведомления по эл. почте
@@ -316,11 +316,11 @@ confirm_password=Подтверждение пароля
admin_email=Адрес эл. почты
install_btn_confirm=Установить Forgejo
test_git_failed=Не удалось проверить команду «git»: %v
-sqlite3_not_available=Эта версия Forgejo не поддерживает SQLite3. Пожалуйста, загрузите официальную бинарную сборку из %s (не сборку «gobuild»).
+sqlite3_not_available=Эта версия Forgejo не поддерживает SQLite3. Пожалуйста, скачайте официальную сборку из %s (не версию «gobuild»).
invalid_db_setting=Некорректные настройки базы данных: %v
invalid_db_table=Таблица «%s» базы данных некорректна: %v
-invalid_repo_path=Недопустимый путь к корню репозитория: %v
-invalid_app_data_path=Неверный путь к приложению: %v
+invalid_repo_path=Неверный путь к корню репозиториев: %v
+invalid_app_data_path=Неверный путь к данным приложения: %v
run_user_not_match=Текущий пользователь не является пользователем для запуска: %s -> %s
internal_token_failed=Не удалось создать внутренний токен: %v
secret_key_failed=Не удалось создать секретный ключ: %v
@@ -341,7 +341,7 @@ password_algorithm_helper=Задайте алгоритм хеширования
enable_update_checker=Проверка обновлений
env_config_keys=Настройка окружения
env_config_keys_prompt=Следующие переменные окружения также будут применены к вашему конфигурационному файлу:
-enable_update_checker_helper_forgejo = Периодически проверять наличие новых версий Forgejo через DNS-запись TXT на release.forgejo.org.
+enable_update_checker_helper_forgejo = Периодически проверять наличие новых версий Forgejo через «TXT» DNS-запись домена release.forgejo.org.
allow_dots_in_usernames = Разрешить точки в именах пользователей. Это не повлияет на уже созданные учётные записи.
smtp_from_invalid = Адрес для отправки писем некорректен
config_location_hint = Эти настройки конфигурации будут сохранены в:
@@ -360,7 +360,7 @@ my_orgs=Организации
my_mirrors=Мои зеркала
view_home=Показать %s
search_repos=Поиск репозитория…
-filter=Другие фильтры
+filter=Прочие фильтры
filter_by_team_repositories=Фильтровать по репозиториям команды
feed_of=Лента «%s»
@@ -687,13 +687,13 @@ change_avatar=Изменить изображение профиля…
joined_on=Регистрация %s
repositories=Репозитории
activity=Публичная активность
-followers_few=%d подписчики
+followers_few=%d подписчиков
starred=Избранные репозитории
watched=Отслеживаемые репозитории
code=Код
projects=Проекты
overview=Обзор
-following_few=%d подписки
+following_few=%d подписок
follow=Подписаться
unfollow=Отписаться
user_bio=О себе
@@ -748,7 +748,7 @@ webauthn=Двухфакторная аутентификация (ключами
public_profile=Публичный профиль
biography_placeholder=Кратко расскажите о себе другим! (Можно использовать Markdown)
location_placeholder=Пусть все знают, откуда вы
-profile_desc=Как ваш профиль будет отображаться для других пользователей. Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и веб-операций с Git.
+profile_desc=Ваш профиль
password_username_disabled=Нелокальным пользователям запрещено изменение их имени пользователя. Для получения более подробной информации обратитесь к администратору сайта.
full_name=Полное имя
website=Веб-сайт
@@ -810,7 +810,7 @@ password_change_disabled=Нелокальные учётные записи не
emails=Адреса эл. почты
manage_emails=Управление адресами эл. почты
-manage_themes=Тема по умолчанию
+manage_themes=Тема интерфейса
manage_openid=Адреса OpenID
email_desc=Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и, если он не скрыт, для действий с Git в веб-интерфейсе.
theme_desc=Эта тема оформления будет использоваться при входе на сайт под этой учётной записью.
@@ -941,7 +941,7 @@ select_permissions=Выбрать разрешения
permission_no_access=Нет доступа
permission_read=Чтение
permission_write=Чтение и запись
-access_token_desc=Выбранные области действия токена ограничивают авторизацию только соответствующими маршрутами API . Читайте документацию для получения дополнительной информации.
+access_token_desc=Выбранные области действия токена ограничивают его использование до соответствующих маршрутов API . Для получения подробностей ознакомьтесь с документацией .
at_least_one_permission=Необходимо выбрать хотя бы одно разрешение для создания токена
permissions_list=Разрешения:
@@ -949,7 +949,7 @@ manage_oauth2_applications=Управление приложениями OAuth2
edit_oauth2_application=Изменить приложение OAuth2
oauth2_applications_desc=Приложения OAuth2 позволяет стороннему приложению к безопасно аутентифицировать пользователей данной установки Forgejo.
remove_oauth2_application=Удаление приложения OAuth2
-remove_oauth2_application_desc=Удаление приложения OAuth2 отменит доступ ко всем подписанным токенам доступа. Продолжить?
+remove_oauth2_application_desc=Удаление этого приложения отменит доступ ко всем подписанным токенам доступа. Продолжить?
remove_oauth2_application_success=Приложение было успешно удалено.
create_oauth2_application=Создать новое приложение OAuth2
create_oauth2_application_button=Создать приложение
@@ -1040,7 +1040,7 @@ blocked_since = Заблокирован с %s
user_unblock_success = Пользователь разблокирован.
twofa_scratch_token_regenerated = Ваш одноразовый ключ восстановления: %s. Сохраните его в надёжном месте. Больше он показан не будет.
blocked_users = Заблокированные пользователи
-keep_email_private_popup = Ваш адрес эл. почты будет скрыт из профиля. Он больше не будет использоваться по умолчанию для коммитов, сделанных из веб-интерфейса, таких как загрузки и редактирования файлов и не будет использоваться для коммитов запросов на слияние. Вместо него можно будет использовать специальный адрес %s, чтобы присваивать коммиты с вашим аккаунтом. Обратите внимание на то, что изменение данной настройки не повлияет на существующие коммиты.
+keep_email_private_popup = Ваш адрес эл. почты не будет видим в профиле и не будет использован по умолчанию для коммитов из веб-интерфейса, таких как загрузка и редактирование файлов, а также для коммитов слияний. Вместо него для связи коммитов с уч. записью можно использовать специальный адрес %s. Изменение данной настройки не изменит адрес в существующих коммитах.
oauth2_confidential_client = Конфиденциальный клиент. Выберите для приложений, хранящих секрет в тайне, например, для веб-приложений. Не выбирайте для нативных приложений, включая приложения для ПК или смартфонов.
change_password = Изменение пароля
hints = Подсказки
@@ -1051,10 +1051,12 @@ additional_repo_units_hint_description = Показывать подсказку
pronouns_custom = Другие
pronouns = Местоимения
pronouns_unspecified = Не указаны
-language.title = Язык по умолчанию
+language.title = Язык интерфейса
keep_activity_private.description = Ваша публичная активность будет видна только вам и администраторам сервера.
language.description = Выбранный язык будет сохранён в вашей уч. записи и будет использован по умолчанию после входа.
language.localization_project = Помогите с переводом Forgejo на свой язык! Подробнее .
+user_block_yourself = Нельзя заблокировать себя.
+pronouns_custom_label = Другие местоимения
[repo]
owner=Владелец
@@ -1065,11 +1067,11 @@ repo_size=Размер репозитория
size_format = `%[1]s: %[2]s; %[3]s: %[4]s`
template=Шаблон
template_select=Выберите шаблон
-template_helper=Сделать репозиторий шаблоном
+template_helper=Пометить репозиторий как шаблон
template_description=Шаблонные репозитории дают возможность пользователям создавать новые репозитории с той же структурой каталогов, файлами и дополнительными настройками.
visibility=Видимость
-visibility_description=Это увидят только владелец организации или участники при наличии прав.
-visibility_helper=Сделать репозиторий приватным
+visibility_description=Он будет видим только владельцу организации и её участникам при наличии прав.
+visibility_helper=Частный репозиторий
visibility_helper_forced=Администратор сайта настроил параметр видимости новых репозиториев. Репозиторий приватный по умолчанию.
visibility_fork_helper=(Это изменит видимость всех ответвлений.)
clone_helper=Нужна помощь в клонировании? Посетите страницу помощи .
@@ -1091,16 +1093,16 @@ repo_desc=Описание
repo_desc_helper=Добавьте краткое описание (необязательно)
repo_lang=Язык
repo_gitignore_helper=Выберите шаблоны .gitignore
-repo_gitignore_helper_desc=Выберите из списка шаблонов для популярных языков , какие файлы не надо отслеживать. По умолчанию в .gitignore включены типичные артефакты, создаваемые инструментами сборки каждого языка.
+repo_gitignore_helper_desc=Выберите шаблоны из списка для популярных языков. .gitignore определяет, какие файлы не надо отслеживать в проекте. По умолчанию в него включены типичные артефакты, создаваемые инструментами сборки каждого языка.
issue_labels=Метки
issue_labels_helper=Выберите набор меток
license=Лицензия
license_helper=Выберите лицензию
-license_helper_desc=Лицензия определяет, что другие люди могут, а что не могут делать с вашим кодом. Не уверены, какая лицензия подходит для вашего проекта? Смотрите Выберите лицензию .
+license_helper_desc=Лицензия определяет, что другие могут и не могут делать с вашим кодом. Не знаете, какая лицензия подойдёт для вашего проекта? Ознакомьтесь с Выбором лицензии .
readme=README
readme_helper=Выберите шаблон README
readme_helper_desc=Это место, где вы можете написать подробное описание вашего проекта.
-auto_init=Инициализировать репозиторий (Добавляет .gitignore, LICENSE and README)
+auto_init=Инициализировать репозиторий
trust_model_helper=Выберите модель доверия для проверки подписи. Возможные варианты:
trust_model_helper_collaborator=Соучастник: доверять подписям соучастников
trust_model_helper_committer=Автор коммита: доверять подписям, соответствующим авторам коммитов
@@ -1169,8 +1171,8 @@ template.issue_labels=Метки задач
template.one_item=Необходимо выбрать хотя бы один элемент шаблона
template.invalid=Необходимо выбрать шаблон репозитория
-archive.issue.nocomment=Этот репозиторий в архиве. Вы не можете комментировать задачи.
-archive.pull.nocomment=Это репозиторий в архиве. Вы не можете комментировать запросы на слияние.
+archive.issue.nocomment=Этот репозиторий архивирован. Комментирование в задачах невозможно.
+archive.pull.nocomment=Этот репозиторий архивирован. Комментирование в запросах слияний невозможно.
form.reach_limit_of_creation_1=Достигнуто ограничение на количество репозиториев: %d.
form.reach_limit_of_creation_n=Достигнуто ограничение на количество репозиториев: %d.
@@ -1719,8 +1721,8 @@ issues.due_date_form_add=Добавить срок выполнения
issues.due_date_form_edit=Изменить
issues.due_date_form_remove=Удалить
issues.due_date_not_set=Срок выполнения не установлен.
-issues.due_date_added=добавлен срок выполнения %s %s
-issues.due_date_modified=срок выполнения передвинут с %[2]s на %[1]s %[3]s
+issues.due_date_added=добавлен срок выполнения – %s, %s
+issues.due_date_modified=срок выполнения изменён с %[2]s на %[1]s %[3]s
issues.due_date_remove=убран срок выполнения %s %s
issues.due_date_overdue=Просроченные
issues.due_date_invalid=Срок выполнения недействителен или находится за пределами допустимого диапазона. Пожалуйста, используйте формат «гггг-мм-дд».
@@ -2195,9 +2197,9 @@ settings.transfer_perform=Выполнить передачу
settings.transfer_started=Репозиторий ожидает подтверждения передачи от «%s»
settings.transfer_succeed=Репозиторий перенесён.
settings.signing_settings=Настройки проверки подписей
-settings.trust_model=Модель доверия подписи
-settings.trust_model.default=Модель доверия по умолчанию
-settings.trust_model.default.desc=Использовать стандартную модель доверия репозитория для этой установки.
+settings.trust_model=Факторы доверия подписям
+settings.trust_model.default=Фактор доверия по умолчанию
+settings.trust_model.default.desc=Использовать фактор доверия по умолчанию, используемый на этом сервере.
settings.trust_model.collaborator=Соучастник
settings.trust_model.collaborator.long=Соучастник: доверять подписям соучастников
settings.trust_model.collaborator.desc=Действительные подписи соучастников этого репозитория будут помечены как «доверенные» (независимо от того, соответствуют ли они автору коммита). В остальных случаях действительные подписи будут помечены как «недоверенные», если подпись соответствует автору коммита, и «не совпадающие», если нет.
@@ -2742,7 +2744,7 @@ pulls.made_using_agit = AGit
activity.navbar.contributors = Соавторы
activity.navbar.code_frequency = Частота изменений
activity.navbar.recent_commits = Недавние коммиты
-settings.confirmation_string = Подтверждение
+settings.confirmation_string = Строка подтверждения
settings.archive.text = Архивация репозитория сделает всё его содержимое доступным только для чтения. Он будет скрыт с домашнего экрана. Никто (включая вас!) не сможет добавлять коммиты, открывать задачи и запросы слияний.
release.deletion_desc = Удаление выпуска удаляет его только в Forgejo. Это действие не затронет тег в git, содержимое репозитория и его историю. Продолжить?
pulls.agit_explanation = Создано через рабочий поток AGit. С ним можно предлагать изменения, используя команду «git push», без необходимости в создании ответвления или новой ветви.
@@ -2850,6 +2852,21 @@ issues.num_reviews_few = %d рецензий
issues.num_reviews_one = %d рецензия
issues.summary_card_alt = Карточка со сводкой задачи "%s" в репозитории %s
editor.add_tmpl.filename = имя файла
+settings.default_update_style_desc = Стиль обновления отстающих ветвей запросов на слияние по умолчанию.
+pulls.sign_in_require = Войдите , чтобы создать запрос слияния.
+new_from_template = Применить шаблон
+new_from_template_description = Вы можете выбрать любой шаблон репозитория на этом сервере и применить его настройки на этом репозитории.
+new_advanced = Расширенные настройки
+new_advanced_expand = Нажмите, чтобы раскрыть
+auto_init_description = Начать историю коммитов с добавления README и, если надо, лицензии и .gitignore.
+summary_card_alt = Карточка со сводкой о репозитории %s
+issues.reaction.add = Добавить реакцию
+issues.reaction.alt_few = Реакция %[2]s от %[1]s.
+issues.reaction.alt_many = Реакция %[3]s от %[1]s и %[2]d других.
+issues.reaction.alt_remove = Убрать реакцию %[1]s с этого комментария.
+issues.reaction.alt_add = Добавить реакцию %[1]s к этому комментарию.
+issues.context.menu = Меню комментария
+release.summary_card_alt = Карточка со сводкой о выпуске «%s» в репозитории %s
[graphs]
component_loading_failed = Не удалось загрузить %s
@@ -3315,13 +3332,13 @@ auths.invalid_openIdConnectAutoDiscoveryURL=Неверный URL для авто
config.server_config=Конфигурация сервера
config.app_name=Название сервера
config.app_ver=Версия Forgejo
-config.app_url=Базовый URL Forgejo
+config.app_url=Базовый URL
config.custom_conf=Путь к файлу конфигурации
config.custom_file_root_path=Путь до каталога с файлами для персонализации
config.domain=Домен сервера
config.offline_mode=Локальный режим
config.disable_router_log=Отключение журнала маршрутизатора
-config.run_user=Выполнение под пользователем
+config.run_user=Работа под пользователем
config.run_mode=Режим работы
config.git_version=Версия git
config.app_data_path=Путь к данным приложения
@@ -3543,6 +3560,7 @@ emails.delete = Удалить адрес
emails.deletion_success = Адрес эл. посты удалён из учётной записи.
emails.delete_primary_email_error = Невозможно удалить основной адрес.
emails.delete_desc = Вы точно хотите удалить этот адрес эл. почты?
+monitor.duration = Длительность (с)
[action]
@@ -3813,6 +3831,9 @@ arch.version.backup = Рез. копия
arch.version.conflicts = Конфликтует с
arch.version.checkdepends = Проверочные зависимости
container.images.title = Образы
+search_in_external_registry = Найти в %s
+alt.repository = О репозитории
+alt.repository.architectures = Архитектуры
[secrets]
secrets=Секреты
@@ -3956,28 +3977,28 @@ fuzzy_tooltip = Включает результаты, достаточно по
type_tooltip = Тип поиска
fuzzy = Приблизительный
match = Точный
-repo_kind = Поиск репозиториев...
-user_kind = Поиск пользователей...
-org_kind = Поиск организаций...
-team_kind = Поиск команд...
-code_kind = Поиск по коду...
-package_kind = Поиск пакетов...
-project_kind = Поиск проектов...
-branch_kind = Поиск ветвей...
-commit_kind = Поиск коммитов...
+repo_kind = Найти репозитории...
+user_kind = Найти пользователей...
+org_kind = Найти организации...
+team_kind = Найти команды...
+code_kind = Найти в коде...
+package_kind = Найти пакеты...
+project_kind = Найти проекты...
+branch_kind = Найти ветви...
+commit_kind = Найти коммиты...
no_results = По запросу ничего не найдено.
-keyword_search_unavailable = Поиск по ключевым словам недоступен. Уточните подробности у администратора.
+keyword_search_unavailable = Поиск по ключевым словам недоступен. Уточните подробности у администратора сервера.
match_tooltip = Включать только результаты, точно соответствующие запросу
-code_search_unavailable = Поиск по коду сейчас недоступен. Уточните подробности у администратора.
-runner_kind = Поиск исполнителей...
-code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если администратор сервера включит индексатор кода.
+code_search_unavailable = Поиск в коде недоступен. Уточните подробности у администратора сервера.
+runner_kind = Найти исполнителей...
+code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если на сервере будет включен индексатор кода.
exact = Точный
exact_tooltip = Включает только результаты, в точности соответствующие запросу
-issue_kind = Поиск задач...
-pull_kind = Поиск слияний...
+issue_kind = Найти задачи...
+pull_kind = Найти слияния...
union_tooltip = Включает результаты с совпавшими ключевыми словами, разделёнными пробелами
union = Обычный
-milestone_kind = Поиск этапов...
+milestone_kind = Найти этапы...
regexp = Регулярное выражение
regexp_tooltip = Интерпретировать поисковый запрос как регулярное выражение
@@ -3988,7 +4009,7 @@ filepreview.lines = Строки с %[1]d по %[2]d в %[3]s
filepreview.truncated = Предпросмотр был обрезан
[translation_meta]
-test = skip-ci routine :)
+test = forgejo :)
[repo.permissions]
code.write = Запись: отправка изменений в репозиторий, создание веток и тегов.
diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini
index 4d460273cc..abdb012120 100644
--- a/options/locale/locale_sv-SE.ini
+++ b/options/locale/locale_sv-SE.ini
@@ -130,10 +130,48 @@ download_logs = Ladda ner loggar
go_back = Gå tillbaka
show_log_seconds = Visa sekunder
rerun = Kör om
+filter = Filter
+filter.is_archived = Arkiverade
+filter.clear = Rensa filter
+filter.is_mirror = Speglar
+copy_path = Kopiera sökväg
+unpin = Lossa
+value = Värde
+filter.not_archived = Inte arkiverade
+error413 = Du har använt upp din kvot.
+invalid_data = Ogiltig data: %v
+filter.not_template = Inte mallar
+copy_hash = Kopiera hash
+view = Se
+copy_branch = Kopiera grennamn
+pin = Fäst
+filter.public = Publika
+new_repo.title = Ny utvecklingskatalog
+new_migrate.title = Ny migrering
+new_repo.link = Ny utvecklingskatalog
+new_migrate.link = Ny migrering
+filter.not_mirror = Inte speglar
+filter.is_template = Mallar
+filter.private = Privata
+active_stopwatch = Spårning av aktiv tid
+tracked_time_summary = Sammanfattning av spårad tid baserat på filter av ärendelistan
+toggle_menu = Visningsmeny
+confirm_delete_selected = Bekräfta för att ta bort alla valda objekt?
+webauthn_error_timeout = Timeout uppnåddes innan din nyckel kan läsas. Vänligen ladda om denna sida och försök igen.
+filter.is_fork = Förgreningar
+webauthn_error_duplicated = Säkerhetsnyckeln är inte tillåten för denna begäran. Se till att nyckeln inte redan är registrerad.
+filter.not_fork = Inte gafflar
+remove_label_str = Ta bort objektet "%"
+webauthn_use_twofa = Använd en tvåfaktorskod från din telefon
+webauthn_error_insecure = WebAuthn stöder endast säkra anslutningar. För testning över HTTP kan du använda "localhost" eller "127.0.0.1"
+webauthn_error_unable_to_process = Servern kunde inte hantera din begäran.
+copy_generic = Kopiera till urklipp
[aria]
footer.software = Om den här mjukvaran
footer.links = Länkar
+footer = Sidfot
+navbar = Navigeringsfält
[heatmap]
contributions_one = bidrag
@@ -155,6 +193,13 @@ buttons.list.unordered.tooltip = Lägg till en punktlista
buttons.list.ordered.tooltip = Lägg till en numrerad lista
buttons.list.task.tooltip = Lägg till en lista med sysslor
buttons.mention.tooltip = Nämn en användare eller ett team
+buttons.ref.tooltip = Hänvisa till ett ärende eller en pull request
+buttons.new_table.tooltip = Lägg till tabell
+table_modal.header = Lägg till tabell
+table_modal.placeholder.header = Sidhuvud
+table_modal.placeholder.content = Innehåll
+table_modal.label.rows = Rader
+table_modal.label.columns = Kolumner
[filter]
string.asc = A - Ö
@@ -163,6 +208,7 @@ string.asc = A - Ö
occurred = Ett fel har inträffat
server_internal = Internt serverfel
network_error = Nätverksfel
+report_message = Om du tror att detta är en Forgejo-bugg, sök efter ärenden på Codeberg eller öppna ett nytt ärende om det behövs.
[startpage]
app_desc=En smidig, självhostad Git-tjänst
@@ -242,14 +288,14 @@ enable_captcha=Aktivera CAPTCHA registrering
enable_captcha.description=Kräv att användare klarar CAPTCHA för att registrera konton.
require_sign_in_view=Kräv inloggning för att visa instansens innehåll
admin_setting.description=Skapandet av ett administratörskonto är frivilligt. Den första användaren som registreras blir automatiskt administratör.
-admin_title=Inställningar för Administratörskonto
-admin_name=Användarnamn för Administratör
+admin_title=Inställningar för administratörskonto
+admin_name=Användarnamn för administratör
admin_password=Lösenord
confirm_password=Bekräfta lösenord
-admin_email=Mejladress
+admin_email=E-postadress
install_btn_confirm=Installera Forgejo
-test_git_failed=Misslyckades att testa 'git' kommando: %v
-sqlite3_not_available=Denna version av Forgejo stödjer ej SQLite3. Ladda ner den officiella binären från %s (inte 'gobuild' versionen).
+test_git_failed=Misslyckades att testa "git" kommando: %v
+sqlite3_not_available=Denna version av Forgejo stödjer inte SQLite3. Ladda ner den officiella binären från %s (inte "gobuild" versionen).
invalid_db_setting=Databasinställningarna är ogiltiga: %v
invalid_repo_path=Utvecklingskatalogens rotsökväg är ogiltig: %v
run_user_not_match=Systemtjänstanvändaren är inte den nuvarande användaren: %s -> %s
@@ -260,10 +306,10 @@ default_keep_email_private=Dölj e-postadresser som standard
default_keep_email_private.description=Dölj e-postadress för nya användarkonton som standard så att den informationen inte omedelbart läcker efter registrering.
default_allow_create_organization=Tillåt skapandet utav organisationer som standard
default_allow_create_organization.description=Tillåt nya användarkonton att skapa organisationer som standard. När detta alternativt ej är aktivt så behöver en administratör tilldela rättigheter att skapa organisationer till nya användare.
-default_enable_timetracking=Aktivera tidredovisning som Standard
+default_enable_timetracking=Aktivera tidredovisning som standard
default_enable_timetracking.description=Aktivera tidsredovisning för nya utvecklingskataloger som standard.
-no_reply_address=Dold mejldomän
-no_reply_address_helper=Domännamn för användare med en dold mailadress. Exempelvis kommer användarnamnet 'joe' att loggas i Git som 'joe@noreply.example.org' om dold maildomän är satt till 'noreply.example.org'.
+no_reply_address=Dold e-postdomän
+no_reply_address_helper=Domännamn för användare med en dold e-postadress. Exempelvis kommer användarnamnet "joe" att loggas i Git som "joe@noreply.example.org" om den dolda e-postdomänen är satt till "noreply.example.org".
require_db_desc = Forgejo kräver MySQL, PostgreSQL, SQLite3 eller TiDB (MySQL-protokoll).
allow_only_external_registration = Tillåt registrering endast via externa tjänster
app_slogan = Instansslogan
@@ -271,19 +317,30 @@ app_slogan_helper = Skriv in din slogan här. Lämna tom för att stänga av.
domain = Serverdomän
domain_helper = Domän eller värdadress för servern.
reinstall_error = Du försöker att installera i en existerande Forgejo-databas
+password_algorithm_helper = Ställ in hashalgoritmen för lösenord. Algoritmer har olika krav och styrka. Argon2-algoritmen är ganska säker men använder mycket minne och kan vara olämplig för små system.
+config_location_hint = Dessa konfigurationsinställningar kommer att sparas i:
+invalid_db_table = Databastabellen "%s" är ogiltig: %v
+secret_key_failed = Misslyckades att generera hemlig nyckel: %v
+allow_dots_in_usernames = Tillåt användare att använda punkter i sina användarnamn. Påverkar inte befintliga användare.
+reinstall_confirm_message = Ominstallation med en befintlig Forgejo-databas kan orsaka flera problem. I de flesta fall bör du använda din befintliga "app.ini" för att köra Forgejo. Om du vet vad du håller på med, bekräfta följande:
+require_sign_in_view.description = Begränsa åtkomst till innehåll till inloggade användare. Gäster kommer endast att kunna besöka autentiseringssidorna.
+invalid_app_data_path = Sökvägen för appdata är ogiltig: %v
+internal_token_failed = Misslyckades att generera intern token: %v
+password_algorithm = Hashalgoritm för lösenord
+invalid_password_algorithm = Ogiltig hashalgoritm för lösenord
[home]
-uname_holder=Användarnamn eller Mejladress
+uname_holder=Användarnamn eller e-postadress
password_holder=Lösenord
-switch_dashboard_context=Växla Visad Instrumentpanel
+switch_dashboard_context=Växla visad instrumentpanel
my_repos=Utvecklingskataloger
show_more_repos=Visa flera utvecklingskataloger…
collaborative_repos=Kollaborativa Utvecklingskataloger
-my_orgs=Mina organisationer
+my_orgs=Organisationer
my_mirrors=Mina speglar
view_home=Visa %s
search_repos=Hitta en utvecklingskatalog…
-filter=Övriga Filter
+filter=Övriga filter
show_archived=Arkiverade
show_both_archived_unarchived=Visar både arkiverade och icke arkiverade
@@ -296,6 +353,7 @@ show_only_private=Visar endast privata
show_only_public=Visar endast publika
issues.in_your_repos=I dina utvecklingskataloger
+filter_by_team_repositories = Filtrera efter lagutvecklingskataloger
[explore]
repos=Utvecklingskataloger
@@ -308,9 +366,13 @@ user_no_results=Inga matchande användare hittades.
org_no_results=Inga matchande organisationer hittades.
code_no_results=Ingen källkod hittades som matchar din sökterm.
code_last_indexed_at=Indexerades senast %s
+stars_one = %d stjärna
+go_to = Gå till
+relevant_repositories = Endast relevanta utvecklingskataloger visas, visa ofiltrerade resultat .
+stars_few = %d stjärnor
[auth]
-create_new_account=Registrera Konto
+create_new_account=Registrera konto
register_helper_msg=Har du redan ett konto? Logga in nu!
social_register_helper_msg=Har du redan ett konto? Länka det nu!
disable_register_prompt=Registrering inaktiverad. Vänligen kontakta din sidadministratör.
@@ -319,18 +381,18 @@ remember_me=Kom ihåg denna enhet
forgot_password_title=Glömt lösenord
forgot_password=Glömt lösenord?
sign_up_now=Behöver du ett konto? Registrera nu.
-confirmation_mail_sent_prompt=Ett nytt bekräftelsemail has skickats till %s . Vänligen kolla din inkorg inom dom kommande %s för att slutföra registreringsprocessen.
+confirmation_mail_sent_prompt=Ett nytt bekräftelsemejl has skickats till %s . För att slutföra registreringsprocessen, vänligen kolla din inkorg inom dom kommande %s. Om e-postadressen är felaktig så kan du logga in och begära att få ett nytt bekräftelsemejlet skickat till en annan e-postadressen.
must_change_password=Ändra ditt lösenord
allow_password_change=Kräv att användaren byter lösenord (rekommenderas)
-reset_password_mail_sent_prompt=Ett nytt bekräftelsemail has skickats till %s . Vänligen kontrollera din inkorg inom de kommande %s för att slutföra återställning av ditt konto.
+reset_password_mail_sent_prompt=Ett nytt bekräftelsemail has skickats till %s . För att slutföra återställning av ditt konto, kontrollera din inkorg och gå till den bifogade länken inom de kommande %s.
active_your_account=Aktivera ditt konto
account_activated=Kontot har aktiverats
-prohibit_login=Inloggning otillåten
+prohibit_login=Kontot är avstängd
resent_limit_prompt=Du har redan begärt ett aktiveringsmejl nyligen. Vänligen vänta 3 minuter och försök igen.
has_unconfirmed_mail=Hej %s, du har en obekräftad epostaddress (%s ). Om du inte har fått ett bekräftelsemail eller behöver ett nytt, klicka på knappen nedan.
resend_mail=Klicka här för att skicka ditt aktiveringsmejl igen
email_not_associate=Denna e-postadress är inte knutet till något konto.
-send_reset_mail=Skicka mail för kontoåterställning
+send_reset_mail=Skicka mejl för kontoåterställning
reset_password=Kontoåterställning
invalid_code=Din bekräftelsekod är ogiltig eller har löpt ut.
reset_password_helper=Återställ konto
@@ -364,6 +426,22 @@ authorize_title=Ge "%s" tillgång till ditt konto?
authorization_failed=Auktorisering misslyckades
sspi_auth_failed=SSPI-autentisering misslyckades
password_pwned_err=Kunde inte slutföra begäran till HaveIBeenPwned
+reset_password_wrong_user = Du är inloggad som %s, men kontoåterställningslänken är avsedd för %s
+invalid_code_forgot_password = Din bekräftelsekod är ogiltig eller har gått ut. Klicka på här för att påbörja en ny session.
+invalid_password = Ditt lösenord matchar inte lösenordet som användes för att skapa kontot.
+openid_signin_desc = Ange din OpenID URI. Till exempel: alice.openid.example.org eller https://openid.example.org/alice.
+sign_in_openid = Fortsätt med OpenID
+hint_login = Har du redan ett konto? Logga in nu!
+change_unconfirmed_email_summary = Ändra e-postadressen som aktiveringsmejl skickas till.
+change_unconfirmed_email_error = Det går inte att ändra e-postadressen: %v
+use_onetime_code = Använde en engångskod
+last_admin = Du kan inte ta bort den sista administratören. Det måste finnas minst en administratör.
+back_to_sign_in = Tillbaka till Logga in
+hint_register = Behöver du ett konto? Registrera ett nu.
+prohibit_login_desc = Ditt konto har blivit avstängt från att interagera med instansen. Kontakta instansadministratören för att återfå tillgång.
+password_pwned = Lösenordet du valde finns på en lista över stulna lösenord som tidigare exponerats i offentliga dataintrång. Försök igen med ett annat lösenord och överväg att ändra detta lösenord på annat håll också.
+sign_up_button = Registrera dig.
+sign_up_successful = Kontot skapades. Välkommen!
[mail]
activate_account=Vänligen aktivera ditt konto
@@ -375,6 +453,14 @@ register_notify=Välkommen till %s
reset_password=Återställ ditt konto
register_success=Registreringen lyckades
+password_change.subject = Ditt lösenord har uppdaterats
+password_change.text_1 = Lösenordet för ditt konto ändrades just.
+primary_mail_change.subject = Din primära e-postadress har ändrats
+activate_account.text_1 = Hej %[1]s , tack för att du registrerat dig hos %[2]s!
+reply = eller svara på detta e-postmeddelande direkt
+hi_user_x = Hej %s ,
+admin.new_user.user_info = Användarinformation
+admin.new_user.text = Vänligen klicka här för att hantera denna användare från administratörspanelen.
@@ -412,8 +498,8 @@ SSPISeparatorReplacement=Avgränsare
SSPIDefaultLanguage=Standardspråk
require_error=får inte vara tomt
-alpha_dash_error=` bör endast innehålla alfanumeriska tecken, bindestreck ('-') och understreck ('_').`
-alpha_dash_dot_error=` bör endast innehålla alfanumeriska tecken, bindestreck ('-'), understreck ('_') och punkter ('.').`
+alpha_dash_error=` bör endast innehålla alfanumeriska tecken, bindestreck ("-") och understreck ("_").`
+alpha_dash_dot_error=` bör endast innehålla alfanumeriska tecken, bindestreck ("-"), understreck ("_") och punkter (".").`
git_ref_name_error=måste vara ett för Git välformaterat referensnamn.
size_error=` måste vara av storleken %s`
min_size_error=` måste innehålla minst %s tecken.`
@@ -449,7 +535,7 @@ enterred_invalid_owner_name=Det nya namnet på ägaren är ogiltligt.
enterred_invalid_password=Det angivna lösenordet är felaktigt.
user_not_exist=Användaren finns inte.
team_not_exist=Teamet finns inte.
-last_org_owner=Du kan inte ta bort den sista användaren från 'owners' teamet. Det måste finnas minst en ägare för en organisation.
+last_org_owner=Du kan inte ta bort den sista användaren från "owners" teamet. Det måste finnas minst en ägare för en organisation.
cannot_add_org_to_team=En organisation kan inte läggas till som teammedlem.
invalid_ssh_key=Kunde inte verifiera din SSH-nyckel: %s
@@ -463,9 +549,9 @@ target_branch_not_exist=Målgrenen finns inte.
[user]
change_avatar=Byt din avatar…
repositories=Utvecklingskataloger
-activity=Offentlig Aktivitet
+activity=Offentlig aktivitet
followers_few=%d följare
-starred=Stjärnmärkta Utvecklingskataloger
+starred=Stjärnmärkta utvecklingskataloger
projects=Projekt
overview=Översikt
following_few=%d följer
@@ -481,13 +567,13 @@ account=Konto
password=Lösenord
security=Säkerhet
avatar=Visningsbild
-ssh_gpg_keys=SSH / GPG-nycklar
+ssh_gpg_keys=SSH/GPG-nycklar
social=Sociala konton
applications=Applikationer
-orgs=Hantera Organisationer
+orgs=Organisationer
repos=Utvecklingskataloger
delete=Radera konto
-twofa=Tvåfaktorsautentisering
+twofa=Tvåfaktorsautentisering (TOTP)
account_link=Länkade Konton
organization=Organisationer
@@ -508,16 +594,16 @@ comment_type_group_title=Titel
privacy=Sekretess
keep_activity_private_popup=Gör aktiviteten endast synlig för dig och administratörerna
-lookup_avatar_by_mail=Slå upp avatarer med hjälp utav mejladress
+lookup_avatar_by_mail=Slå upp avatar efter e-postadress
federated_avatar_lookup=Förenad uppslagning av avatar
-enable_custom_avatar=Aktivera Egen Avatar
+enable_custom_avatar=Använd anpassad avatar
choose_new_avatar=Välj ny avatar
-update_avatar=Uppdatera Avatar
-delete_current_avatar=Tag bort aktuell avatar
+update_avatar=Uppdatera avatar
+delete_current_avatar=Ta bort aktuell avatar
uploaded_avatar_not_a_image=Den uppladdade filen är inte en bild.
update_avatar_success=Din avatar har blivit uppdaterad.
-update_password=Ändra Lösenordet
+update_password=Ändra lösenord
old_password=Nuvarande lösenord
new_password=Nytt lösenord
password_incorrect=Det nuvarande lösenordet är felaktigt.
@@ -525,18 +611,18 @@ change_password_success=Ditt lösenord har uppdaterats. Logga in med ditt nya l
password_change_disabled=Externa användare kan inte ändra sitt lösenord genom Forgejos webbgränssnitt.
emails=E-postadresser
-manage_emails=Hantera mejladresser
-manage_themes=Välj standardtema
-manage_openid=Hantera OpenID-adresser
-theme_desc=Detta kommer att vara ditt standardtema på webbplatsen.
+manage_emails=Hantera e-postadresser
+manage_themes=Standardtema
+manage_openid=OpenID-adresser
+theme_desc=Detta tema kommer att användas för webbgränssnittet när du är inloggad.
primary=Primär
activated=Aktiverad
requires_activation=Aktivering krävs
-primary_email=Sätt Som Primär
+primary_email=Gör primär
activate_email=Skicka aktivering
activations_pending=Väntar på aktivering
delete_email=Ta Bort
-email_deletion=Ta Bort mejladress
+email_deletion=Ta bort e-postadress
email_deletion_desc=Mejladressen och relaterad information kommer tas bort från ditt konto. Git-commits med denna mejladress förblir oförändrade. Vill du fortsätta?
email_deletion_success=Mejladressen har tagits bort.
theme_update_success=Ditt tema ändrades.
@@ -544,26 +630,26 @@ theme_update_error=Det valda temat finns inte.
openid_deletion=Ta bort OpenID-adress
openid_deletion_desc=Borttagning av denna OpenID-adress från ditt konto kommer förhindra framtida inloggningar med den. Vill du fortsätta?
openid_deletion_success=OpenID-adressen har tagits bort.
-add_new_email=Lägg till ny mejladress
-add_new_openid=Lägg till ny OpenID URI
-add_email=Lägg till mejladress
+add_new_email=Lägg till ny e-postadress
+add_new_openid=Lägg till ny OpenID-URI
+add_email=Lägg till e-postadress
add_openid=Lägg till OpenID URI
add_email_success=Den nya mejladressen har lagts till.
email_preference_set_success=E-postinställningen har uppdaterats.
add_openid_success=Den nya OpenID-adressen har lagts till.
-keep_email_private=Göm mejladress
+keep_email_private=Göm e-postadress
openid_desc=OpenID låter dig delegera autentiseringen till en extern leverantör.
manage_ssh_keys=Hantera SSH-nycklar
manage_gpg_keys=Hantera GPG-nycklar
add_key=Lägg till nyckel
-ssh_desc=Dessa publika SSH nycklar är associerade med ditt konto. De motsvarande privata nycklarna tillåter full åtkomst till dina utvecklingskataloger.
+ssh_desc=Dessa publika SSH nycklar är associerade med ditt konto. De motsvarande privata nycklarna tillåter full åtkomst till dina utvecklingskataloger. SSH-nycklar som har blivit verifierade kan användas för att verifiera SSH-signerade Git-commiter.
gpg_desc=Dessa publika GPG nycklar är associerade med ditt konto. Håll dina privata nycklar säkra då de tillåter att commits kan verifieras.
ssh_helper=Behöver du hjälp? Kolla in Github's guide för att skapa din egen SSH-nycklar eller lösa vanliga problem som kan uppstå med SSH.
gpg_helper=Behöver du hjälp? Ta en titt på Github's guide om GPG .
add_new_key=Lägg till SSH-nyckel
add_new_gpg_key=Lägg till GPG-nyckel
-key_content_gpg_placeholder=Börjar med '-----BEGIN PGP PUBLIC KEY BLOCK-----'
+key_content_gpg_placeholder=Börjar med "-----BEGIN PGP PUBLIC KEY BLOCK-----"
ssh_key_been_used=Denna SSH-nyckel har redan lagts till på servern.
gpg_key_id_used=En publik GPG-nyckel med samma ID existerar redan.
gpg_key_verify=Verifiera
@@ -595,15 +681,15 @@ ssh_disabled=SSH är inaktiverat
manage_social=Hantera länkade sociala konton
unbind=Koppla från
-manage_access_token=Hantera åtkomst-tokens
-generate_new_token=Generera Nya Tokens
+manage_access_token=Åtkomsttokens
+generate_new_token=Generera ny token
tokens_desc=Dessa tokens tillåter åtkomst till ditt konto via Forgejo API.
token_name=Tokennamn
-generate_token=Generera Token
+generate_token=Generera token
generate_token_success=Din nya token har genererats. Kopiera nu då den inte kommer visas igen.
generate_token_name_duplicate=%s finns redan som programnamn. Välj ett annat.
delete_token=Radera
-access_token_deletion=Ta bort åtkomst token
+access_token_deletion=Ta bort åtkomsttoken
access_token_deletion_cancel_action=Avbryt
access_token_deletion_confirm_action=Radera
delete_token_success=Token har tagits bort. Applikationer som använder den kommer inte längre ha åtkomst till ditt konto.
@@ -628,7 +714,7 @@ oauth2_application_create_description=OAuth2-applikationer ger tredjepartsapplik
authorized_oauth2_applications=Auktoriserade OAuth2-appar
revoke_key=Upphäv
-revoke_oauth2_grant=Upphäv åtkomst
+revoke_oauth2_grant=Dra in åtkomst
revoke_oauth2_grant_description=Återkallning av åtkomst för detta tredjepartsprogram kommer att hindra programmet från att komma åt dina data. Är du säker?
twofa_desc=Tvåfaktorsautentisering förbättrar säkerheten på ditt konto.
@@ -648,27 +734,27 @@ passcode_invalid=Koden är ogiltig. Försök igen.
twofa_enrolled=Tvåfaktorsautentisering har aktiverats för ditt konto. Förvara din skrapkod (%s) på en säker plats eftersom den bara visas en gång!
-manage_account_links=Hantera Länkade Konton
+manage_account_links=Länkade konton
manage_account_links_desc=Dessa externa konton är länkade till ditt Forgejo-konto.
account_links_not_available=Det finns för närvarande inga externa konton länkade till ditt Forgejo-konto.
link_account=Länka konto
-remove_account_link=Ta Bort Länkat Konto
+remove_account_link=Ta bort länkat konto
remove_account_link_desc=Borttagning av länkade konton kommer häva dess åtkomst till ditt Forgejo-konto. Vill du fortsätta?
remove_account_link_success=Det länkade konton har tagits bort.
orgs_none=Du är inte en medlem i någon organisation.
-delete_account=Radera ditt konto
+delete_account=Ta bort ditt konto
delete_prompt=Denna åtgärd kommer ta bort ditt konto permanent. Det KAN INTE ångras.
-confirm_delete_account=Bekräfta Borttagelsen
-delete_account_title=Ta Bort Användarkonto
+confirm_delete_account=Bekräfta borttagelse
+delete_account_title=Ta bort användarkonto
delete_account_desc=Är du säker på att du vill ta bort ditt konto permanent?
-email_notifications.enable=Aktivera notiser via mejl
+email_notifications.enable=Aktivera notiser via e-post
email_notifications.onmention=Endast e-post vid omnämnanden
-email_notifications.disable=Inaktivera notiser via mejl
-email_notifications.submit=Ställ in e-post inställningar
+email_notifications.disable=Inaktivera notiser via e-post
+email_notifications.submit=Ställ in e-postpreferenser
visibility.public=Offentlig
visibility.private=Privat
@@ -686,23 +772,23 @@ template_description=Utvecklingskatalogmallar låter användare skapa nya utveck
visibility=Synligt för
visibility_description=Bara ägaren eller medlemmar i organisationen med rätt rättigheter kommer kunna se det.
visibility_helper_forced=Din tjänstadministratör påtvingar privata utvecklingskataloger.
-visibility_fork_helper=(Ändring av detta kommer påverka alla forkar.)
+visibility_fork_helper=(Att ändra detta kommer att påverka alla forkar.)
clone_helper=Hjälp med kloning? Se hjälp .
-fork_repo=Forka Repo
-fork_from=Forka Från
+fork_repo=Forka utveckligskatalog
+fork_from=Forka från
fork_visibility_helper=Synligheten av en forkad utvecklingskatalog kan inte ändras.
use_template=Välj den här mallen
-generate_repo=Skapa utvecklingskatalog
+generate_repo=Generera utvecklingskatalog
generate_from=Generera från
repo_desc=Beskrivning
repo_lang=Språk
repo_gitignore_helper=Välj .gitignore-mallar
repo_gitignore_helper_desc=Välj vilka filer som inte ska spåras från en lista med mallar för vanliga språk. Typiska artefakter som genereras av varje språk byggverktyg ingår i .gitignore som standard.
-issue_labels=Ärendeetiketter
+issue_labels=Etiketter
issue_labels_helper=Välj en uppsättning av etiketter
license=Licens
license_helper=Välj en licensfil
-license_helper_desc=En licens styr vad andra kan och inte kan göra med din kod. Inte säker på vilken som är rätt för ditt projekt? Se Välj en licens.
+license_helper_desc=En licens styr vad andra kan och inte kan göra med din kod. Inte säker på vilken som är rätt för ditt projekt? Se Välj en licens .
readme=README
readme_helper=Välj en mall för README-filen
readme_helper_desc=Här kan du skriva en fullständig beskrivning för ditt projekt.
@@ -713,8 +799,8 @@ default_branch_helper=Den förvalda grenen är bas-gren för pull requests och k
mirror_prune=Rensa
mirror_prune_desc=Ta bort förlegade fjärrföljande referenser
mirror_interval_invalid=Speglingsintervallen är inte giltig.
-mirror_address=Klona Från URL
-mirror_last_synced=Senaste Synkronisering
+mirror_address=Klona från URL
+mirror_last_synced=Synkroniserad senast
watchers=Observerare
stargazers=Stjärnmärkare
forks=Förgreningar
@@ -735,7 +821,7 @@ desc.internal=Intern
desc.archived=Arkiverade
template.items=Mallobjekt
-template.git_content=Git innehåll (Default branch)
+template.git_content=Git-innehåll (standardgren)
template.git_hooks=Githookar
template.webhooks=Webbhookar
template.topics=Ämnen
@@ -748,7 +834,7 @@ archive.issue.nocomment=Den här utvecklingskatalogen är arkiverad. Du kan inte
archive.pull.nocomment=Den här utvecklingskatalogen är arkiverad. Du kan inte kommentera på pull-förfrågningar.
-migrate_options=Migrationsalternativ
+migrate_options=Migreringsalternativ
migrate_service=Migreringstjänst
migrate_items=Migrationsobjekt
migrate_items_wiki=Wiki
@@ -758,9 +844,9 @@ migrate_items_issues=Ärenden
migrate_items_pullrequests=Pull Requester
migrate_items_merge_requests=Begäran om sammanslagning
migrate_items_releases=Releaser
-migrate_repo=Migrera Repot
-migrate.clone_address=Migrera Eller Klona Från URL
-migrate.clone_address_desc=HTTP(S)- eller Git 'clone' länken för en existerande utvecklingskatalog
+migrate_repo=Migrera utvecklingskatalog
+migrate.clone_address=Migrera eller klona från URL
+migrate.clone_address_desc=HTTP(S)- eller Git "clone" länk för en existerande utvecklingskatalog
migrate.clone_local_path=eller en lokal serversökväg
migrate.permission_denied=Du får inte importera lokala repon.
migrate.failed=Migrering misslyckades: %v
@@ -770,7 +856,7 @@ migrated_from_fake=Migrerad från %[1]s
migrate.migrate=Migrera från %s
migrate.migrating=Migrerar från %s ...
migrate.migrating_failed=Migrering från %s misslyckades.
-migrate.migrating_issues=Migrerar Ärenden
+migrate.migrating_issues=Migrerar ärenden
mirror_from=spegling av
forked_from=forkad från
@@ -784,7 +870,7 @@ watch=Bevaka
unstar=Ta bort stjärnmärkning
star=Stjärnmärk
fork=Förgrening
-download_archive=Ladda Ned Utvecklingskatalogen
+download_archive=Ladda ner utvecklingskatalogen
no_desc=Ingen beskrivning
quick_guide=Snabbguide
@@ -818,31 +904,31 @@ file_view_raw=Visa i råformat
file_permalink=Permalänk
file_too_large=Filen är för stor för att visas.
-video_not_supported_in_browser=Din webbläsare stödjer ej HTML5-taggen 'video'.
-audio_not_supported_in_browser=Din webbläsare stöder inte taggen 'audio' i HTML5.
+video_not_supported_in_browser=Din webbläsare stödjer ej HTML5-taggen "video".
+audio_not_supported_in_browser=Din webbläsare stödjer ej HTML5-taggen "audio".
stored_lfs=Sparad med Git LFS
symbolic_link=Symbolisk länk
-commit_graph=Commit-Graf
+commit_graph=Commitgraf
commit_graph.monochrome=Mono
blame=Blame
normal_view=Normal vy
line=rad
lines=rader
-editor.new_file=Ny Fil
-editor.upload_file=Ladda Upp Fil
-editor.edit_file=Redigera Fil
+editor.new_file=Ny fil
+editor.upload_file=Ladda upp fil
+editor.edit_file=Redigera fil
editor.preview_changes=Förhandsgranska ändringar
editor.cannot_edit_lfs_files=LFS-filer kan inte redigeras i webbgränssnittet.
editor.cannot_edit_non_text_files=Binära filer kan inte redigeras genom webbgränssnittet.
-editor.edit_this_file=Redigera Fil
+editor.edit_this_file=Redigera fil
editor.this_file_locked=Filen är låst
editor.must_be_on_a_branch=Du måste vara på en branch för att göra eller föreslå ändringar i denna fil.
editor.fork_before_edit=Du måste forka denna utvecklingskatalog för att göra eller föreslå förändringar på denna fil.
editor.delete_this_file=Ta bort fil
editor.must_have_write_access=Du måste ha skrivåtkomst för att göra eller föreslå ändringar av denna fil.
editor.name_your_file=Namnge din fil…
-editor.filename_help=Lägg till en katalog genom att skriva dess namn följt utav en slash ('/'). Ta bort katalog genom att sudda i början utav fältet.
+editor.filename_help=Lägg till en katalog genom att skriva dess namn följt utav ett snedstreck ("/"). Ta bort katalog genom att sudda i början utav fältet.
editor.or=eller
editor.cancel_lower=Avbryt
editor.commit_signed_changes=Committa signerade ändringar
@@ -870,7 +956,7 @@ commits.desc=Bläddra i källkodens förändringshistorik.
commits.commits=Incheckningar
commits.search=Sök commits…
commits.find=Sök
-commits.search_all=Alla brancher
+commits.search_all=Alla grenar
commits.author=Upphovsman
commits.message=Meddelande
commits.date=Datum
@@ -879,7 +965,7 @@ commits.newer=Nyare
commits.signed_by=Signerad av
commits.signed_by_untrusted_user=Signerad av opålitlig användare
commits.signed_by_untrusted_user_unmatched=Signerad av opålitlig användare som inte matchar den som committat
-commits.gpg_key_id=GPG-nyckel ID
+commits.gpg_key_id=GPG-nyckel-ID
commitstatus.pending=Väntande
@@ -894,7 +980,7 @@ projects.new=Nytt projekt
projects.deletion=Ta bort projekt
projects.deletion_success=Projektet har tagits bort.
projects.edit=Redigera projekt
-projects.modify=Uppdatera projekt
+projects.modify=Redigera projekt
projects.type.none=Ingen
projects.template.desc=Projektmall
projects.type.uncategorized=Okatergoriserad
@@ -909,10 +995,10 @@ issues.filter_milestones=Filtrera milstolpe
issues.filter_projects=Filtrera projekt
issues.filter_labels=Filtrera etikett
issues.filter_reviewers=Filtrera granskare
-issues.new=Nytt Ärende
+issues.new=Nytt ärende
issues.new.title_empty=Titeln kan inte vara tom
issues.new.labels=Etiketter
-issues.new.no_label=Ingen Etikett
+issues.new.no_label=Inga etiketter
issues.new.clear_labels=Rensa etiketter
issues.new.projects=Projekt
issues.new.clear_projects=Rensa projekt
@@ -921,26 +1007,26 @@ issues.new.open_projects=Öppna projekt
issues.new.closed_projects=Stängda projekt
issues.new.no_items=Inga objekt
issues.new.milestone=Milsten
-issues.new.no_milestone=Ingen Milsten
+issues.new.no_milestone=Ingen milstolpe
issues.new.clear_milestone=Rensa milstenar
-issues.new.open_milestone=Öppna Milstenar
-issues.new.closed_milestone=Stängda Milstenar
+issues.new.open_milestone=Öppna milstolpar
+issues.new.closed_milestone=Stängda milstolpar
issues.new.assignees=Tilldelade
issues.new.clear_assignees=Rensa tilldelade
-issues.new.no_assignees=Ingen tilldelad
+issues.new.no_assignees=Inga tilldelade
issues.new.no_reviewers=Inga granskare
issues.choose.get_started=Kom igång
issues.choose.open_external_link=Öppna
issues.choose.blank=Standard
issues.choose.blank_about=Skapa ett ärende från standardmall.
-issues.no_ref=Ingen Branch/Tag specificerad
-issues.create=Skapa Ärende
+issues.no_ref=Ingen gren/etikett specificerad
+issues.create=Skapa ärende
issues.new_label=Ny etikett
issues.new_label_placeholder=Etikettsnamn
issues.new_label_desc_placeholder=Beskrivning
-issues.create_label=Skapa Etikett
+issues.create_label=Skapa etikett
issues.label_templates.title=Ladda en fördefinierad uppsättning etiketter
-issues.label_templates.info=Inga etiketter finns ännu. Skapa en etikett med 'Ny etikett' eller använd fördefinierade etiketter:
+issues.label_templates.info=Inga etiketter finns ännu. Skapa en etikett med "Ny etikett" eller använd fördefinierade etiketter:
issues.label_templates.helper=Markera en uppsättning etiketter
issues.label_templates.use=Använd etikettsamling
issues.add_milestone_at=`lade till denna till milstolpe %s %s`
@@ -1000,20 +1086,20 @@ issues.commented_at=`kommenterad %s `
issues.delete_comment_confirm=Är du säker på att du vill ta bort den här kommentaren?
issues.context.copy_link=Kopiera länk
issues.context.quote_reply=Citerat svar
-issues.context.reference_issue=Referens i nytt ärende
+issues.context.reference_issue=Hänvisa till i nytt ärende
issues.context.edit=Redigera
issues.context.delete=Ta bort
-issues.close_comment_issue=Kommentera och stäng
+issues.close_comment_issue=Stäng med kommentar
issues.reopen_issue=Återöppna
-issues.reopen_comment_issue=Kommentera och återöppna
+issues.reopen_comment_issue=Öppna igen med kommentar
issues.create_comment=Kommentera
issues.closed_at=`stängde ärendet %[2]s `
issues.reopened_at=`återöppnade detta ärende %[2]s `
issues.commit_ref_at=`refererade till detta ärende från en incheckning %[2]s `
issues.ref_issue_from=`refererade till detta ärende %[4]s %[2]s `
issues.ref_pull_from=`refererade till denna pull-förfrågan %[4]s %[2]s `
-issues.ref_closing_from=`refererade till en pull-förfrågan %[4]s som kommer att stänga detta ärende %[2]s `
-issues.ref_reopening_from=`refererade till en pull-förfrågan %[4]s som kommer att öppna ärendet på nytt %[2]s `
+issues.ref_closing_from=`hänvisade till detta ärende från en pull-förfrågan %[4]s som kommer att stänga det %[2]s `
+issues.ref_reopening_from=`hänvisade till detta ärende från en pull-förfrågan %[4]s som kommer att öppna ärendet på nytt %[2]s `
issues.ref_closed_from=`stängde detta ärende %[4]s %[2]s `
issues.ref_reopened_from=`öpnnade detta ärende igen %[4]s %[2]s `
issues.ref_from=`från %[1]s`
@@ -1052,11 +1138,11 @@ issues.lock.unknown_reason=Kan inte låsa ärende utan angiven anledning.
issues.lock_duplicate=Ett ärende kan inte låsas två gånger.
issues.unlock_error=Kan inte låsa upp ett olåst ärende.
issues.lock_with_reason=låst som %s och begränsad konversation till medarbetare %s
-issues.lock_no_reason=låst och begränsat konversation till kollaboratörer %s
+issues.lock_no_reason=låst och begränsat konversation till medarbetare %s
issues.unlock_comment=lås upp denna konversation %s
issues.lock_confirm=Lås
issues.unlock_confirm=Lås upp
-issues.lock.notice_1=- Andra användare kan inte kommentera detta ärende.
+issues.lock.notice_1=- Andra användare kan inte kommentera på detta ärende.
issues.lock.notice_2=- Du och andra kollaboratörer med tillgång till denna utvecklingskatalog kan fortfarande skriva kommentarer som andra kan se.
issues.lock.notice_3=- Du kan alltid låsa upp detta ärende senare.
issues.unlock.notice_1=- Alla kommer kunna kommentera detta ärende en gång till.
@@ -1082,7 +1168,7 @@ issues.del_time_history=`raderade tillbringad tid %s`
issues.add_time_hours=Timmar
issues.add_time_minutes=Minuter
issues.add_time_sum_to_small=Inge tid har angivits.
-issues.time_spent_total=Total Tid Spenderad
+issues.time_spent_total=Total tid spenderad
issues.time_spent_from_all_authors=`Total Tid Spenderad: %s`
issues.due_date=Förfallodatum
issues.invalid_due_date_format=Datumsformatet för förfallodatum måste följa 'yyyy-MM-dd'.
@@ -1099,7 +1185,7 @@ issues.due_date_not_set=Inget förfallodatum satt.
issues.due_date_added=lade till förfallodatumet %s %s
issues.due_date_remove=tog bort förfallodatumet %s %s
issues.due_date_overdue=Försenad
-issues.due_date_invalid=Förfallodatumet är ogiltigt eller utanför gränserna. Använd formatet 'åååå-mm-dd'.
+issues.due_date_invalid=Förfallodatumet är ogiltigt eller utanför gränserna. Använd formatet "åååå-mm-dd".
issues.dependency.title=Beroenden
issues.dependency.add=Lägg till beroende…
issues.dependency.cancel=Avbryt
@@ -1129,10 +1215,10 @@ issues.review.approve=godkände dessa ändringar %s
issues.review.comment=granskad av %s
issues.review.left_comment=lämnade en kommentar
issues.review.content.empty=Du måste skriva en kommentar som anger de önskade ändringarna.
-issues.review.reject=begärda ändringar %s
-issues.review.wait=begärdes för granskning %s
-issues.review.add_review_request=begärde granskning från %s %s
-issues.review.remove_review_request=tog bort granskningsbegäran för %s %s
+issues.review.reject=efterfrågade ändringar %s
+issues.review.wait=efterfrågades för granskning %s
+issues.review.add_review_request=efterfrågade granskning från %[1]s %[2]s
+issues.review.remove_review_request=tog bort granskningsförfrågan för %[1]s %[2]s
issues.review.remove_review_request_self=vägrade att granska %s
issues.review.pending=Väntande
issues.review.review=Granska
@@ -1148,21 +1234,21 @@ issues.content_history.options=Alternativ
pulls.desc=Aktivera pull-förfrågningar och kodgranskning.
-pulls.new=Ny Pull-Förfrågan
-pulls.compare_changes=Ny Pull-Request
+pulls.new=Ny pull-förfrågan
+pulls.compare_changes=Ny pull-förfrågan
pulls.compare_changes_desc=Välj branchen att merga in i, och ifrån.
pulls.compare_base=merga in i
pulls.compare_compare=pulla från
pulls.filter_branch=Filtrera gren
pulls.no_results=Inga resultat hittades.
pulls.nothing_to_compare=Dessa brancher är ekvivalenta. Det finns ingen anledning att skapa en pull-request.
-pulls.create=Skapa Pullförfrågan
+pulls.create=Skapa pull-förfrågan
pulls.title_desc_few=vill sammanfoga %[1]d incheckningar från s[2]s
in i %[3]s
pulls.merged_title_desc_few=sammanfogade %[1]d incheckningar från %[2]s
in i %[3]s
%[4]s
pulls.change_target_branch_at=`ändrade mål-branch från %s till %s %s`
pulls.tab_conversation=Konversation
pulls.tab_commits=Incheckningar
-pulls.tab_files=Ändrade Filer
+pulls.tab_files=Ändrade filer
pulls.reopen_to_merge=Vänligen återöppna denna Pull-förfrågan igen för att utföra sammanfogningen.
pulls.cant_reopen_deleted_branch=Denna pull-förfrågan kan inte öppnas igen eftersom branchen tagits bort.
pulls.merged=Sammanfogat
@@ -1199,12 +1285,12 @@ milestones.no_due_date=Inget förfallodatum
milestones.open=Öppna
milestones.close=Stäng
milestones.completeness=%d%% Slutförd
-milestones.create=Skapa Milstolpe
+milestones.create=Skapa milstolpe
milestones.title=Titel
milestones.desc=Beskrivning
milestones.due_date=Förfallodatum (valfritt)
milestones.clear=Rensa
-milestones.invalid_due_date_format=Förfallodatumsformatet måste vara 'yyyy-MM-dd'.
+milestones.invalid_due_date_format=Förfallodatumsformatet måste vara "åååå-mm-dd".
milestones.edit=Redigera milstolpe
milestones.edit_subheader=Milstolpar organiserar ärenden och följer utvecklingens fortskridande.
milestones.cancel=Avbryt
@@ -1232,7 +1318,7 @@ wiki.default_commit_message=Skriv en anteckning om den här uppdateringen (valfr
wiki.save_page=Spara sidan
wiki.last_commit_info=%s redigerade denna sida %s
wiki.edit_page_button=Redigera
-wiki.new_page_button=Ny Sida
+wiki.new_page_button=Ny sida
wiki.back_to_wiki=Tillbaka till wikisidan
wiki.delete_page_button=Tag bort sida
wiki.page_already_exists=Wiki-sida med samma namn finns redan.
@@ -1249,39 +1335,39 @@ activity.period.quarterly=3 månader
activity.period.semiyearly=6 månader
activity.period.yearly=1 år
activity.overview=Översikt
-activity.active_prs_count_1=%d Aktiv Pull begäran
-activity.active_prs_count_n=%d Aktiva Pull begärelser
+activity.active_prs_count_1=%d aktiv pull-förfrågan
+activity.active_prs_count_n=%d aktiva pull-förfrågningar
activity.merged_prs_count_1=Sammanfogad Pull-förfrågan
activity.merged_prs_count_n=Sammanfogade Pull-förfrågningar
-activity.opened_prs_count_1=Föreslagen Pull begäran
-activity.opened_prs_count_n=Föreslagna Pull-förfrågningar
+activity.opened_prs_count_1=Föreslagen pull-förfrågan
+activity.opened_prs_count_n=Föreslagna pull-förfrågningar
activity.title.user_1=%d användare
activity.title.user_n=%d användare
-activity.title.prs_1=%d Pull-begäran
-activity.title.prs_n=%d Pull begärelser
+activity.title.prs_1=%d pull-förfrågningar
+activity.title.prs_n=%d pull-förfrågningar
activity.title.prs_merged_by=%s sammanfogad av %s
activity.title.prs_opened_by=%s föreslås av %s
activity.merged_prs_label=Sammanfogad
activity.opened_prs_label=Föreslagen
-activity.active_issues_count_1=%d Aktivt ärende
-activity.active_issues_count_n=%d Aktiva ärenden
+activity.active_issues_count_1=%d aktivt ärende
+activity.active_issues_count_n=%d aktiva ärenden
activity.closed_issues_count_1=Stängt ärende
activity.closed_issues_count_n=Stängda ärenden
activity.title.issues_1=%d ärende
-activity.title.issues_n=%d Ärenden
+activity.title.issues_n=%d ärenden
activity.title.issues_created_by=%s skapad av %s
activity.closed_issue_label=Stängd
activity.new_issues_count_1=Nytt ärende
activity.new_issues_count_n=Nya ärenden
activity.new_issue_label=Öppnad
-activity.title.unresolved_conv_1=%d Olöst konversation
-activity.title.unresolved_conv_n=%d Olösta konversationer
+activity.title.unresolved_conv_1=%d olöst konversation
+activity.title.unresolved_conv_n=%d olösta konversationer
activity.unresolved_conv_desc=De nyligen förändrade ärendena och pull-requesterna har inte blivit lösta ännu.
activity.unresolved_conv_label=Öppna
-activity.title.releases_1=%d release
-activity.title.releases_n=%d releaser
+activity.title.releases_1=%d utgåva
+activity.title.releases_n=%d utgåvor
activity.title.releases_published_by=%s publicerad av %s
-activity.published_release_label=Publicerad
+activity.published_release_label=Utgåva
activity.no_git_activity=Det har inte gjorts några commit under den här perioden.
activity.git_stats_exclude_merges=Exkludera merger,
activity.git_stats_author_1=%d författare
@@ -1321,34 +1407,34 @@ settings.mirror_settings=Inställningar för spegling
settings.sync_mirror=Synkronisera nu
settings.site=Webbplats
-settings.update_settings=Uppdatera inställningar
-settings.advanced_settings=Advancerade Inställningar
+settings.update_settings=Spara inställningar
+settings.advanced_settings=Avancerade Inställningar
settings.wiki_desc=Aktivera wiki för utvecklingskatalog
-settings.use_internal_wiki=Använd inbyggd Wiki
-settings.use_external_wiki=Använd extern Wiki
-settings.external_wiki_url=Extern Wiki-URL
+settings.use_internal_wiki=Använd inbyggd wiki
+settings.use_external_wiki=Använd extern wiki
+settings.external_wiki_url=URL till extern wiki
settings.external_wiki_url_error=Den externa wiki-länken är inte giltig.
settings.external_wiki_url_desc=Besökare omdirigeras till den externa wiki-länken när de trycker på wiki-tabben.
settings.issues_desc=Aktivera ärendehantering för utvecklingskatalogen
settings.use_internal_issue_tracker=Använd inbyggt ärendehanteringssystem
settings.use_external_issue_tracker=Använd externt ärendehanteringssystem
-settings.external_tracker_url=URL För Extern Ärendehanterare
+settings.external_tracker_url=URL för externt ärendehanteringssystem
settings.external_tracker_url_error=Länken för ärendehanteringsystemet är inte en giltig länk.
settings.external_tracker_url_desc=Besökare dirigeras om till länken för det externa ärendehanteringssystemet när de trycker på ärende-tabben.
-settings.tracker_url_format=URL-Format För Extern Ärendehanterare
+settings.tracker_url_format=URL-format för externt ärendehanteringssystem
settings.tracker_url_format_error=URL-formatet för den extern ärendehanterare är inte en giltig URL.
-settings.tracker_issue_style=Externt ärendenummersformat
+settings.tracker_issue_style=Externt ärendenummerformat
settings.tracker_issue_style.numeric=Numerisk
settings.tracker_issue_style.alphanumeric=Alfanumerisk
settings.tracker_url_format_desc=Använd variablerna {user}
, {repo}
och {index}
för användarnamn, utvecklingskatalogsnamn och ärenderegister.
settings.enable_timetracker=Aktivera tidsredovisning
-settings.allow_only_contributors_to_track_time=Låt endast medarbetare spåra tidsredovisning
-settings.pulls_desc=Aktivera Pull Requests för utvecklingskatalog
+settings.allow_only_contributors_to_track_time=Låt endast medarbetare spåra tid
+settings.pulls_desc=Aktivera pull-förfrågningar för utvecklingskatalog
settings.pulls.ignore_whitespace=Ignorera blanksteg vid konflikter
settings.admin_settings=Administratörsinställningar
settings.admin_enable_health_check=Aktivera hälsokontroll för utvecklingskataloger (git fsck)
settings.admin_enable_close_issues_via_commit_in_any_branch=Stäng ett ärende via en commit gjord i en icke standard-gren
-settings.danger_zone=Högrisksområde
+settings.danger_zone=Farozon
settings.new_owner_has_same_repo=Den nya ägaren har redan ett repo med det namnet. Vänligen välj ett annat namn.
settings.convert=Konvertera till vanlig utvecklingskatalog
settings.convert_desc=Du kan konvertera denna spegling till en vanlig utvecklingskatalog. Detta kan ej ångras.
@@ -1362,15 +1448,15 @@ settings.transfer_desc=Överför denna utvecklingskatalog till en användare ell
settings.transfer_form_title=Ange utvecklingskatalogens namn för att bekräfta:
settings.transfer_notices_1=- Du kommer förlora åtkomst till denna utvecklingskatalog om du för över den till en individuell användare.
settings.transfer_notices_2=- Du kommer behålla åtkomst till utvecklingskatalogen om du för över den till en organisation som du antingen äger eller är delägare i.
-settings.transfer_owner=Ny Ägare
+settings.transfer_owner=Ny ägare
settings.transfer_succeed=Utvecklingskatalogen har flyttats över.
settings.trust_model.collaborator=Medarbetare
-settings.wiki_delete=Ta bort wiki-data
+settings.wiki_delete=Ta bort wikidata
settings.wiki_delete_desc=Borttagning av utvecklingskatalogens wiki-data är permanent och kan ej ångras.
settings.wiki_delete_notices_1=- Detta kommer permanent ta bort och inaktivera utvecklingskatalogens wiki för %s.
-settings.confirm_wiki_delete=Ta bort wiki-data
+settings.confirm_wiki_delete=Ta bort wikidata
settings.wiki_deletion_success=Utvecklingskatalogens wiki-data har blivit borttaget.
-settings.delete=Ta Bort Detta Repo
+settings.delete=Ta bort denna utvecklingskatalog
settings.delete_desc=Borttagning av en utvecklingskatalog är permanent och kan ej ångras.
settings.delete_notices_1=- Denna åtgärd kan INTE ångras.
settings.delete_notices_2=- Denna åtgärd kommer permanent ta bort utvecklingskatalogen %s inklusive kod, ärenden, kommentarer, wiki-data samt medarbetarinställningar.
@@ -1393,12 +1479,12 @@ settings.teams=Grupper
settings.add_team_duplicate=Teamet har redan utvecklingskatalogen
settings.add_team_success=Teamet har nu tillgång till utvecklingskatalogen.
settings.remove_team_success=Teamets åtkomst till utvecklingskatalogen har tagits bort.
-settings.add_webhook=Lägg Till Webbhook
+settings.add_webhook=Lägg till webbhook
settings.hooks_desc=Webhooks gör automatiskt ett HTTP POST anrop mot en server när vissa Forgejo events triggas. Läs mer om detta i webhooks guiden .
-settings.webhook_deletion=Ta bort Webhook
+settings.webhook_deletion=Ta bort webbhook
settings.webhook_deletion_desc=Borttagning utav en webhook tar även bort dess inställningar och leveranshistorik. Vill du fortsätta?
settings.webhook_deletion_success=Webhooken har blivit borttagen.
-settings.webhook.test_delivery=Testa Leverans
+settings.webhook.test_delivery=Testa leverans
settings.webhook.test_delivery_desc=Testa webhooken genom ett testevent.
settings.webhook.request=Begäran
settings.webhook.response=Svar
@@ -1409,19 +1495,19 @@ settings.githook_edit_desc=Om kroken är inaktiv visas exempelinnehåll. Inaktiv
settings.githook_name=Kroknamn
settings.githook_content=Krokinnehåll
settings.update_githook=Uppdatera krok
-settings.add_webhook_desc=Forgejo kommer skicka ett POST
anrop med en specificerad Content-Type till måladressen. Läs mer om detta i webhook guiden .
+settings.add_webhook_desc=Forgejo kommer skicka ett POST
anrop med en specificerad Content-Type till måladressen. Läs mer om detta i webhook-guiden .
settings.payload_url=Mål-URL
settings.http_method=HTTP-metod
-settings.content_type=POST Content Type
+settings.content_type=POST content type
settings.secret=Hemlighet
settings.slack_username=Användarnamn
settings.slack_icon_url=URL för ikon
settings.discord_username=Användarnamn
settings.discord_icon_url=URL för ikon
settings.event_desc=Trigga vid:
-settings.event_push_only=Push Events
-settings.event_send_everything=Alla events
-settings.event_choose=Anpassade events…
+settings.event_push_only=Push-händelser
+settings.event_send_everything=Alla händelser
+settings.event_choose=Anpassade händelser…
settings.event_header_repository=Händelser i utvecklingskatalogen
settings.event_create=Skapa
settings.event_create_desc=Branch eller tagg skapad.
@@ -1461,19 +1547,19 @@ settings.title=Titel
settings.deploy_key_content=Innehåll
settings.key_been_used=En distributionsnyckel med identiskt innehåller används redan.
settings.key_name_used=En distributionsnyckel med samma namn finns redan.
-settings.deploy_key_deletion=Ta bort distributionsnyckel
+settings.deploy_key_deletion=Ta bort driftsättningsnyckel
settings.deploy_key_deletion_desc=Borttagning utav en distributionsnyckel kommer att återkalla dess åtkomst till utvecklingskatalogen. Vill du fortsätta?
settings.deploy_key_deletion_success=Distributionsnyckeln har blivit borttagen.
settings.branches=Brancher
-settings.protected_branch=Branchskydd
+settings.protected_branch=Grenskydd
settings.protected_branch_can_push=Tillåt push?
settings.protected_branch_can_push_yes=Du kan pusha
settings.protected_branch_can_push_no=Du kan inte pusha
-settings.branch_protection=Branchskydd för '%s '
+settings.branch_protection=Skyddsregler för gren "%s "
settings.protect_this_branch=Aktivera branchskydd
-settings.protect_disable_push=Inaktivera Push
+settings.protect_disable_push=Inaktivera push
settings.protect_disable_push_desc=Inga push-förfrågningar kommer att tillåtas till denna branch.
-settings.protect_enable_push=Aktivera Push
+settings.protect_enable_push=Aktivera push
settings.protect_enable_push_desc=Alla med skrivrättigheter kommer att kunna pusha till denna branch (men inte force-pusha).
settings.protect_whitelist_deploy_keys=Vitlista deploy-nyckar med skrivåtkomst till push.
settings.protect_whitelist_users=Vitlistade användare för pushning
@@ -1490,33 +1576,33 @@ settings.protect_check_status_contexts_list=Statuskontroller funna under senaste
settings.protect_required_approvals=Godkännanden som krävs
settings.protect_approvals_whitelist_users=Vitlistade granskare
settings.protect_approvals_whitelist_teams=Vitlistade team för granskning
-settings.require_signed_commits=Kräv signerade commits
+settings.require_signed_commits=Kräv signerade commiter
settings.require_signed_commits_desc=Avvisa pushar till den här grenen om dom är osignerade eller inte verifierbara.
settings.add_protected_branch=Aktivera skydd
settings.delete_protected_branch=Inaktivera skydd
-settings.protected_branch_deletion=Inaktivera skydd för branch
+settings.protected_branch_deletion=Inaktivera grenskydd
settings.protected_branch_deletion_desc=Genom att inaktivera branchskyddet tillåts användare med skrivrättigheter att pusha till branchen. Vill du fortsätta?
settings.default_branch_desc=Välj en standard branch för Pull Requests och Code Commits:
settings.choose_branch=Välj en branch…
settings.no_protected_branch=Det finns inga skyddade brancher.
settings.edit_protected_branch=Ändra
settings.protected_branch_required_approvals_min=Antal erforderliga godkännanden kan inte vara negativa.
-settings.bot_token=Bot Token
+settings.bot_token=Bottoken
settings.chat_id=Chatt-ID
settings.matrix.room_id=Rum-ID
settings.matrix.message_type=Typ av meddelande
-settings.archive.button=Arkivera förråd
-settings.archive.header=Arkivera detta förråd
+settings.archive.button=Arkivera utvecklingskatalog
+settings.archive.header=Arkivera denna utvecklingskatalog
settings.archive.success=Förrådet arkiverades.
settings.archive.error=Ett fel uppstod när utvecklingskatalogen arkiverades. Se loggen för fler detaljer.
settings.archive.error_ismirror=Du kan inte arkivera ett speglat förråd.
-settings.archive.branchsettings_unavailable=Inställningar för grenar är inte tillgängliga om förrådet arkiverats.
+settings.archive.branchsettings_unavailable=Inställningar för grenar är inte tillgängliga för arkiverade utvecklingskataloger.
settings.update_avatar_success=Utvecklingskatalogens avatar har uppdaterats.
settings.lfs=LFS
settings.lfs_filelist=LFS filer lagrade i denna utvecklingskatalog
settings.lfs_no_lfs_files=Inga LFS filer är lagrade i denna utvecklingskatalog
settings.lfs_findcommits=Hitta commits
-settings.lfs_lfs_file_no_commits=Ingen commit hittad för denna LFS fil
+settings.lfs_lfs_file_no_commits=Ingen commit hittad för denna LFS-fil
settings.lfs_locks=Lås
settings.lfs_invalid_locking_path=Ogiltig sökväg: %s
settings.lfs_invalid_lock_directory=Kan inte låsa katalog: %s
@@ -1525,18 +1611,18 @@ settings.lfs_lock=Lås
settings.lfs_lock_path=Filväg att låsa...
settings.lfs_locks_no_locks=Inga lås
settings.lfs_force_unlock=Tvinga upplåsning
-settings.lfs_pointers.sha=Blob SHA
+settings.lfs_pointers.sha=Blobhash
settings.lfs_pointers.oid=OID
settings.lfs_pointers.inRepo=I utvecklingskatalogen
settings.rename_branch_failed_not_exist=Kan inte byta namn på branchen %s eftersom den inte finns.
-diff.browse_source=Bläddra i källkod
+diff.browse_source=Bläddra källkod
diff.parent=förälder
diff.commit=incheckning
diff.git-notes=Anteckningar
-diff.data_not_available=Diff Content ej tillgänglig
-diff.show_split_view=Delad Vy
-diff.show_unified_view=Unifierad Vy
+diff.data_not_available=Diff-innehåll ej tillgänglig
+diff.show_split_view=Delad vy
+diff.show_unified_view=Unifierad vy
diff.whitespace_button=Blanksteg
diff.whitespace_show_everything=Visa alla ändringar
diff.whitespace_ignore_all_whitespace=Ignorera blanksteg när rader jämförs
@@ -1552,12 +1638,12 @@ diff.file_image_height=Höjd
diff.file_byte_size=Storlek
diff.file_suppressed=Filskillnaden har hållits tillbaka eftersom den är för stor
diff.comment.placeholder=Lämna en kommentar
-diff.comment.markdown_info=Styling med markdown stöds.
+diff.comment.markdown_info=Stilisering med Markdown stöds.
diff.comment.add_single_comment=Lägg till en kommentar
diff.comment.add_review_comment=Lägg till kommentar
diff.comment.start_review=Starta granskning
diff.comment.reply=Svara
-diff.review=Granska
+diff.review=Slutför granskning
diff.review.placeholder=Granskningskommentar
diff.review.comment=Kommentar
diff.review.approve=Godkänn
@@ -1566,12 +1652,12 @@ diff.committed_by=committad av
releases.desc=Följ projektversioner och nerladdningar.
release.releases=Släpp
-release.new_release=Nytt Släpp
+release.new_release=Ny utgåva
release.draft=Utkast
-release.prerelease=Försläpp
+release.prerelease=Förutgåva
release.stable=Stabil
release.compare=Jämför
-release.edit=redigera
+release.edit=Redigera
release.ahead.commits=%d committer
release.ahead.target=till %s sedan denna utgåva
release.source_code=Källkod
@@ -1580,23 +1666,23 @@ release.edit_subheader=Releaser organiserar projektversioner.
release.tag_name=Taggnamn
release.target=Mål
release.tag_helper=Välj en existerande tagg eller skapa en ny tagg.
-release.prerelease_desc=Markera som en Pre-Release
+release.prerelease_desc=Markera som en förutgåva
release.prerelease_helper=Markera denna Release olämpliga för användning i produktion.
release.cancel=Avbryt
-release.publish=Publicera Släpp
-release.save_draft=Spara Utkast
-release.edit_release=Uppdatera Release
-release.delete_release=Ta bort Release
-release.deletion=Ta bort Release
+release.publish=Publicera utgåva
+release.save_draft=Spara utkast
+release.edit_release=Uppdatera utgåva
+release.delete_release=Ta bort utgåva
+release.deletion=Ta bort utgåva
release.deletion_success=Releasen har blivit raderad.
release.tag_name_already_exist=En release med denna tagg existerar redan.
release.tag_name_invalid=Taggnamnet är inte giltigt.
release.downloads=Nedladdningar
release.download_count=Nedladdningar: %s
-branch.name=Branch namn
+branch.name=Grennamn
branch.delete_head=Radera
-branch.delete_html=Radera branch
+branch.delete_html=Ta borg gren
branch.create_branch=Skapa branchen %s
branch.deleted_by=Raderad av %s
@@ -1613,7 +1699,7 @@ settings.enter_repo_name = Ange ägar- och utvecklingskatalog-namnet exakt som d
[org]
org_name_holder=Organisationsnamn
-org_full_name_holder=Organisationens Fullständiga Namn
+org_full_name_holder=Fullständigt organisationsnamn
org_name_helper=Organisationsnamn bör vara korta och enkla att komma ihåg.
create_org=Skapa organisation
repo_updated=Uppdaterad %s
@@ -1621,10 +1707,10 @@ members=Medlemmar
teams=Grupper
lower_members=medlemmar
lower_repositories=utvecklingskataloger
-create_new_team=Nytt Team
-create_team=Skapa Team
+create_new_team=Nytt lag
+create_team=Skapa lag
org_desc=Beskrivning
-team_name=Gruppnamn
+team_name=Lagnamn
team_desc=Beskrivning
team_name_helper=Teamnamn bör vara korta och lätta att komma ihåg.
team_desc_helper=Beskriv syftet eller rollen för teamet.
@@ -1651,7 +1737,7 @@ settings.update_settings=Uppdatera inställningar
settings.update_setting_success=Organisationsinställningarna har uppdaterats.
settings.update_avatar_success=Organisationens avatar har uppdateras.
settings.delete=Tag bort organisation
-settings.delete_account=Tag bort denna organisation
+settings.delete_account=Ta bort denna organisationen
settings.delete_prompt=Organisationen kommer tas bort permanent, och det går INTE att ångra detta!
settings.confirm_delete_account=Bekräfta borttagning
settings.delete_org_title=Ta bort organisation
@@ -1662,9 +1748,9 @@ settings.labels_desc=Lägg till etiketter som kan användas till ärenden för <
members.membership_visibility=Synlighet för medlemskap:
members.public=Synlig
-members.public_helper=gör dold
+members.public_helper=Gör dold
members.private=Dold
-members.private_helper=gör synlig
+members.private_helper=Gör synlig
members.member_role=Medlemsroll:
members.owner=Ägare
members.member=Medlem
@@ -1685,18 +1771,18 @@ teams.admin_access_helper=Medlemmar kan pulla och pusha till teamets utvecklings
teams.no_desc=Detta team har ingen beskrivning
teams.settings=Inställningar
teams.owners_permission_desc=Ägare har full åtkomst till alla utvecklingskataloger och har administratörsåtkomst till organisationen.
-teams.members=Teammedlemmar
+teams.members=Lagmedlemmar
teams.update_settings=Uppdatera inställningar
-teams.delete_team=Ta bort team
-teams.add_team_member=Lägg till teammedlem
-teams.delete_team_title=Ta bort team
+teams.delete_team=Ta bort lag
+teams.add_team_member=Lägg till lagmedlem
+teams.delete_team_title=Ta bort lag
teams.delete_team_desc=Borttagning av ett team återkallar åtkomsten till utvecklingskatalogen för dess medlemmar. Vill du fortsätta?
teams.delete_team_success=Teamet har blivit borttaget.
teams.read_permission_desc=Medlemskap i detta team ger läsrättigheter : medlemmar kan se och klona teamets utvecklingskataloger.
teams.write_permission_desc=Medlemskap i detta team ger skrivrättigheter : medlemmar kan läsa och pusha till teamets utvecklingskataloger.
-teams.admin_permission_desc=Medlemskap i detta team ger administratörsrättigheter : medlemmar kan läsa, pusha och lägga till medarbetare till teamets utvecklingskataloger.
+teams.admin_permission_desc=Medlemskap i detta lag ger administratörsrättigheter : medlemmar kan läsa från, pusha till och lägga till medarbetare till lagets utvecklingskataloger.
teams.create_repo_permission_desc=Vidare så ger detta team Skapa utvecklingskatalog rättigheten: medlemmar can skapa nya utvecklingskataloger i organisationen.
-teams.repositories=Teamförråd
+teams.repositories=Lagets utvecklingskataloger
teams.search_repo_placeholder=Sök utvecklingskatalog…
teams.remove_all_repos_title=Ta bort alla utvecklingskataloger för teamet
teams.remove_all_repos_desc=Detta kommer att ta bort alla utvecklingskataloger från teamet.
@@ -1715,10 +1801,10 @@ teams.all_repositories_admin_permission_desc=Detta team beviljar Admin
[admin]
dashboard=Instrumentpanel
-users=Användarkonto
+users=Användarkonton
organizations=Organisationer
repositories=Utvecklingskataloger
-authentication=Autentiseringskälla
+authentication=Autentiseringskällor
config=Konfiguration
notices=Systemaviseringar
monitor=Övervakning
@@ -1728,7 +1814,7 @@ total=Totalt: %d
dashboard.statistic=Översikt
dashboard.operations=Operationer för underhåll
-dashboard.system_status=Status
+dashboard.system_status=Systemstatus
dashboard.operation_name=Operationsnamn
dashboard.operation_switch=Byt till
dashboard.operation_run=Kör
@@ -1741,19 +1827,19 @@ dashboard.resync_all_hooks=Återsynkronisera pre-recieve, update och post-receiv
dashboard.reinit_missing_repos=Återinitialisera alla saknade utvecklingskataloger som vi känner till
dashboard.sync_external_users=Synkronisera extern användardata
dashboard.server_uptime=Serverns upptid
-dashboard.current_goroutine=Aktuella Goroutiner
-dashboard.current_memory_usage=Nuvarande Minnesanvändning
-dashboard.total_memory_allocated=Total Minnesanvändning
+dashboard.current_goroutine=Aktuella gorutiner
+dashboard.current_memory_usage=Nuvarande minnesanvändning
+dashboard.total_memory_allocated=Total minnesanvändning
dashboard.memory_obtained=Minnesåtgång
dashboard.pointer_lookup_times=Pekaruppslagstider
dashboard.memory_allocate_times=Minneallokeringar
dashboard.memory_free_times=Minnesfrigörelser
-dashboard.current_heap_usage=Nuvarande Heap användning
-dashboard.heap_memory_obtained=Heap-minne som erhållits
-dashboard.heap_memory_idle=Heap-minne som är inaktivt
-dashboard.heap_memory_in_use=Heap-minne som används
-dashboard.heap_memory_released=Heap-minne som har släppts
-dashboard.heap_objects=Heap objekt
+dashboard.current_heap_usage=Nuvarande heapanvändning
+dashboard.heap_memory_obtained=Heapminne som erhållits
+dashboard.heap_memory_idle=Heapminne som är inaktivt
+dashboard.heap_memory_in_use=Heapminne som används
+dashboard.heap_memory_released=Heapminne som har släppts
+dashboard.heap_objects=Heapobjekt
dashboard.bootstrap_stack_usage=Bootstrap Stack-användning
dashboard.stack_memory_obtained=Stackminne som erhålls
dashboard.mspan_structures_usage=MSpan strukturanvändning
@@ -1770,7 +1856,7 @@ dashboard.total_gc_pause=Total tid för pauser vid skräpsamling
dashboard.last_gc_pause=Senaste paus vid skräpsamling
dashboard.gc_times=Skräpsamlingstider
-users.user_manage_panel=Hantering av användarkonton
+users.user_manage_panel=Hantera användarkonton
users.new_account=Skapa användarkonto
users.name=Användarnamn
users.full_name=Fullständigt namn
@@ -1779,8 +1865,8 @@ users.admin=Administratör
users.repos=Utvecklingskataloger
users.created=Skapad
users.last_login=Senaste inloggning
-users.never_login=Aldrig varit inloggad
-users.send_register_notify=Skicka notifiering vid användarregistrering
+users.never_login=Aldrig loggat in
+users.send_register_notify=Notifiera om registrering via e-post
users.edit=Redigera
users.auth_source=Autentiseringskälla
users.local=Lokal
@@ -1790,10 +1876,10 @@ users.update_profile_success=Användarkontot har blivit uppdaterat.
users.edit_account=Redigera användarkontot
users.max_repo_creation=Maximalt antal utvecklingskataloger
users.max_repo_creation_desc=(Ange -1 för att använda global satt gräns.)
-users.is_activated=Användarkontot är aktiverat
-users.prohibit_login=Inaktivera inloggning
-users.is_admin=Är administratör
-users.allow_git_hook=Kan skapa Git hooks
+users.is_activated=Aktiverat konto
+users.prohibit_login=Avstängt konto
+users.is_admin=Administratörkonto
+users.allow_git_hook=Kan skapa Git-hooks
users.allow_import_local=Kan importera lokala utvecklingskataloger
users.allow_create_organization=Kan skapa organisationer
users.update_profile=Uppdatera användarkonto
@@ -1809,15 +1895,15 @@ emails.activated=Aktiverad
emails.filter_sort.email=E-post
emails.filter_sort.email_reverse=E-post (omvänd)
emails.filter_sort.name=Användarnamn
-emails.filter_sort.name_reverse=Användarnamn (omvänd)
+emails.filter_sort.name_reverse=Användarnamn (omvänt)
-orgs.org_manage_panel=Organisationshantering
+orgs.org_manage_panel=Hantera organisationer
orgs.name=Namn
orgs.teams=Team
orgs.members=Medlemmar
orgs.new_orga=Ny organisation
-repos.repo_manage_panel=Utvecklingskatalogshantering
+repos.repo_manage_panel=Hantera utvecklingskataloger
repos.owner=Ägare
repos.name=Namn
repos.private=Privat
@@ -1836,7 +1922,7 @@ packages.size=Storlek
systemhooks=Systemets webbhooks
-auths.auth_manage_panel=Hantering av autentiseringkälla
+auths.auth_manage_panel=Hantera autentiseringkällor
auths.new=Lägg till autensieringskälla
auths.name=Namn
auths.type=Typ
@@ -1850,29 +1936,29 @@ auths.domain=Domän
auths.host=Värd
auths.port=Port
auths.bind_dn=Bind DN
-auths.bind_password=Bind Lösenord
+auths.bind_password=Bind lösenord
auths.user_base=Användarsökbas
auths.user_dn=Användarnas DN
auths.attribute_username=Användarnamnsattribut
auths.attribute_username_placeholder=Lämna tomt om du vill använda det användarnamn som angivits i Forgejo.
auths.attribute_name=Förnamnsattribut
auths.attribute_surname=Efternamnsattribut
-auths.attribute_mail=Mejlattribut
+auths.attribute_mail=E-postattribut
auths.attribute_ssh_public_key=Attribut för offentlig SSH-nyckel
-auths.attributes_in_bind=Hämta attribut ur Bind DN Context
+auths.attributes_in_bind=Hämta attribut ur bind DN context
auths.use_paged_search=Använd paginerad sökning
auths.search_page_size=Sidstorlek
auths.filter=Användarfilter
auths.admin_filter=Administratörsfilter
auths.ms_ad_sa=MS AD sökattribut
-auths.smtp_auth=SMTP Autentiseringstyp
+auths.smtp_auth=SMTP autentiseringstyp
auths.smtphost=SMTP-server
auths.smtpport=SMTP-port
-auths.allowed_domains=Tillåtna Domäner
-auths.allowed_domains_helper=Lämna tomt om du vill tillåta alla domäner. Separera flera domäner med ett kommatecken (',').
-auths.skip_tls_verify=Skippa verifikation av TLS
-auths.pam_service_name=PAM Tjänstnamn
-auths.oauth2_provider=OAuth2 leverantör
+auths.allowed_domains=Tillåtna domäner
+auths.allowed_domains_helper=Lämna tomt om du vill tillåta alla domäner. Separera flera domäner med ett kommatecken (",").
+auths.skip_tls_verify=Skippa TLS-verifikation
+auths.pam_service_name=PAM-tjänstnamn
+auths.oauth2_provider=OAuth2-leverantör
auths.oauth2_clientID=Klient ID (Nyckel)
auths.oauth2_clientSecret=Klienthemlighet
auths.openIdConnectAutoDiscoveryURL=OpenID Connect Auto Discovery länk
@@ -1883,8 +1969,8 @@ auths.oauth2_profileURL=Profil-URL
auths.oauth2_emailURL=E-post URL
auths.enable_auto_register=Aktivera Automatisk Registrering
auths.tips=Tips
-auths.tips.oauth2.general=OAuth2 Autensiering
-auths.tip.oauth2_provider=OAuth2 leverantör
+auths.tips.oauth2.general=OAuth2-autensiering
+auths.tip.oauth2_provider=OAuth2-leverantör
auths.tip.bitbucket=Registrera en ny OAuth konsument på %s
auths.tip.dropbox=Skapa en ny applikation på %s
auths.tip.facebook=Registrera en ny appliaktion på %s och lägg till produkten ”Facebook-inloggning”
@@ -1894,40 +1980,40 @@ auths.tip.google_plus=Erhåll inloggningsuppgifter för OAuth2 från Google API-
auths.tip.openid_connect=Använd OpenID Connect Discovery länken (/.well-known/openid-configuration) för att ange slutpunkterna
auths.tip.twitter=Gå till %s, skapa en applikation och försäkra att alternativet "Allow this application to be used to Sign in with Twitter" är aktiverat
auths.tip.discord=Registrera en ny applikation på %s
-auths.edit=Redigera autensieringskälla
+auths.edit=Redigera autentiseringskälla
auths.activated=Denna autentiseringskälla är aktiverad
auths.update_success=Autentiseringskällan har uppdaterats.
-auths.update=Uppdatera autensieringskälla
+auths.update=Uppdatera autentiseringskälla
auths.delete=Ta bort autentiseringskälla
-auths.delete_auth_title=Tag bort denna autentisering
+auths.delete_auth_title=Tag bort autentiseringskälla
auths.delete_auth_desc=Borttagning av en autensieringskälla förhindrar användare från att använda den för inloggning. Vill du fortsätta?
auths.still_in_used=Autentiseringskällan är fortfarande i bruk. Konvertera eller ta bort alla användare som använder denna autentiseringskälla först.
auths.deletion_success=Autentiseringskällan har tagits bort.
-config.server_config=Server-konfiguration
-config.app_name=Sajtens namn
-config.app_ver=Forgejo Version
-config.app_url=Forgejo Bas-URL
-config.custom_conf=Konfigurationsfil
-config.offline_mode=Offlineläge
-config.disable_router_log=Avaktivera Router Loggning
-config.run_user=Kör som användarnamn
+config.server_config=Serverkonfiguration
+config.app_name=Instansnamn
+config.app_ver=Forgejo-version
+config.app_url=Bas-URL för Forgejo
+config.custom_conf=Sökväg för konfigurationsfil
+config.offline_mode=Lokalt läge
+config.disable_router_log=Inaktivera routerloggning
+config.run_user=Användare att köra som
config.run_mode=Exekveringsläge
-config.git_version=Git version
+config.git_version=Git-version
config.repo_root_path=Rotsökväg för utvecklingskatalog
-config.lfs_root_path=LFS Rotsökväg
+config.lfs_root_path=LFS rotsökväg
config.log_file_root_path=Sökväg för loggar
-config.script_type=Script-typ
-config.reverse_auth_user=Motsatt autentiserings användare
+config.script_type=Skripttyp
+config.reverse_auth_user=Autentiseringsanvändare för omvänd proxy
config.ssh_config=SSH-konfiguration
config.ssh_enabled=Aktiverad
-config.ssh_start_builtin_server=Använd inbyggd Server
+config.ssh_start_builtin_server=Använd inbyggd server
config.ssh_port=Port
config.ssh_listen_port=Lyssningsport
config.ssh_root_path=Rotsökväg
config.ssh_key_test_path=Testsökväg för nyckel
-config.ssh_keygen_path=Sökväg för nyckelgenerator ('ssh-keygen')
+config.ssh_keygen_path=Sökväg för nyckelgenerator ("ssh-keygen")
config.ssh_minimum_key_size_check=Kontroll av minsta tillåtna nyckelstorlek
config.ssh_minimum_key_sizes=Minsta tillåtna nyckelstorlek
@@ -1943,48 +2029,48 @@ config.db_ssl_mode=SSL
config.db_path=Sökväg
config.service_config=Tjänstkonfiguration
-config.register_email_confirm=Kräv mejlbekräftelse för att registrera
+config.register_email_confirm=Kräv e-postbekräftelse för att registrera
config.disable_register=Inaktivera självregistrering
config.enable_openid_signup=Aktivera självregistrering genom OpenID
config.enable_openid_signin=Aktivera OpenID-inloggning
config.show_registration_button=Visa registreringsknapp
-config.require_sign_in_view=Kräv inloggning för att visa sidor
-config.mail_notify=Aktivera Mejlnotifikationer
+config.require_sign_in_view=Kräv inloggning för att visa innehåll
+config.mail_notify=Aktivera e-postnotiser
config.enable_captcha=Aktivera CAPTCHA
-config.active_code_lives=Aktivera livstid för koder
-config.default_keep_email_private=Dölj mejladresser som standard
+config.active_code_lives=Livstid för aktiveringskoder
+config.default_keep_email_private=Dölj e-postadresser som standard
config.default_allow_create_organization=Tillåt skapandet utav organisationer som standard
config.enable_timetracking=Aktivera tidsredovisning
-config.default_enable_timetracking=Aktivera tidredovisning som Standard
-config.default_allow_only_contributors_to_track_time=Låt endast medarbetare spåra tidsredovisning
-config.no_reply_address=Dold mejldomän
+config.default_enable_timetracking=Aktivera tidredovisning som standard
+config.default_allow_only_contributors_to_track_time=Låt endast bidragsgivare spåra tid
+config.no_reply_address=Dold e-postdomän
config.webhook_config=Webbkrokskonfiguration
config.queue_length=Kölängd
config.deliver_timeout=Tidsfrist för leverans
-config.skip_tls_verify=Skippa TLS verifiering
+config.skip_tls_verify=Skippa TLS-verifiering
config.mailer_enabled=Aktiverad
config.mailer_name=Namn
config.mailer_smtp_port=SMTP-port
config.mailer_user=Användare
config.mailer_use_sendmail=Använd Sendmail
-config.mailer_sendmail_path=Sendmail sökväg
+config.mailer_sendmail_path=Sökväg för sendmail
config.mailer_sendmail_args=Extra argument till sendmail
-config.send_test_mail=Skicka testmeddelande
+config.send_test_mail=Skicka testmejl
config.oauth_config=OAuth-konfiguration
config.oauth_enabled=Aktiverad
-config.cache_config=Mellanlagringskonfiguration
-config.cache_adapter=Mellanlagringsadapter
-config.cache_interval=Mellanlagringsintervall
-config.cache_conn=Mellanlagringsanslutning
+config.cache_config=Cachekonfiguration
+config.cache_adapter=Cacheadapter
+config.cache_interval=Cacheintervall
+config.cache_conn=Cacheanslutning
config.session_config=Sessionskonfiguration
config.session_provider=Sessionsleverantör
config.provider_config=Leverantörskonfiguration
-config.cookie_name=Cookie-namn
+config.cookie_name=Cookienamn
config.gc_interval_time=Tidsintervall för skräpsamling
config.session_life_time=Livstid för session
config.https_only=Endast HTTPS
@@ -1993,21 +2079,21 @@ config.cookie_life_time=Livstid för kaka
config.picture_config=Konfiguration för bild och avatar
config.picture_service=Bildtjänst
config.disable_gravatar=Inaktivera Gravatar
-config.enable_federated_avatar=Aktivera Förenad Uppslaging av Profilbilder
+config.enable_federated_avatar=Aktivera federerade avatarer
config.git_config=Git-konfiguration
-config.git_disable_diff_highlight=Inaktivera Diff Syntax Highlight
-config.git_max_diff_lines=Max Diff-rader (per fil)
-config.git_max_diff_line_characters=Max Diff-tecken (per rad)
-config.git_max_diff_files=Max Diff-filer (att visa)
+config.git_disable_diff_highlight=Inaktivera syntaxmarkering i diffar
+config.git_max_diff_lines=Maximalt antal diff-rader per fil
+config.git_max_diff_line_characters=Maximalt antal diff-karaktärer per rad
+config.git_max_diff_files=Maximalt antal diff-filer att visa
config.git_gc_args=Skräpsamlarargument
config.git_migrate_timeout=Migreringstimeout
-config.git_mirror_timeout=Spelgingsuppdateringstimeout
-config.git_clone_timeout=Klonoperationstimeout
-config.git_pull_timeout=Klonoperationstimeout
-config.git_gc_timeout=GC-operationstimeout
+config.git_mirror_timeout=Tidsfrist för spegeluppdatering
+config.git_clone_timeout=Tidsfrist för kloning
+config.git_pull_timeout=Tidsfrist för pull
+config.git_gc_timeout=Tidsfrist för skräpsamling
-config.log_config=Logg-konfiguration
+config.log_config=Loggkonfiguration
config.disabled_logger=Inaktiverad
config.xorm_log_sql=Logga SQL
@@ -2034,18 +2120,26 @@ monitor.queue.settings.submit=Uppdatera inställningar
monitor.queue.settings.changed=Inställningar uppdaterade
notices.system_notice_list=Systemnotiser
-notices.view_detail_header=Visa notisdetaljer
-notices.select_all=Markera Alla
+notices.view_detail_header=Notisdetaljer
+notices.select_all=Markera alla
notices.deselect_all=Avmarkera alla
-notices.inverse_selection=Invertera Markeringar
-notices.delete_selected=Ta Bort Markerade
-notices.delete_all=Ta Bort Alla Notiser
+notices.inverse_selection=Invertera markeringar
+notices.delete_selected=Ta bort markerade
+notices.delete_all=Ta bort alla notiser
notices.type=Typ
notices.type_1=Utvecklingskatalog
notices.type_2=Uppgift
notices.desc=Beskrivning
notices.op=Op.
notices.delete_success=Systemnotifikationer har blivit raderade.
+users.2fa = 2FA
+users.reserved = Reserverad
+self_check.database_fix_mysql = För MySQL/MariaDB-användare så kan du använda kommandot ”forgejo doctor convert” för att åtgärda problemet med kollateringen, eller så du åtgärda det genom att manuellt använda SQL "ALTER ... COLLATE ...".
+users.bot = Bott
+users.remote = Fjärråtkomst
+users.restricted.description = Tillåt endast interaktion med utvecklingskataloger och organisationer där den här användaren finns tillagd som medarbetare. Det förhindrar tillgång till allmänna utvecklingskataloger i den här instansen.
+users.is_restricted = Begränsat konto
+self_check.database_inconsistent_collation_columns = Databasen använder kollateringen %s, men dessa kolumner använder felanpassade kollateringar. Det kan komma att orsaka oväntade problem.
[action]
@@ -2058,6 +2152,10 @@ compare_branch=Jämför
compare_commits=Jämför %d commits
compare_commits_general=Jämför commits
mirror_sync_delete=synkade och raderade referens %[2]s
på %[3]s från spegel
+approve_pull_request = `godkände %[3]s#%[2]s `
+create_branch = skapade grenen %[3]s i %[4]s
+starred_repo = stjärnmärkte %[2]s
+watched_repo = började följa %[2]s
[tool]
now=nu
@@ -2145,3 +2243,31 @@ symbolic_link=Symbolisk länk
milestone_kind = Sök milstolpar...
exact = Exakt
exact_tooltip = Inkludera bara resultat som exakt matchar söktermen
+repo_kind = Sök repon...
+user_kind = Sök användare...
+code_kind = Sök kod...
+package_kind = Sök paket...
+runner_kind = Sök exekutorer...
+branch_kind = Sök grenar...
+commit_kind = Sök commiter...
+project_kind = Sök projekt...
+search = Sök...
+type_tooltip = Söktyp
+team_kind = Sök lag...
+org_kind = Sök organisationer...
+issue_kind = Sök ärenden...
+regexp_tooltip = Tolka söktermen som ett reguljärt uttryck
+code_search_unavailable = Kodsökning är för närvarande inte tillgänglig. Vänligen kontakta webbplatsadministratören.
+fuzzy_tooltip = Inkludera resultat som är närliggande till söktermen
+no_results = Inga matchande resultat hittades.
+code_search_by_git_grep = Nuvarande kodsökningsresultat gjordes med "git grep". Det kan finnas bättre resultat om webbplatsadministratören möjliggör indexering av kod.
+fuzzy = Ungefärlig
+union = Nyckelord
+union_tooltip = Inkludera resultat som matchar något av de med mellanslag sepererade sökorden
+pull_kind = Sök ändringsförslag…
+regexp = RegExp
+keyword_search_unavailable = Sökning på nyckelord är för närvarande inte tillgängligt. Vänligen kontakta webbplatsadministratören.
+
+
+[translation_meta]
+test = Det här är en teststräng. Den visas inte i Forgejo UI men används vid testtillfälle. Vänligen skriv in "ok" för att spara tid (eller en intressant fakta du själv väljer) för att nå upp till 100% komplett :)
\ No newline at end of file
diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini
index e596b05878..9a8d716083 100644
--- a/options/locale/locale_tr-TR.ini
+++ b/options/locale/locale_tr-TR.ini
@@ -17,10 +17,10 @@ page=Sayfa
template=Şablon
language=Dil
notifications=Bildirimler
-active_stopwatch=Etkin Zaman Takibi
+active_stopwatch=Etkin Zaman Takipçisi
tracked_time_summary=Konu listesi süzgeçlerine dayanan takip edilen zamanın özeti
create_new=Oluştur…
-user_profile_and_more=Profil ve Ayarlar…
+user_profile_and_more=Profil ve ayarlar…
signed_in_as=Giriş yapan:
enable_javascript=Bu web sitesinin çalışması için JavaScript gereklidir.
toc=İçindekiler Tablosu
@@ -28,12 +28,12 @@ licenses=Lisanslar
return_to_forgejo=Forgejo'ya Dön
username=Kullanıcı Adı
-email=E-posta Adresi
+email=E-posta adresi
password=Parola
access_token=Erişim Kodu
-re_type=Parolayı Doğrula
+re_type=Parolayı doğrula
captcha=CAPTCHA
-twofa=İki Aşamalı Doğrulama
+twofa=İki aşamalı doğrulama
twofa_scratch=İki aşamalı kazınmış kod
passcode=Şifre
@@ -59,10 +59,10 @@ new_migrate=Yeni Göç
new_mirror=Yeni Yansı
new_fork=Yeni Depo Çatalı
new_org=Yeni Organizasyon
-new_project=Yeni Proje
-new_project_column=Yeni Sütun
+new_project=Yeni proje
+new_project_column=Yeni sütun
manage_org=Organizasyonları Yönet
-admin_panel=Site Yönetimi
+admin_panel=Site yönetimi
account_settings=Hesap Ayarları
settings=Ayarlar
your_profile=Profil
@@ -87,9 +87,9 @@ rerun=Yeniden çalıştır
rerun_all=Tüm görevleri yeniden çalıştır
save=Kaydet
add=Ekle
-add_all=Tümünü Ekle
+add_all=Tümünü ekle
remove=Kaldır
-remove_all=Tümünü Kaldır
+remove_all=Tümünü kaldır
remove_label_str=`"%s" öğesini kaldır`
edit=Düzenle
view=Görüntüle
@@ -118,7 +118,7 @@ go_back=Geri Git
never=Asla
unknown=Bilinmiyor
-rss_feed=RSS Beslemesi
+rss_feed=RSS yayını
pin=Sabitle
unpin=Sabitlemeyi kaldır
@@ -141,17 +141,17 @@ confirm_delete_selected=Tüm seçili öğeleri gerçekten silmek istiyor musunuz
name=İsim
value=Değer
-copy_generic = Kopyala
+copy_generic = Panoya kopyala
filter = Filtrele
filter.not_archived = Arşivlenmemiş
filter.clear = Filtreleri Temizle
filter.is_archived = Arşivlenmiş
filter.is_mirror = Yansılaştırılmış
-filter.is_fork = Çatallanmış
-filter.not_fork = Çatallanmamış
+filter.is_fork = Çatallar
+filter.not_fork = Çatallanmayanlar
filter.not_mirror = Yansılanmamış
filter.is_template = Şablon
-filter.not_template = Şablon değil
+filter.not_template = Şablon olmayan
filter.public = Herkese açık
filter.private = Gizli
more_items = Daha fazla öğe
@@ -165,11 +165,12 @@ error413 = Kotanızı doldurdunuz.
toggle_menu = Menüyü aç-kapa
new_migrate.title = Yeni geçiş
new_migrate.link = Yeni geçiş
+copy_path = Dizini kopyala
[aria]
-navbar=Gezinti Çubuğu
+navbar=Gezinti çubuğu
footer=Alt Bilgi
-footer.software=Yazılım Hakkında
+footer.software=Bu yazılım hakkında
footer.links=Bağlantılar
[heatmap]
@@ -195,6 +196,12 @@ buttons.ref.tooltip=Bir konuya veya değişiklik isteğine değin
buttons.switch_to_legacy.tooltip=Eski düzenleyiciyi kullan
buttons.enable_monospace_font=Eşaralıklı yazıtipini etkinleştir
buttons.disable_monospace_font=Eşaralıklı yazıtipini devre dışı bırak
+buttons.new_table.tooltip = Tablo ekle
+table_modal.header = Tablo ekle
+table_modal.placeholder.header = Başlık
+table_modal.placeholder.content = İçerik
+table_modal.label.rows = Satırlar
+table_modal.label.columns = Sütunlar
[filter]
string.asc=A - Z
@@ -224,12 +231,12 @@ install=Kurulum
title=Başlangıç Yapılandırması
docker_helper=Eğer Forgejo'yı Docker içerisinde çalıştırıyorsanız, lütfen herhangi bir değişiklik yapmadan önce belgeleri okuyun.
require_db_desc=Forgejo MySQL, PostgreSQL, SQLite3 veya TiDB (MySQL protokolü) gerektirir.
-db_title=Veritabanı Ayarları
-db_type=Veritabanı Türü
+db_title=Veritabanı ayarları
+db_type=Veritabanı tipi
host=Sunucu
user=Kullanıcı adı
password=Parola
-db_name=Veritabanı Adı
+db_name=Veritabanı adı
db_schema=Şema
db_schema_helper=Veritabanı varsayılanı için boş bırakın ("genel").
ssl_mode=SSL
@@ -248,16 +255,16 @@ err_admin_name_is_reserved=Yönetici Kullanıcı Adı geçersiz, bu kullanıcı
err_admin_name_pattern_not_allowed=Yönetici kullanıcı adı geçersiz, kullanıcı adı ayrılmış bir desenle eşleşiyor
err_admin_name_is_invalid=Yönetici Kullanıcı Adı geçersiz
-general_title=Genel Ayarlar
+general_title=Genel ayarlar
app_name=Site Başlığı
app_name_helper=Şirket adınızı buraya girebilirsiniz.
-repo_path=Depo Kök Yolu
+repo_path=Depo kök dizini
repo_path_helper=Tüm uzak Git depoları bu dizine kaydedilecektir.
-lfs_path=Git LFS Kök Yolu
+lfs_path=Git LFS kök dizini
lfs_path_helper=Git LFS tarafından izlenen dosyalar bu dizinde saklanacaktır. LFS'yi devre dışı bırakmak için boş bırakın.
run_user=Şu Kullanıcı Olarak Çalıştır
run_user_helper=Forgejo'nin çalışacağı işletim sistemi kullanıcı adı. Bu kullanıcının depo kök yoluna erişiminin olması gerektiğini unutmayın.
-domain=Sunucu Alan Adı
+domain=Sunucu alan adı
domain_helper=Sunucu için alan adı veya ana bilgisayar adresi.
ssh_port=SSH Sunucu Portu
ssh_port_helper=SSH sunucusunun dinleyeceği port numarası. Etkisizleştimek için boş bırakın.
@@ -269,15 +276,15 @@ log_root_path=Günlük Dosyaları Yolu
log_root_path_helper=Günlük dosyaları bu dizine kaydedilecektir.
optional_title=İsteğe Bağlı Ayarlar
-email_title=E-posta Ayarları
-smtp_addr=SMTP Sunucusu
-smtp_port=SMTP Portu
+email_title=E-posta ayarları
+smtp_addr=SMTP sunucusu
+smtp_port=SMTP portu
smtp_from=E-posta Gönderen
smtp_from_helper=Forgejo'nın kullanacağı e-posta adresi. Yalın bir e-posta adresi girin veya "İsim" biçimini kullanın.
-mailer_user=SMTP Kullanıcı Adı
-mailer_password=SMTP Parolası
+mailer_user=SMTP kullanıcı adı
+mailer_password=SMTP parolası
register_confirm=Kayıt için E-posta Doğrulaması Gereksin
-mail_notify=E-Posta Bildirimlerini Etkinleştir
+mail_notify=E-Posta bildirimlerini etkinleştir
server_service_title=Sunucu ve Diğer Servis Ayarları
offline_mode=Yerel Kipi Etkinleştir
offline_mode.description=Üçüncü parti içerik teslim ağlarını etkisizleştirin ve bütün kaynakları yerelden sunun.
@@ -297,11 +304,11 @@ enable_captcha.description=Kullanıcının kendi kendine kaydolması için captc
require_sign_in_view=Sayfaları Görüntülemek için Giriş Yapmak Gereksin
require_sign_in_view.description=Sayfa erişimini giriş yapmış kullanıcılarla sınırlandır. Ziyaretçiler sadece oturum açma ve kayıt sayfalarını görecektir.
admin_setting.description=Bir yönetici hesabı açmak isteğe bağlıdır. İlk kayıt olan kullanıcı kendiliğinden yönetici olacaktır.
-admin_title=Yönetici Hesabı Ayarları
-admin_name=Yönetici Kullanıcı Adı
+admin_title=Yönetici hesabı ayarları
+admin_name=Yönetici kullanıcı adı
admin_password=Parola
-confirm_password=Parolayı Doğrula
-admin_email=E-posta Adresi
+confirm_password=Parolayı doğrula
+admin_email=E-posta adresi
install_btn_confirm=Forgejo'u Kur
test_git_failed='git' komut testi başarısız: %v
sqlite3_not_available=Bu Gieta sürümü SQLite3 desteklemiyor. Lütfen %s adresinden resmi çalışır sürümü ('gobuild' sürümünü değil) indirin.
@@ -316,7 +323,7 @@ save_config_failed=%v Yapılandırması kaydedilirken hata oluştu
invalid_admin_setting=Yönetici hesap ayarları geçersiz: %v
invalid_log_root_path=Log dosya yolu geçersiz: %v
default_keep_email_private=E-posta adreslerini varsayılan olarak gizle
-default_keep_email_private.description=Yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle.
+default_keep_email_private.description=Kayıt olunduktan hemen sonra bilgi sızıntısı olmaması için yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle.
default_allow_create_organization=Varsayılan Olarak Organizasyon Oluşturmaya İzin Ver
default_allow_create_organization.description=Varsayılan olarak yeni kullanıcı hesaplarının organizasyon oluşturmasına izin ver.
default_enable_timetracking=Varsayılan Olarak Zaman Takibini Etkinleştir
@@ -326,7 +333,7 @@ no_reply_address_helper=Gizlenmiş e-posta adresine sahip kullanıcılar için a
password_algorithm=Parola Hash Algoritması
invalid_password_algorithm=Hatalı parola hash algoritması
password_algorithm_helper=Parola hash algoritmasını ayarlayın. Algoritmalar değişen gereksinimlere ve güce sahiptirler. argon2 algoritması iyi özelliklere sahip olmasına rağmen fazla miktarda bellek kullanır ve küçük sistemler için uygun olmayabilir.
-enable_update_checker=Güncelleme Denetleyicisini Etkinleştir
+enable_update_checker=Güncelleme denetleyicisini etkinleştir
env_config_keys=Ortam Yapılandırma
env_config_keys_prompt=Aşağıdaki ortam değişkenleri de yapılandırma dosyanıza eklenecektir:
allow_only_external_registration = Sadece dış hizmetler aracılığıyla kullanıcı kaydına izin ver
@@ -336,7 +343,7 @@ enable_update_checker_helper_forgejo = release.forgejo.org adresindeki TXT DNS k
allow_dots_in_usernames = Kullanıcı isimlerinde noktaya izin ver. Var olan kullanıcıları etkilemez.
[home]
-uname_holder=Kullanıcı Adı veya E-Posta Adresi
+uname_holder=Kullanıcı adı veya e-posta adresi
password_holder=Parola
switch_dashboard_context=Panoya Geçiş Yap
my_repos=Depolar
@@ -389,13 +396,13 @@ forks_one = %d çatal
forks_few = %d çatal
[auth]
-create_new_account=Hesap Oluştur
+create_new_account=Hesap oluştur
register_helper_msg=Bir hesabınız var mı? Şimdi giriş yapın!
social_register_helper_msg=Hesabınız var mı? Hemen bağlayın!
disable_register_prompt=Kayıt işlemi devre dışıdır. Lütfen site yöneticinizle iletişim kurun.
disable_register_mail=Kayıt için e-posta doğrulama devre dışıdır.
manual_activation_only=Etkinleştirmeyi tamamlamak için site yöneticinizle bağlantıya geçin.
-remember_me=Bu Aygıtı hatırla
+remember_me=Bu cihazı hatırla
remember_me.compromised=Oturum açma tokeni artık geçerli değil, bu ele geçirilmiş bir hesaba işaret ediyor olabilir. Lütfen hesabınızda olağandışı faaliyet olup olmadığını denetleyin.
forgot_password_title=Şifremi unuttum
forgot_password=Şifrenizi mi unuttunuz?
@@ -414,7 +421,7 @@ has_unconfirmed_mail=Merhaba %s, doğrulanmamış bir e-posta adresin var (%s
resend_mail=Etkinleştirme e-postasını tekrar almak için buraya tıklayın
email_not_associate=Bu e-posta adresi hiçbir hesap ile ilişkilendirilmemiştir.
send_reset_mail=Hesap Kurtarma E-postası Gönder
-reset_password=Hesap Kurtarma
+reset_password=Hesap kurtarma
invalid_code=Doğrulama kodunuz geçersiz veya süresi dolmuş.
invalid_code_forgot_password=Onay kodunuz hatalı veya süresi geçmiş. Yeni bir oturum başlatmak için buraya tıklayın.
invalid_password=Parolanız hesap oluşturulurken kullanılan parolayla eşleşmiyor.
@@ -428,9 +435,9 @@ use_scratch_code=Bir çizgi kodu kullanınız
twofa_scratch_used=Geçici kodunuzu kullandınız. İki aşamalı ayarlar sayfasına yönlendirildiniz, burada aygıt kaydınızı kaldırabilir veya yeni bir geçici kod oluşturabilirsiniz.
twofa_passcode_incorrect=Şifreniz yanlış. Aygıtınızı yanlış yerleştirdiyseniz, oturum açmak için çizgi kodunuzu kullanın.
twofa_scratch_token_incorrect=Çizgi kodunuz doğru değildir.
-login_userpass=Oturum Aç
+login_userpass=Oturum aç
tab_openid=Açık Kimlik
-oauth_signup_tab=Yeni Hesap Oluştur
+oauth_signup_tab=Yeni hesap oluştur
oauth_signup_title=Yeni Hesabı Tamamla
oauth_signup_submit=Hesabı Tamamla
oauth_signin_tab=Mevcut Hesaba Bağla
@@ -466,6 +473,7 @@ sign_up_button = Hemen kaydol.
hint_register = Hesaba ihtiyacın var mı? Hemen kaydol.
sign_in_openid = OpenID ile giriş yap
hint_login = Mevcut hesabın var mı? Hemen giriş yap!
+use_onetime_code = Tek kullanımlık kod kullan
[mail]
view_it_on=%s üzerinde görüntüle
@@ -543,6 +551,7 @@ account_security_caution.text_1 = Eğer bu sizseniz bu e-postayı görmezden gel
password_change.subject = Parolanız değişti
admin.new_user.user_info = Kullanıcı bilgisi
admin.new_user.text = Lütfen bu kullanıcıyı admin panelinden yönetmek için buraya tıklayın .
+password_change.text_1 = Hesabınızın parolası değişti.
[modal]
yes=Evet
@@ -650,6 +659,8 @@ Biography = Biyografi
AccessToken = Erişim jetonu
Location = Konum
Website = Websitesi
+admin_cannot_delete_self = Yöneticiyken kullanıcınızı silemezsiniz. Lütfen önce yönetici yetkilerinizi kaldırın.
+username_error_no_dots = ` sadece alfanumerik karakterler ("0-9","a-z","A-Z"), tire ("-") ve alt tire ("-") içerebilir. Alfanumerik olmayan karakterlerle başlayamaz ve bitemez, ayrıca ardışık alfanumerik olmayan karakterler de kullanılamaz.`
[user]
@@ -690,6 +701,9 @@ followers.title.one = Takipçi
block = Engelle
public_activity.visibility_hint.self_private = Aktiviteniz sadece size ve oluşum yöneticilerine açıktır. Değiştir .
followers_one = %d takipçi
+block_user.detail_2 = Bu kullanıcı sahip olduğunuz depolar, açtığınız sorunlar ve yaptığınız yorumlar ile etkileşime geçemeyecek.
+block_user.detail_1 = Birbirinizden takipten çıkacak ve birbirinizi takip edemeyeceksiniz.
+block_user.detail = Bu kullanıcıyı engellediğinizde:
[settings]
profile=Profil
@@ -3663,7 +3677,7 @@ need_approval_desc=Değişiklik isteği çatalında iş akışı çalıştırmak
variables=Değişkenler
variables.management=Değişken Yönetimi
-variables.creation=Değişken Ekle
+variables.creation=Değişken ekle
variables.none=Henüz hiçbir değişken yok.
variables.deletion=Değişkeni kaldır
variables.deletion.description=Bir değişkeni kaldırma kalıcıdır ve geri alınamaz. Devam edilsin mi?
@@ -3683,6 +3697,7 @@ runs.no_workflows.quick_start = Gitea İşlem'i nasıl başlatacağınızı bilm
type-1.display_name=Kişisel Proje
type-2.display_name=Depo Projesi
type-3.display_name=Organizasyon Projesi
+deleted.display_name = Silinmiş proje
[git.filemode]
changed_filemode=%[1]s → %[2]s
@@ -3714,3 +3729,6 @@ issue_kind = Sorunları ara...
pull_kind = Birleştirme isteklerini ara...
code_search_by_git_grep = Anlık kod araması sonuçları "git grep" komutu tarafından sağlanmaktadır. Site yöneticisinin kod endekslemesini açması durumunda daha iyi sonuçlar verilmesi mümkün olabilir.
keyword_search_unavailable = Anahtar kelime ile arama şu anda kullanıma açık değildir. Lütfen site yöneticisi ile iletişime geçin.
+fuzzy_tooltip = Arama terimine yakın olan eşleşmeleri dahil et
+union_tooltip = Boşlukla ayrılmış anahtar kelime eşleşmelerini dahil et
+exact_tooltip = Sadece arama terimiyle tam uyuşan sonuçları dahit et.
diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini
index 57297e4e0f..472ce499f1 100644
--- a/options/locale/locale_uk-UA.ini
+++ b/options/locale/locale_uk-UA.ini
@@ -143,13 +143,13 @@ filter.clear = Очистити фільтри
filter.is_archived = Архівовано
filter = Фільтри
toggle_menu = Перемкнути видимість меню
-confirm_delete_artifact = Ви впевнені, що хочете видалити артефакт "%s"?
+confirm_delete_artifact = Ви впевнені, що хочете видалити артефакт «%s»?
artifacts = Артефакти
filter.not_archived = Не архівовано
filter.public = Загальнодоступні
filter.private = Приватні
more_items = Більше пунктів
-remove_label_str = Видалити об'єкт "%s"
+remove_label_str = Видалити об'єкт «%s»
new_repo.title = Новий репозиторій
new_migrate.title = Нова міграція
new_org.title = Нова організація
@@ -334,7 +334,7 @@ password_algorithm=Алгоритм хешування пароля
config_location_hint = Ці опції налаштувань будуть збережені в:
env_config_keys = Конфігурація середовища
env_config_keys_prompt = Ці змінні середовища будуть також застосовані до вашого файлу конфігурації:
-invalid_db_table = База даних "%s" недійсна: %v
+invalid_db_table = База даних «%s» недійсна: %v
enable_update_checker = Увімкнути перевірку оновлень
require_db_desc = Forgejo вимагає MySQL, PostgreSQL, SQLite3 чи TiDB (протокол MySQL).
allow_only_external_registration = Дозволити реєстрацію тільки через зовнішні сервіси
@@ -473,6 +473,9 @@ sign_up_button = Зареєструватися.
sign_up_successful = Обліковий запис успішно створений. Вітаємо!
unauthorized_credentials = Хибні або прострочені дані для входу. Спробуйте ще раз або перейдіть до %s по докладнішу інформацію
use_onetime_code = Користати одноразовий код
+oauth.signin.error = Виникла помилка при обробці запиту на авторизацію. Якщо ця помилка буде повторюватись, зверніться до адміністратора сайту.
+authorization_failed_desc = Авторизація не відбулася: виявлено недійсний запит. Будь ласка, зверніться до розробника програми, яку ви намагалися авторизувати.
+password_pwned = Вибраний вами пароль є у списку викрадених паролів , виявлених під час витоків даних. Будь ласка, спробуйте ще раз з іншим паролем. Варто також змінити цей пароль в інших місцях.
[mail]
view_it_on=Переглянути на %s
@@ -553,6 +556,8 @@ account_security_caution.text_2 = Якщо це були не ви, ваш об
totp_enrolled.subject = Ви задіяли TOTP як засіб двофакторної автентифікації
totp_enrolled.text_1.has_webauthn = Ви щойно задіяли TOTP для свого облікового запису. Всі наступні спроби входу вимагатимуть використання TOTP як засобу двофакторної автентифікації або будь-якого з ваших ключів безпеки.
totp_enrolled.text_1.no_webauthn = Ви щойно задіяли TOTP для свого облікового запису. Всі наступні спроби входу вимагатимуть використання TOTP як засобу двофакторної автентифікації.
+totp_disabled.no_2fa = Не налаштовано жодного засобу двофакторної автентифікації. Це означає, що ви можете входити у свій обліковий запис без необхідності використовувати двофакторну автентифікацію.
+removed_security_key.no_2fa = Не налаштовано жодного засобу двофакторної автентифікації. Це означає, що ви можете входити у свій обліковий запис без необхідності використовувати двофакторну автентифікацію.
[modal]
@@ -645,10 +650,22 @@ Pronouns = Займенники
Biography = Про себе
FullName = Повне ім'я
Website = Вебсайт
-url_error = `"%s" є недійсним посиланням.`
+url_error = `«%s» є недійсним посиланням.`
To = Назва гілки
Location = Розташування
AccessToken = Токен доступу
+unable_verify_ssh_key = Не вдалося перевірити ключ SSH, перевірте його на наявність помилок.
+repository_force_private = Увімкнено примусову приватність: приватні репозиторії не можна зробити публічними.
+must_use_public_key = Ключ, який ви надали, є приватним. Будь ласка, нікуди не завантажуйте свій приватний ключ. Використовуйте замість нього публічний ключ.
+openid_been_used = Адреса OpenID «%s» вже використовується.
+still_has_org = Ваш обліковий запис є учасником однієї або декількох організацій, спочатку покиньте їх.
+duplicate_invite_to_team = Цього користувача вже запрошено як учасника команди.
+organization_leave_success = Ви успішно покинули організацію %s.
+include_error = ` має містити підрядок «%s».`
+invalid_group_team_map_error = ` призначення недійсне: %s`
+unsupported_login_type = Цей тип входу не підтримує видалення облікового запису.
+admin_cannot_delete_self = Ви не можете видалити себе, якщо ви є адміністратором. Спочатку зніміть із себе права адміністратора.
+unset_password = Для користувача не встановлено пароль.
[user]
@@ -685,6 +702,8 @@ followers.title.one = Cтежить
followers.title.few = Cтежать
following.title.one = Відстежуваний
following.title.few = Відстежувані
+form.name_reserved = Ім'я користувача «%s» зарезервовано.
+form.name_chars_not_allowed = Ім'я користувача «%s» містить неприпустимі символи.
[settings]
@@ -844,7 +863,7 @@ unbind=Від'єднати
manage_access_token=Токени доступу
generate_new_token=Згенерувати новий токен
tokens_desc=Ці токени надають доступ до вашого облікового запису за допомогою Forgejo API.
-token_name=Ім'я токену
+token_name=Ім'я токена
generate_token=Згенерувати токен
generate_token_success=Ваш новий токен був створений. Скопіюйте його зараз, оскільки він не буде показаний знову.
generate_token_name_duplicate=Назва програми %s вже використовується. Будь ласка, використайте нову.
@@ -861,7 +880,7 @@ oauth2_applications_desc=Програми OAuth2 дають можливість
remove_oauth2_application=Видалити програму OAuth2
remove_oauth2_application_desc=Видалення програми OAuth2 скасовує доступ до всіх підписаних маркерів доступу. Продовжити?
remove_oauth2_application_success=Програму видалено.
-create_oauth2_application=Створити нову програму OAuth2
+create_oauth2_application=Створити новий додаток OAuth2
create_oauth2_application_button=Створити програму
oauth2_application_name=Назва програми
save_application=Зберегти
@@ -930,7 +949,7 @@ hidden_comment_types = Приховані типи коментарів
keep_activity_private = Приховати активність зі сторінки профілю
blocked_users = Заблоковані користувачі
blocked_users_none = Немає заблокованих користувачів.
-profile_desc = Керуйте тим, як ваш профіль відображається іншим користувачам. Ваша основна адреса електронної пошти буде використовуватися для сповіщень, відновлення пароля та операцій з Git через веб-інтерфейс.
+profile_desc = Про себе
retype_new_password = Підтвердіть новий пароль
email_desc = Ваша основна адреса електронної пошти буде використовуватися для сповіщень, відновлення пароля і, за умови, що вона не прихована, для операцій з Git через веб-інтерфейс.
visibility.limited_tooltip = Видимий(а) тільки для авторизованих користувачів
@@ -965,6 +984,28 @@ comment_type_group_pull_request_push = Додані коміти
permissions_public_only = Тільки публічні
select_permissions = Виберіть дозволи
permissions_access_all = Усі (публічні, приватні й обмежені)
+create_oauth2_application_success = Ви успішно створили новий додаток OAuth2.
+keep_email_private_popup = Ваша адреса електронної пошти не буде відображатися у вашому профілі і не буде використовуватися за замовчуванням для комітів, зроблених через веб-інтерфейс, таких як завантаження файлів, редагування і об'єднання комітів. Натомість ви можете використовувати спеціальну адресу %s для прив'язки комітів до свого облікового запису. Ця опція не вплине на існуючі коміти.
+blocked_since = Заблокований з %s
+can_not_add_email_activations_pending = Очікується активація, спробуйте ще раз за кілька хвилин, якщо хочете додати нову адресу електронної пошти.
+ssh_signonly = SSH наразі вимкнено, тому ці ключі використовуються лише для перевірки підпису комітів.
+uid = UID
+at_least_one_permission = Для створення токена необхідно вибрати хоча б один дозвіл
+verify_gpg_key_success = Ключ GPG «%s» перевірено.
+repos_none = Ви не є власником жодного репозиторію.
+add_gpg_key_success = Ключ GPG «%s» додано.
+add_key_success = Ключ SSH «%s» додано.
+permission_no_access = Немає доступу
+permission_write = Читання і запис
+uploaded_avatar_is_too_big = Розмір завантаженого файлу (%d КіБ) перевищує максимальний розмір (%d КіБ).
+verify_ssh_key_success = Ключ SSH «%s» перевірено.
+ssh_invalid_token_signature = Наданий SSH-ключ, підпис або токен не збігаються або токен застарів.
+valid_until_date = Дійсний до %s
+added_on = Додано %s
+key_signature_ssh_placeholder = Починається з «-----BEGIN SSH SIGNATURE-----»
+user_block_yourself = Ви не можете заблокувати себе.
+pronouns_custom_label = Інші займенники
+repo_and_org_access = Доступ до репозиторію та організації
[repo]
owner=Власник
@@ -1004,7 +1045,7 @@ license_helper_desc=Ліцензія регулює те, що інші можу
readme=README
readme_helper=Виберіть шаблон README
readme_helper_desc=Це місце, де ви можете написати повний опис вашого проєкту.
-auto_init=Ініціалізувати репозиторій (Додає .gitignore, License та README)
+auto_init=Ініціалізувати репозиторій
trust_model_helper=Виберіть модель довіри для підтвердження підпису. Можливі варіанти:
trust_model_helper_collaborator=Співавтор: підписи довіри від співавторів
trust_model_helper_committer=Учасник: довірені підписи участників
@@ -1066,7 +1107,7 @@ template.one_item=Слід обрати хоча б один елемент ша
template.invalid=Слід обрати шаблонний репозиторій
archive.issue.nocomment=Цей репозиторій архівовано. Ви не можете коментувати задачі.
-archive.pull.nocomment=Це архівний репозитарій. Ви не можете коментувати пулл-реквести.
+archive.pull.nocomment=Цей репозиторій архівовано. Ви не можете коментувати запити на злиття.
form.reach_limit_of_creation_1=Ви вже досягли ліміту в %d репозиторіїв.
form.reach_limit_of_creation_n=Ви досягли максимальної кількості %d створених репозиторіїв.
@@ -1088,7 +1129,7 @@ migrate_items_merge_requests=Запити на об'єднання
migrate_items_releases=Релізи
migrate_repo=Перенести репозиторій
migrate.clone_address=Міграція / клонувати з URL-адреси
-migrate.clone_address_desc=URL-адреса HTTP(S) або Git "clone" існуючого репозиторія
+migrate.clone_address_desc=URL-адреса HTTP(S) або Git «clone» існуючого репозиторію
migrate.clone_local_path=або шлях до локального серверу
migrate.permission_denied=Вам не дозволено імпортувати локальні репозиторії.
migrate.permission_denied_blocked=Ви не можете імпортувати з заборонених вузлів, будь ласка, попросіть адміністратора перевірити налаштування ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS.
@@ -2070,7 +2111,7 @@ settings.lfs_findcommits=Знайти коміти
settings.lfs_lfs_file_no_commits=Не знайдено комітів для цього файлу LFS
settings.lfs_noattribute=Цей шлях не має атрибуту блокування в гілці за замовчуванням
settings.lfs_delete=Видалити файл LFS з OID %s
-settings.lfs_delete_warning=Видалення файлу LFS може спричинити помилки "Об'єкт не існує" під час перевірки. Ви впевнені?
+settings.lfs_delete_warning=Видалення файлу LFS може спричинити помилки «Об'єкт не існує» під час перевірки. Ви впевнені?
settings.lfs_findpointerfiles=Знайти файли-посилання
settings.lfs_locks=Блокування
settings.lfs_invalid_locking_path=Неприпустимий шлях: %s
@@ -2422,6 +2463,17 @@ editor.add_tmpl.filename = назва файлу
settings.unarchive.button = Розархівувати репозиторій
object_format = Формат об'єкта
settings.archive.mirrors_unavailable = Дзеркала недоступні в архівованих репозиторіях.
+pulls.sign_in_require = Увійдіть , щоб створити новий запит на злиття.
+new_advanced_expand = Натисніть, щоб розгорнути
+new_from_template = Використати шаблон
+new_advanced = Додаткові налаштування
+auto_init_description = Почніть історію Git з README і за бажанням додайте файли License та .gitignore.
+new_from_template_description = Можете вибрати наявний шаблон репозиторію на цьому екземплярі і застосувати його налаштування.
+form.string_too_long = Довжина введеного рядка більша за %d символів.
+form.name_reserved = Назву репозиторію «%s» зарезервовано.
+form.name_pattern_not_allowed = Шаблон «%s» не допускається у назві репозиторію.
+settings.wiki_rename_branch_main_desc = Перейменувати внутрішню гілку, яка використовується у вікі, на «%s». Ця зміна є остаточною і її неможливо скасувати.
+wiki.reserved_page = Назву вікі-сторінки «%s» зарезервовано.
[graphs]
contributors.what = внески
@@ -2542,6 +2594,7 @@ open_dashboard = Відкрити панель управління
follow_blocked_user = Ви не можете стежити за цією організацією, тому що вас у ній заблокували.
teams.invite.description = Щоб приєднатися до команди, натисніть кнопку нижче.
teams.invite.title = Вас запрошено приєднатися до команди %s в організації %s .
+form.name_reserved = Назву організації «%s» зарезервовано.
[admin]
dashboard=Панель управління
@@ -2797,15 +2850,15 @@ auths.tips.oauth2.general=Автентифікація OAuth2
auths.tip.oauth2_provider=Постачальник OAuth2
auths.tip.bitbucket=Створіть OAuth URI на сторінці %s
auths.tip.nextcloud=`Зареєструйте нового споживача OAuth у вашому екземплярі за допомогою наступного меню "Налаштування -> Безпека -> клієнт OAuth 2.0"`
-auths.tip.dropbox=Додайте новий додаток на %s
-auths.tip.facebook=`Створіть новий додаток на %s і додайте модуль "Facebook Login"`
-auths.tip.github=Додайте OAuth додаток на %s
+auths.tip.dropbox=Створіть новий додаток на %s
+auths.tip.facebook=Зареєструйте новий додаток на %s і додайте модуль «Facebook Login»
+auths.tip.github=Зареєструйте новий додаток OAuth на %s
auths.tip.gitlab=Додайте новий додаток на https://gitlab.com/profile/applications
auths.tip.google_plus=Отримайте облікові дані клієнта OAuth2 в консолі Google API на сторінці %s
auths.tip.openid_connect=Використовуйте OpenID Connect Discovery URL (/.well-known/openid-configuration) для автоматичної настройки входу OAuth
auths.tip.twitter=Перейдіть на %s, створіть програму і переконайтеся, що включена опція «Дозволити цю програму для входу в систему за допомогою Twitter»
auths.tip.discord=Зареєструйте новий додаток на %s
-auths.tip.yandex=`Створіть нову програму в %s. Виберіть наступні дозволи з "Yandex. assport API": "Доступ до адреси електронної пошти", "Доступ до аватара" і "Доступ до імені користувача, імені та прізвища, статі"`
+auths.tip.yandex=Створіть новий додаток на %s. Виберіть наступні дозволи з «Yandex.Passport API»: «Доступ до адреси електронної пошти», «Доступ до аватара» і «Доступ до імені користувача, імені та прізвища, статі»
auths.tip.mastodon=Введіть URL спеціального екземпляра для екземпляра mastodon, який ви хочете автентифікувати за допомогою (або використовувати за замовчуванням)
auths.edit=Редагувати джерело автентифікації
auths.activated=Це джерело авторизації активоване
@@ -2830,7 +2883,7 @@ config.disable_router_log=Вимкнути логування роутеру
config.run_user=Користувач, від якого запустити
config.run_mode=Режим виконання
config.git_version=Версія Git
-config.repo_root_path=Кореневий шлях репозиторія
+config.repo_root_path=Шлях до кореня репозиторію
config.lfs_root_path=Кореневий шлях LFS
config.log_file_root_path=Шлях до лог файлу
config.script_type=Тип скрипта
@@ -2953,7 +3006,7 @@ monitor.desc=Опис
monitor.start=Час початку
monitor.execute_time=Час виконання
monitor.process.cancel=Зупинити процес
-monitor.process.cancel_desc=Зупинка процесу може призвести до втрати даних
+monitor.process.cancel_desc=Скасування процесу може призвести до втрати даних
monitor.process.cancel_notices=Зупинити: %s ?
monitor.process.children=Дочірні процеси
@@ -3020,6 +3073,10 @@ monitor.queue.settings.desc = Пули динамічно зростають у
monitor.queue.settings.remove_all_items_done = Усі елементи в черзі видалено.
monitor.queue.settings.remove_all_items = Видалити всі
config.app_slogan = Гасло екземпляра
+auths.tip.gitea = Зареєструйте новий додаток OAuth. Інструкцію можна знайти на %s
+auths.tip.gitlab_new = Зареєструйте новий додаток на %s
+monitor.duration = Тривалість (с)
+users.reserved = Зарезервовано
[action]
@@ -3131,7 +3188,7 @@ arch.version.groups = Група
conda.install = Аби встановити пакунок, використовуючи Conda, запустіть команду:
cargo.install = Аби встановити пакунок, використовуючи Cargo, запустіть команду:
versions.view_all = Переглянути всі
-generic.download = Завантажте пакунок з командного рядка:
+generic.download = Завантажте пакунок із командного рядка:
details = Подробиці
arch.version.optdepends = Необовʼязково залежить
installation = Установлення
@@ -3172,7 +3229,7 @@ debian.repository = Про репозиторій
debian.repository.distributions = Дистрибутиви
alpine.repository.architectures = Архітектури
arch.version.depends = Залежить
-go.install = Встановити пакунок з командного рядка:
+go.install = Встановити пакунок із командного рядка:
debian.repository.architectures = Архітектури
helm.install = Аби встановити пакунок, запустіть команду:
keywords = Ключові слова
@@ -3192,6 +3249,23 @@ npm.dependencies.development = Залежності розробки
rubygems.dependencies.development = Залежності розробки
npm.dependencies.optional = Необов'язкові залежності
container.images.title = Образи
+search_in_external_registry = Шукати в %s
+owner.settings.cleanuprules.keep.count.n = %d версій на пакунок
+settings.delete.description = Видалення пакунка є остаточним і його неможливо скасувати.
+owner.settings.cleanuprules.keep.count.1 = 1 версію на пакунок
+rpm.repository.multiple_groups = Цей пакунок доступний у кількох групах.
+helm.registry = Налаштуйте цей реєстр із командного рядка:
+rpm.registry = Налаштуйте цей реєстр із командного рядка:
+conan.registry = Налаштуйте цей реєстр із командного рядка:
+nuget.registry = Налаштуйте цей реєстр із командного рядка:
+swift.registry = Налаштуйте цей реєстр із командного рядка:
+alt.repository.architectures = Архітектури
+alt.repository = Про репозиторій
+alt.repository.multiple_groups = Цей пакунок доступний у кількох групах.
+alt.install = Встановити пакунок
+alt.registry = Налаштуйте цей реєстр із командного рядка:
+debian.registry = Налаштуйте цей реєстр із командного рядка:
+debian.registry.info = Виберіть $distribution і $component зі списку нижче.
[secrets]
deletion = Видалити секрет
@@ -3307,7 +3381,7 @@ milestone_kind = Шукати віхи...
commit_kind = Шукати коментарі...
no_results = Не знайдено відповідних результатів.
keyword_search_unavailable = Пошук за ключовими словами наразі недоступний. Будь ласка, зв'яжіться з адміністратором сайту.
-code_search_by_git_grep = Поточні результати пошуку коду надаються з "git grep". Тут можуть бути кращі результати, якщо адміністратор сайту ввімкнув індексацію коду.
+code_search_by_git_grep = Поточні результати пошуку коду надаються з «git grep». Тут можуть бути кращі результати, якщо адміністратор сайту ввімкнув індексацію коду.
package_kind = Шукати пакунки...
project_kind = Шукати проєкти...
branch_kind = Шукати гілки...
diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini
index 2ae1e4d947..b17d85cffa 100644
--- a/options/locale/locale_zh-CN.ini
+++ b/options/locale/locale_zh-CN.ini
@@ -126,7 +126,7 @@ unpin=取消置顶
artifacts=制品
confirm_delete_artifact=您确定要删除制品“%s”吗?
-archived=已归档
+archived=已存档
concept_system_global=全局
concept_user_individual=个人
@@ -144,8 +144,8 @@ name=名称
value=值
filter = 筛选
filter.clear = 清除筛选条件
-filter.is_archived = 已归档
-filter.not_archived = 未归档
+filter.is_archived = 已存档
+filter.not_archived = 未存档
filter.is_fork = 是派生
filter.not_fork = 不是派生
filter.is_mirror = 是镜像
@@ -199,7 +199,7 @@ buttons.switch_to_legacy.tooltip=使用旧版编辑器
buttons.enable_monospace_font=启用等宽字体
buttons.disable_monospace_font=禁用等宽字体
buttons.unindent.tooltip = 解除一级嵌套条目
-buttons.indent.tooltip = 解除一级嵌套条目
+buttons.indent.tooltip = 嵌套一级条目
table_modal.header = 添加表格
table_modal.placeholder.header = 标题
table_modal.label.columns = 列数
@@ -364,10 +364,10 @@ filter=其他过滤器
filter_by_team_repositories=按团队仓库筛选
feed_of=`"%s"的源`
-show_archived=已归档
-show_both_archived_unarchived=显示已归档和未归档的
-show_only_archived=只显示已归档的
-show_only_unarchived=只显示未归档的
+show_archived=已存档
+show_both_archived_unarchived=显示已存档和未存档的
+show_only_archived=只显示已存档的
+show_only_unarchived=只显示未存档的
show_private=私有库
show_both_private_public=同时显示公开的和私有的
@@ -747,7 +747,7 @@ webauthn=两步验证(安全密钥)
public_profile=公开信息
biography_placeholder=向他人介绍一下你自己!(支持 Markdown)
location_placeholder=与他人分享你的大概位置
-profile_desc=控制您的个人资料对其他用户的显示方式。您的主要电子邮件地址将用于通知、密码恢复和基于网页界面的 Git 操作。
+profile_desc=关于您
password_username_disabled=不允许非本地用户更改他们的用户名。更多详情请联系您的系统管理员。
full_name=全名
website=个人网站
@@ -838,7 +838,7 @@ add_email_success=新的电子邮件地址已添加。
email_preference_set_success=电子邮件首选项已成功设置。
add_openid_success=新的 OpenID 地址已添加。
keep_email_private=隐藏邮箱地址
-keep_email_private_popup=这将从您的个人资料中隐藏您的电子邮件地址。它将不再是通过 Web 界面创建拉取请求的默认地址,如文件上传和编辑,也不会用于合并提交。相反,可以使用特殊地址 %s 将提交与您的账号相关联。请注意,更改此选项不会影响现有的提交。
+keep_email_private_popup=您的邮件地址不会在个人资料中显示,也不会成为通过网页界面提交的默认地址,例如文件上传、编辑和合并提交。相反,可以使用特殊地址 %s 将提交链接到您的账号。此选项不会影响现有提交。
openid_desc=OpenID 让你可以将认证转发到外部服务。
manage_ssh_keys=管理 SSH 密钥
@@ -898,7 +898,7 @@ ssh_principal_deletion=删除 SSH 证书规则
ssh_key_deletion_desc=删除 SSH 公钥将取消对应的私钥对您的 Forgejo 帐户的访问权限。继续?
gpg_key_deletion_desc=删除 GPG 公钥将无法认知使用对应私钥签名的提交,继续?
ssh_principal_deletion_desc=删除此 SSH 证书规则将取消它对您的账户的访问权限。继续?
-ssh_key_deletion_success=GPG 密钥已被删除。
+ssh_key_deletion_success=SSH 密钥已被删除。
gpg_key_deletion_success=GPG 密钥已被删除。
ssh_principal_deletion_success=此规则删除成功。
added_on=添加于 %s
@@ -1049,11 +1049,13 @@ additional_repo_units_hint_description = 在所有存在未启用的功能的仓
update_hints_success = 提示更改成功。
pronouns_custom = 自定义
pronouns = 代词
-pronouns_unspecified = 不指定
+pronouns_unspecified = 未指定
language.title = 默认语言
keep_activity_private.description = 您的公开活动 将仅对您和实例管理员可见。
language.description = 此语言将保存到您的账号中,并在您登录后用作默认语言。
language.localization_project = 帮助我们将 Forgejo 翻译成您的语言!了解更多 。
+user_block_yourself = 您不能屏蔽自己。
+pronouns_custom_label = 自定义代词
[repo]
new_repo_helper=代码仓库包含了所有的项目文件,包括版本历史记录。已经在其他地方托管了?迁移仓库 。
@@ -1102,7 +1104,7 @@ object_format_helper = 仓库的对象格式,一旦设置无法更改。SHA1
readme=自述
readme_helper=选择自述文件模板
readme_helper_desc=这是您可以为您的项目撰写完整描述的地方。
-auto_init=初始化仓库(添加 .gitignore、许可证和自述文件)
+auto_init=初始化仓库
trust_model_helper=选择签名验证的“信任模型”。可能的选项是:
trust_model_helper_collaborator=协作者:信任协作者的签名
trust_model_helper_committer=提交者:信任与提交者相符的签名
@@ -1142,7 +1144,7 @@ adopt_preexisting_label=收录文件
adopt_preexisting=收录已存在的仓库
adopt_preexisting_content=从 %s 创建仓库
adopt_preexisting_success=从 %s 收录仓库成功
-delete_preexisting_label=刪除
+delete_preexisting_label=删除
delete_preexisting=删除已存在的文件
delete_preexisting_content=删除 %s 中的文件
delete_preexisting_success=删除 %s 中未收录的文件
@@ -1179,10 +1181,10 @@ template.issue_labels=工单标签
template.one_item=必须至少选择一个模板项
template.invalid=必须选择一个模板仓库
-archive.title=该仓库已被归档。您可以查看文件和克隆它,但不能推送、创建工单或合并请求。
-archive.title_date=该仓库已于 %s 归档。您可以查看文件或克隆它,但不能推送、创建工单或合并请求。
-archive.issue.nocomment=此仓库已存档,您不能在此工单添加评论。
-archive.pull.nocomment=此仓库已存档,您不能在此合并请求添加评论。
+archive.title=此仓库已存档。您可以查看文件和克隆仓库,但不能推送、创建工单或合并请求。
+archive.title_date=该仓库已于 %s 存档。您可以查看文件或克隆它,但不能推送、创建工单或合并请求。
+archive.issue.nocomment=此仓库已存档,您不能在工单添加评论。
+archive.pull.nocomment=此仓库已存档,您不能在合并请求添加评论。
form.reach_limit_of_creation_1=你已经达到了 %d 仓库的上限。
form.reach_limit_of_creation_n=你已经达到了 %d 个仓库的上限。
@@ -1607,21 +1609,21 @@ issues.num_comments=%d 条评论
issues.commented_at=`评论于 %s `
issues.delete_comment_confirm=您确定要删除该条评论吗?
issues.context.copy_link=复制链接
-issues.context.quote_reply=引用回复
+issues.context.quote_reply=回复
issues.context.reference_issue=在新工单中引用
issues.context.edit=编辑
-issues.context.delete=刪除
+issues.context.delete=删除
issues.no_content=没有提供说明。
-issues.close=关闭工单
+issues.close=关闭
issues.comment_pull_merged_at=已合并提交 %[1]s 到 %[2]s %[3]s
issues.comment_manually_pull_merged_at=手动合并提交 %[1]s 到 %[2]s %[3]s
issues.close_comment_issue=评论并关闭
issues.reopen_issue=重新开放
issues.reopen_comment_issue=重新打开评论
issues.create_comment=评论
-issues.closed_at=`于 %[2]s 关闭此工单`
+issues.closed_at=`于%[2]s 关闭此工单`
issues.reopened_at=`重新打开此问题 %[2]s `
-issues.commit_ref_at=`于 %[2]s 在代码提交中引用了该工单`
+issues.commit_ref_at=`于%[2]s 在代码提交中引用了该工单`
issues.ref_issue_from=`引用了工单 %[4]s %[2]s `
issues.ref_pull_from=`引用了合并请求 %[4]s %[2]s `
issues.ref_closing_from=`于 %[2]s 从合并请求 %[4]s引用了此工单,将关闭此工单 `
@@ -1655,7 +1657,7 @@ issues.label_title=标签名称
issues.label_description=标签描述
issues.label_color=标签颜色
issues.label_exclusive=独有
-issues.label_archive=归档标签
+issues.label_archive=存档标签
issues.label_archived_filter=显示存档标签
issues.label_archive_tooltip=在标签搜索时,默认情况下存档标签将被排除在外。
issues.label_exclusive_desc=命名标签为 scope/item
以使其与其他以 scope/
开头的标签互斥。
@@ -1791,7 +1793,7 @@ issues.review.pending=待定
issues.review.pending.tooltip=此评论目前对其他用户不可见。 若要提交您的待定评论,请在页面顶部选择 %s -> %s/%s/%s。
issues.review.review=评审
issues.review.reviewers=评审人
-issues.review.outdated=已过期
+issues.review.outdated=已过时
issues.review.outdated_description=评论发布后内容已经修改
issues.review.option.show_outdated_comments=显示过时的评论
issues.review.option.hide_outdated_comments=隐藏过时的评论
@@ -1933,7 +1935,7 @@ pulls.update_branch_success=分支更新成功
pulls.update_not_allowed=您无权更新分支
pulls.outdated_with_base_branch=此分支相比基础分支已过期
pulls.close=关闭
-pulls.closed_at=`于 %[2]s 关闭此合并请求 `
+pulls.closed_at=`于%[2]s 关闭此合并请求 `
pulls.reopened_at=`重新打开此合并请求 %[2]s `
pulls.cmd_instruction_hint=查看命令行说明
pulls.cmd_instruction_checkout_title=检出
@@ -2053,12 +2055,12 @@ activity.merged_prs_count_1=已合并的合并请求
activity.merged_prs_count_n=已合并的合并请求
activity.opened_prs_count_1=新合并请求
activity.opened_prs_count_n=新合并请求
-activity.title.user_1=%d 用户
-activity.title.user_n=%d 用户
+activity.title.user_1=%d 名用户
+activity.title.user_n=%d 名用户
activity.title.prs_1=%d 个合并请求
activity.title.prs_n=%d 个合并请求
-activity.title.prs_merged_by=%[2]s 由 %[1]s 合并
-activity.title.prs_opened_by=%[2]s 创建了 %[1]s
+activity.title.prs_merged_by=%[2]s 共合并了 %[1]s
+activity.title.prs_opened_by=%[2]s 共创建了 %[1]s
activity.merged_prs_label=已合并
activity.opened_prs_label=已创建
activity.active_issues_count_1=%d 项活动的工单
@@ -2067,8 +2069,8 @@ activity.closed_issues_count_1=已关闭的工单
activity.closed_issues_count_n=已关闭的工单
activity.title.issues_1=%d 项工单
activity.title.issues_n=%d 项工单
-activity.title.issues_closed_from=%s 从 %s 被关闭
-activity.title.issues_created_by=%[2]s 创建了 %[1]s
+activity.title.issues_closed_from=%[2]s 共关闭了 %[1]s
+activity.title.issues_created_by=%[2]s 共创建了 %[1]s
activity.closed_issue_label=已关闭
activity.new_issues_count_1=新工单
activity.new_issues_count_n=新工单
@@ -2079,29 +2081,29 @@ activity.unresolved_conv_desc=这些最近更新的工单和合并请求还没
activity.unresolved_conv_label=打开
activity.title.releases_1=%d 个版本发布
activity.title.releases_n=%d 个版本发布
-activity.title.releases_published_by=%[2]s 发布了 %[1]s
+activity.title.releases_published_by=%[2]s 共发布了 %[1]s
activity.published_release_label=版本发布
activity.no_git_activity=在此期间没有任何提交活动。
-activity.git_stats_exclude_merges=排除合并,
-activity.git_stats_author_1=%d 作者
-activity.git_stats_author_n=%d 作者
-activity.git_stats_pushed_1=已经推送
-activity.git_stats_pushed_n=已经推送
-activity.git_stats_commit_1=%d 提交
-activity.git_stats_commit_n=%d 提交
+activity.git_stats_exclude_merges=除去合并提交以外,
+activity.git_stats_author_1=%d 名作者
+activity.git_stats_author_n=%d 名作者
+activity.git_stats_pushed_1=总共推送了
+activity.git_stats_pushed_n=总共推送了
+activity.git_stats_commit_1=%d 个提交
+activity.git_stats_commit_n=%d 个提交
activity.git_stats_push_to_branch=到 %s 和
activity.git_stats_push_to_all_branches=到所有分支。
-activity.git_stats_on_default_branch=在 %s 上,
-activity.git_stats_file_1=%d 文件
-activity.git_stats_file_n=%d 文件
-activity.git_stats_files_changed_1=已经改变
-activity.git_stats_files_changed_n=已经改变
-activity.git_stats_additions=而且
-activity.git_stats_addition_1=新增 %d 行
-activity.git_stats_addition_n=新增 %d 行
-activity.git_stats_and_deletions=和
-activity.git_stats_deletion_1=删除 %d 行
-activity.git_stats_deletion_n=删除 %d 行
+activity.git_stats_on_default_branch=在 %s 分支上,
+activity.git_stats_file_1=%d 个文件
+activity.git_stats_file_n=%d 个文件
+activity.git_stats_files_changed_1=被改动
+activity.git_stats_files_changed_n=被改动
+activity.git_stats_additions=,总共
+activity.git_stats_addition_1=新增了 %d 行
+activity.git_stats_addition_n=新增了 %d 行
+activity.git_stats_and_deletions=并有
+activity.git_stats_deletion_1=%d 行被删除
+activity.git_stats_deletion_n=%d 行被删除
contributors.contribution_type.filter_label=贡献类型:
contributors.contribution_type.commits=提交
@@ -2178,7 +2180,7 @@ settings.external_tracker_url=外部工单系统 URL
settings.external_tracker_url_error=外部百科链接无效。
settings.external_tracker_url_desc=当点击工单标签时,访问者将被重定向到外部工单系统的URL。
settings.tracker_url_format=外部工单系统的 URL 格式
-settings.tracker_url_format_error=外部工单追踪器链接无效
+settings.tracker_url_format_error=外部工单追踪器链接无效。
settings.tracker_issue_style=外部工单系统的编号格式
settings.tracker_issue_style.numeric=纯数字形式
settings.tracker_issue_style.alphanumeric=英文字母数字组合形式
@@ -2322,7 +2324,7 @@ settings.event_choose=自定义事件…
settings.event_header_repository=仓库事件
settings.event_create=创建
settings.event_create_desc=创建分支或标签。
-settings.event_delete=刪除
+settings.event_delete=删除
settings.event_delete_desc=分支或标签已删除。
settings.event_fork=派生
settings.event_fork_desc=仓库被派生。
@@ -2505,20 +2507,20 @@ settings.thread_id=线程 ID
settings.matrix.homeserver_url=主服务器网址
settings.matrix.room_id=房间ID
settings.matrix.message_type=消息类型
-settings.archive.button=归档仓库
-settings.archive.header=归档此仓库
-settings.archive.text=归档仓库将使其完全只读。它将在首页隐藏。没有人(甚至你!)能够进行新的提交,或打开工单及合并请求。
-settings.archive.success=仓库已成功归档。
-settings.archive.error=仓库在归档时出现异常。请通过日志获取详细信息。
-settings.archive.error_ismirror=不能归档镜像仓库。
-settings.archive.branchsettings_unavailable=分支设置对已归档的仓库不可用。
-settings.archive.tagsettings_unavailable=标签设置对已归档的仓库不可用。
-settings.archive.mirrors_unavailable = 镜像对已归档的仓库不可用。
-settings.unarchive.button=撤销仓库归档
-settings.unarchive.header=撤销此仓库归档
-settings.unarchive.text=撤销归档将恢复仓库接收提交、推送,以及新工单和合并请求的能力。
-settings.unarchive.success=仓库已成功撤销归档。
-settings.unarchive.error=仓库在取消归档时出现异常。请通过日志获取详细信息。
+settings.archive.button=存档仓库
+settings.archive.header=存档此仓库
+settings.archive.text=存档仓库将使其完全只读。它将在首页隐藏。没有人(甚至你!)能够进行新的提交,或打开工单及合并请求。
+settings.archive.success=仓库已成功存档。
+settings.archive.error=仓库在存档时出现异常。请通过日志获取详细信息。
+settings.archive.error_ismirror=不能存档镜像仓库。
+settings.archive.branchsettings_unavailable=分支设置对已存档的仓库不可用。
+settings.archive.tagsettings_unavailable=标签设置对已存档的仓库不可用。
+settings.archive.mirrors_unavailable = 镜像对已存档的仓库不可用。
+settings.unarchive.button=撤销仓库存档
+settings.unarchive.header=撤销此仓库存档
+settings.unarchive.text=撤销存档将恢复仓库接收提交、推送,以及新工单和合并请求的能力。
+settings.unarchive.success=仓库已成功撤销存档。
+settings.unarchive.error=仓库在取消存档时出现异常。请通过日志获取详细信息。
settings.update_avatar_success=仓库头像已经更新。
settings.lfs=LFS
settings.lfs_filelist=存储在此仓库中的 LFS 文件
@@ -2659,7 +2661,7 @@ release.tags_for=%s 的标签
branch.name=分支名称
branch.already_exists=名为 %s 的分支已存在。
-branch.delete_head=刪除
+branch.delete_head=删除
branch.delete=删除分支 "%s"
branch.delete_html=删除分支
branch.delete_desc=删除分支是永久的。虽然已删除的分支在实际被删除前有可能会短时间存在,但这在大多数情况下无法撤销。是否继续?
@@ -2750,7 +2752,7 @@ pulls.made_using_agit = AGit
activity.navbar.pulse = 动态
activity.navbar.code_frequency = 代码频率
activity.navbar.recent_commits = 近期提交
-pulls.agit_explanation = 该合并请求是用 AGit 创建的。AGit 是一种可以让贡献者直接通过 “git push” 提出更改代码而不需要派生或建立新分支。
+pulls.agit_explanation = 该合并请求是用 AGit 工作流创建的。使用 AGit,贡献者无需派生或创建分支就可以直接通过 “git push” 提出更改代码。
error.broken_git_hook = 该仓库的 Git 钩子似乎已经损坏,请按照 此文档 来修复这些问题,然后推送一些提交来刷新状态。
pulls.merged_title_desc_one = 已将来自 %[2]s
的 %[1]d 提交合并入 %[3]s
%[4]s
commits.search_branch = 此分支
@@ -2767,7 +2769,7 @@ n_tag_one = %s 标签
n_tag_few = %s 标签
editor.commit_id_not_matching = 您在编辑文件时该文件已被更改。请提交到一个新的分支,然后再将这个新的分支合并回当前分支。
issues.num_participants_one = %d 位参与者
-issues.archived_label_description = (已归档)%s
+issues.archived_label_description = (已存档)%s
editor.push_out_of_date = 推送似乎已过期。
settings.enforce_on_admins = 对仓库的管理员适用该规则
settings.enforce_on_admins_desc = 使仓库管理员也须遵守此规则。
@@ -2802,7 +2804,7 @@ issues.edit.already_changed = 无法保存对工单的更改。工单似乎已
pulls.edit.already_changed = 无法保存对合并请求的更改。内容似乎已经被另一个用户修改了,为了防止修改被覆盖,请刷新页面后再次尝试编辑
comments.edit.already_changed = 无法保存对评论的更改。内容似乎已经被另一个用户修改了,为了防止修改被覆盖,请刷新页面后再次尝试编辑
subscribe.issue.guest.tooltip = 登录以订阅工单。
-subscribe.pull.guest.tooltip = 登录以订阅此拉取请求。
+subscribe.pull.guest.tooltip = 登录以订阅此合并请求。
settings.federation_following_repos = 关注的仓库URL地址,多个地址以 “;” 分隔,不需要前后空格。
settings.federation_settings = 邦联设置
settings.federation_apapiurl = 此仓库的邦联URL地址。将其作为关注的仓库URL地址填写到另一个仓库的邦联设置中。
@@ -2849,9 +2851,24 @@ issues.num_reviews_one = %d 评审
issues.num_reviews_few = %d 评审
issues.summary_card_alt = 仓库 %[2]s 中标题为 %[1]s 的工单的摘要卡片
editor.add_tmpl.filename = 文件名
+settings.default_update_style_desc = 用于更新落后于基础分支的合并请求的默认更新样式。
+pulls.sign_in_require = 登录 以创建新的合并请求。
+new_from_template = 使用模板
+new_from_template_description = 您可以选择此实例上现有仓库模板并应用其设置。
+new_advanced = 高级设置
+new_advanced_expand = 单击展开
+auto_init_description = 以一个自述文件、可选的许可证与 .gitignore 文件开始Git历史。
+issues.reaction.add = 添加回应
+issues.reaction.alt_few = %[1]s 回应了 %[2]s。
+issues.reaction.alt_many = %[1]s 和另外 %[2]d 人回应了 %[3]s。
+issues.reaction.alt_remove = 从评论中移除 %[1] 回应。
+issues.context.menu = 评论菜单
+issues.reaction.alt_add = 对评论添加 %[1]s 回应。
+release.summary_card_alt = 仓库 %[2]s 中标题为 %[1]s 的版本发布的摘要卡片
+summary_card_alt = 仓库 %s 的摘要卡片
[graphs]
-component_loading=正在加载 %s...
+component_loading=正在加载 %s…
component_loading_failed=无法加载 %s
component_loading_info=这可能需要一点…
component_failed_to_load=意外的错误发生了。
@@ -3541,6 +3558,7 @@ users.admin.description = 授予此用户对通过 Web UI 和 API 提供的所
users.restricted.description = 仅允许与添加此用户作为协作者的仓库和组织进行交互。这将阻止访问此实例上的公开仓库。
users.local_import.description = 允许从服务器的本地文件系统导入仓库。这可能是一个安全问题。
users.organization_creation.description = 允许创建新组织。
+monitor.duration = 时长(秒)
[action]
create_repo=创建了仓库 %s
@@ -3801,13 +3819,21 @@ arch.version.backup = 备份
arch.version.checkdepends = 检查依赖
arch.version.makedepends = 编译依赖
container.images.title = 镜像
+search_in_external_registry = 在 %s 中搜索
+alt.registry.install = 要安装此软件包,请运行以下命令:
+alt.install = 安装软件包
+alt.registry = 通过命令行配置此注册表:
+alt.setup = 添加一个仓库到连接的仓库列表(选择必要的架构而非'_arch_'):
+alt.repository = 仓库信息
+alt.repository.architectures = 架构
+alt.repository.multiple_groups = 此软件包在多个组中可用。
[secrets]
secrets=密钥
description=Secrets 将被传给特定的 Actions,其它情况将不能读取
none=还没有密钥。
creation=添加密钥
-creation.name_placeholder=不区分大小写,字母数字或下划线不能以GITEA_ 或 GITHUB_ 开头。
+creation.name_placeholder=不区分大小写,只能包含英文字母、数字或下划线,不能以 GITEA_ 或 GITHUB_ 开头
creation.value_placeholder=输入任何内容,开头和结尾的空白都会被省略
creation.success=您的密钥 '%s' 添加成功。
creation.failed=添加密钥失败。
@@ -3832,8 +3858,8 @@ status.skipped=已忽略
status.blocked=阻塞中
runners=运行器
-runners.runner_manage_panel=管理 Runners
-runners.new=创建 Runner
+runners.runner_manage_panel=管理运行器
+runners.new=创建新运行器
runners.new_notice=如何启动一个运行器
runners.status=状态
runners.id=ID
@@ -3911,7 +3937,7 @@ variables.update.success=该变量已被编辑。
runs.workflow = 工作流
runs.no_job_without_needs = 工作流必须至少包含一组没有依赖的作业。
runs.no_job = 工作流必须至少包含一个作业
-workflow.dispatch.trigger_found = 此工作流有一个 workflow_dispatch 事件触发。
+workflow.dispatch.trigger_found = 此工作流有 workflow_dispatch 事件触发器。
workflow.dispatch.use_from = 使用工作流
workflow.dispatch.invalid_input_type = 输入类型“%s”无效。
workflow.dispatch.warn_input_limit = 仅显示前 %d 个输入。
@@ -3940,18 +3966,18 @@ submodule=子模块
[search]
keyword_search_unavailable = 关键词搜索目前不可用,请联系站点管理员。
-search = 搜索...
-repo_kind = 搜索仓库...
-user_kind = 搜索用户...
-org_kind = 搜索组织...
-team_kind = 搜索团队...
-code_kind = 搜索代码...
+search = 搜索…
+repo_kind = 搜索仓库…
+user_kind = 搜索用户…
+org_kind = 搜索组织…
+team_kind = 搜索团队…
+code_kind = 搜索代码…
code_search_unavailable = 代码搜索目前不可用,请联系站点管理员。
-package_kind = 搜索软件包...
-project_kind = 搜索项目...
-branch_kind = 搜索分支...
-commit_kind = 搜索提交...
-runner_kind = 搜索Runners...
+package_kind = 搜索软件包…
+project_kind = 搜索项目…
+branch_kind = 搜索分支…
+commit_kind = 搜索提交…
+runner_kind = 搜索运行器…
no_results = 未找到匹配的结果。
type_tooltip = 搜索类型
fuzzy = 模糊
@@ -3960,8 +3986,8 @@ match = 匹配
match_tooltip = 仅包含与搜索词完全匹配的结果
fuzzy_tooltip = 在搜索结果中包含与搜索词相近的项目
exact = 精确
-issue_kind = 搜索工单...
-pull_kind = 搜索合并请求...
+issue_kind = 搜索工单…
+pull_kind = 搜索合并请求…
exact_tooltip = 仅包含与搜索词精确匹配的结果
milestone_kind = 搜索里程碑…
union_tooltip = 包括与任何空格分隔的关键字匹配的结果
diff --git a/options/locale_next/locale_ar.json b/options/locale_next/locale_ar.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/options/locale_next/locale_ar.json
@@ -0,0 +1 @@
+{}
diff --git a/options/locale_next/locale_be.json b/options/locale_next/locale_be.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/options/locale_next/locale_be.json
@@ -0,0 +1 @@
+{}
diff --git a/options/locale_next/locale_bg.json b/options/locale_next/locale_bg.json
new file mode 100644
index 0000000000..02144c8b38
--- /dev/null
+++ b/options/locale_next/locale_bg.json
@@ -0,0 +1,10 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "сля %[1]d подаване от %[2]s
в %[3]s
%[4]s",
+ "other": "сля %[1]d подавания от %[2]s
в %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "иска да слее %[1]d подаване от %[2]s
в %[3]s
",
+ "other": "иска да слее %[1]d подавания от %[2]s
в %[3]s
"
+ }
+}
diff --git a/options/locale_next/locale_bn.json b/options/locale_next/locale_bn.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/options/locale_next/locale_bn.json
@@ -0,0 +1 @@
+{}
diff --git a/options/locale_next/locale_bs.json b/options/locale_next/locale_bs.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/options/locale_next/locale_bs.json
@@ -0,0 +1 @@
+{}
diff --git a/options/locale_next/locale_ca.json b/options/locale_next/locale_ca.json
new file mode 100644
index 0000000000..c639c28a99
--- /dev/null
+++ b/options/locale_next/locale_ca.json
@@ -0,0 +1,3 @@
+{
+ "search.milestone_kind": "Cerca fites..."
+}
diff --git a/options/locale_next/locale_cs-CZ.json b/options/locale_next/locale_cs-CZ.json
new file mode 100644
index 0000000000..8d028b8367
--- /dev/null
+++ b/options/locale_next/locale_cs-CZ.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "sloučil %[1]d commit z %[2]s
do %[3]s
%[4]s",
+ "other": "sloučil %[1]d commity z větve %[2]s
do větve %[3]s
před %[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "žádá o sloučení %[1]d commitu z %[2]s
do %[3]s
",
+ "other": "chce sloučit %[1]d commity z větve %[2]s
do %[3]s
"
+ },
+ "search.milestone_kind": "Hledat milníky..."
+}
diff --git a/options/locale_next/locale_da.json b/options/locale_next/locale_da.json
new file mode 100644
index 0000000000..0c2c9a25ea
--- /dev/null
+++ b/options/locale_next/locale_da.json
@@ -0,0 +1,3 @@
+{
+ "search.milestone_kind": "Søg milepæle..."
+}
diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json
new file mode 100644
index 0000000000..f4a15ecdb9
--- /dev/null
+++ b/options/locale_next/locale_de-DE.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "hat %[1]d Commit von %[2]s
nach %[3]s
%[4]s zusammengeführt",
+ "other": "hat %[1]d Commits von %[2]s
nach %[3]s
%[4]s zusammengeführt"
+ },
+ "repo.pulls.title_desc": {
+ "one": "möchte %[1]d Commit von %[2]s
nach %[3]s
zusammenführen",
+ "other": "möchte %[1]d Commits von %[2]s
nach %[3]s
zusammenführen"
+ },
+ "search.milestone_kind": "Meilensteine suchen …"
+}
diff --git a/options/locale_next/locale_el-GR.json b/options/locale_next/locale_el-GR.json
new file mode 100644
index 0000000000..54ee504201
--- /dev/null
+++ b/options/locale_next/locale_el-GR.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "συγχώνευσε %[1]d υποβολή από τον κλάδο %[2]s
στον κλάδο %[3]s
%[4]s",
+ "other": "συγχώνευσε %[1]d υποβολές από %[2]s
σε %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": ": θα ήθελε να συγχωνεύσει %[1]d υποβολή από τον κλάδο %[2]s
στον κλάδο %[3]s
",
+ "other": "θέλει να συγχωνεύσει %[1]d υποβολές από %[2]s
σε %[3]s
"
+ },
+ "search.milestone_kind": "Αναζήτηση ορόσημων..."
+}
diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json
new file mode 100644
index 0000000000..f8b2bcd0f6
--- /dev/null
+++ b/options/locale_next/locale_en-US.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "merged %[1]d commit from %[2]s
into %[3]s
%[4]s",
+ "other": "merged %[1]d commits from %[2]s
into %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "wants to merge %[1]d commit from %[2]s
into %[3]s
",
+ "other": "wants to merge %[1]d commits from %[2]s
into %[3]s
"
+ },
+ "search.milestone_kind": "Search milestones..."
+}
diff --git a/options/locale_next/locale_eo.json b/options/locale_next/locale_eo.json
new file mode 100644
index 0000000000..2c76a8562b
--- /dev/null
+++ b/options/locale_next/locale_eo.json
@@ -0,0 +1,3 @@
+{
+ "search.milestone_kind": "Serĉi celojn..."
+}
diff --git a/options/locale_next/locale_es-ES.json b/options/locale_next/locale_es-ES.json
new file mode 100644
index 0000000000..e95e91f696
--- /dev/null
+++ b/options/locale_next/locale_es-ES.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "fusionó %[1]d commit de %[2]s
en %[3]s
%[4]s",
+ "other": "fusionó %[1]d commits de %[2]s
en %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "quiere fusionar %[1]d commit de %[2]s
en %[3]s
",
+ "other": "quiere fusionar %[1]d commits de %[2]s
en %[3]s
"
+ },
+ "search.milestone_kind": "Buscar hitos…"
+}
diff --git a/options/locale_next/locale_et.json b/options/locale_next/locale_et.json
new file mode 100644
index 0000000000..f8846a15b8
--- /dev/null
+++ b/options/locale_next/locale_et.json
@@ -0,0 +1,3 @@
+{
+ "search.milestone_kind": "Otsi verstapostid..."
+}
diff --git a/options/locale_next/locale_fa-IR.json b/options/locale_next/locale_fa-IR.json
new file mode 100644
index 0000000000..0a703d22d7
--- /dev/null
+++ b/options/locale_next/locale_fa-IR.json
@@ -0,0 +1,8 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "other": "%[1]d کامیت ادغام شده از %[2]s
به %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "other": "قصد ادغام %[1]d تغییر را از %[2]s
به %[3]s
دارد"
+ }
+}
diff --git a/options/locale_next/locale_fi-FI.json b/options/locale_next/locale_fi-FI.json
new file mode 100644
index 0000000000..c4c7e1f7dc
--- /dev/null
+++ b/options/locale_next/locale_fi-FI.json
@@ -0,0 +1,9 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "other": "yhdistetty %[1]d committia lähteestä %[2]s
kohteeseen %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "other": "haluaa yhdistää %[1]d committia lähteestä %[2]s
kohteeseen %[3]s
"
+ },
+ "search.milestone_kind": "Etsi merkkipaaluja..."
+}
diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json
new file mode 100644
index 0000000000..9c57ef16cc
--- /dev/null
+++ b/options/locale_next/locale_fil.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "isinali ang %[1]d commit mula%[2]s
patungong %[3]s
%[4]s",
+ "other": "isinali ang %[1]d mga commit mula sa %[2]s
patungong %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "hinihiling na isama ang %[1]d commit mula %[2]s
patungong %[3]s
",
+ "other": "hiniling na isama ang %[1]d mga commit mula sa %[2]s
patungong %[3]s
"
+ },
+ "search.milestone_kind": "Maghanap ng mga milestone…"
+}
diff --git a/options/locale_next/locale_fr-FR.json b/options/locale_next/locale_fr-FR.json
new file mode 100644
index 0000000000..173b10de21
--- /dev/null
+++ b/options/locale_next/locale_fr-FR.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "fusionné %[1]d commit depuis %[2]s
vers %[3]s
%[4]s",
+ "other": "a fusionné %[1]d révision(s) à partir de %[2]s
vers %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "veut fusionner %[1]d commit depuis %[2]s
vers %[3]s
",
+ "other": "souhaite fusionner %[1]d révision(s) depuis %[2]s
vers %[3]s
"
+ },
+ "search.milestone_kind": "Recherche dans les jalons..."
+}
diff --git a/options/locale_next/locale_gl.json b/options/locale_next/locale_gl.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/options/locale_next/locale_gl.json
@@ -0,0 +1 @@
+{}
diff --git a/options/locale_next/locale_hi.json b/options/locale_next/locale_hi.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/options/locale_next/locale_hi.json
@@ -0,0 +1 @@
+{}
diff --git a/options/locale_next/locale_hu-HU.json b/options/locale_next/locale_hu-HU.json
new file mode 100644
index 0000000000..60c8cfacd3
--- /dev/null
+++ b/options/locale_next/locale_hu-HU.json
@@ -0,0 +1,9 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "other": "egyesítve %[1]d változás(ok) a %[2]s
-ból %[3]s
-ba %[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "other": "egyesíteni szeretné %[1]d változás(oka)t a(z) %[2]s
-ból %[3]s
-ba"
+ },
+ "search.milestone_kind": "Mérföldkövek keresése..."
+}
diff --git a/options/locale_next/locale_id-ID.json b/options/locale_next/locale_id-ID.json
new file mode 100644
index 0000000000..f2dac8114f
--- /dev/null
+++ b/options/locale_next/locale_id-ID.json
@@ -0,0 +1,8 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "other": "commit %[1]d telah digabungkan dari %[2]s
menjadi %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "other": "ingin menggabungkan komit %[1]d dari %[2]s
menuju %[3]s
"
+ }
+}
diff --git a/options/locale_next/locale_is-IS.json b/options/locale_next/locale_is-IS.json
new file mode 100644
index 0000000000..a92d924232
--- /dev/null
+++ b/options/locale_next/locale_is-IS.json
@@ -0,0 +1,5 @@
+{
+ "repo.pulls.title_desc": {
+ "other": "vill sameina %[1]d framlög frá %[2]s
í %[3]s
"
+ }
+}
diff --git a/options/locale_next/locale_it-IT.json b/options/locale_next/locale_it-IT.json
new file mode 100644
index 0000000000..ba90fa154f
--- /dev/null
+++ b/options/locale_next/locale_it-IT.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "ha fuso %[1]d commit da %[2]s
in %[3]s
%[4]s",
+ "other": "ha unito %[1]d commit da %[2]s
a %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "vuole fondere %[1]d commit da %[2]s
in %[3]s
",
+ "other": "vuole unire %[1]d commit da %[2]s
a %[3]s
"
+ },
+ "search.milestone_kind": "Ricerca tappe..."
+}
diff --git a/options/locale_next/locale_ja-JP.json b/options/locale_next/locale_ja-JP.json
new file mode 100644
index 0000000000..f72d1a3fb6
--- /dev/null
+++ b/options/locale_next/locale_ja-JP.json
@@ -0,0 +1,9 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "other": "が %[1]d 個のコミットを %[2]s
から %[3]s
へマージ %[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "other": "が %[2]s
から %[3]s
への %[1]d コミットのマージを希望しています"
+ },
+ "search.milestone_kind": "マイルストーンを検索..."
+}
diff --git a/options/locale_next/locale_ko-KR.json b/options/locale_next/locale_ko-KR.json
new file mode 100644
index 0000000000..2acaca6084
--- /dev/null
+++ b/options/locale_next/locale_ko-KR.json
@@ -0,0 +1,8 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "other": "님이 %[2]s
에서 %[3]s
로 %[1]d 커밋을 %[4]s 병합함"
+ },
+ "repo.pulls.title_desc": {
+ "other": "%[2]s
에서 %[3]s
로 %[1]d개의 커밋들을 병합하려함"
+ }
+}
diff --git a/options/locale_next/locale_lt.json b/options/locale_next/locale_lt.json
new file mode 100644
index 0000000000..d81780a2ab
--- /dev/null
+++ b/options/locale_next/locale_lt.json
@@ -0,0 +1,3 @@
+{
+ "search.milestone_kind": "Ieškoti gairių..."
+}
diff --git a/options/locale_next/locale_lv-LV.json b/options/locale_next/locale_lv-LV.json
new file mode 100644
index 0000000000..a16e3aaf8a
--- /dev/null
+++ b/options/locale_next/locale_lv-LV.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "iekļāva %[1]d iesūtījumu no %[2]s
%[3]s
%[4]s",
+ "other": "Iekļāva %[1]d iesūtījumus no %[2]s
zarā %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "vēlas iekļaut %[1]d iesūtījumu no %[2]s
%[3]s
",
+ "other": "vēlas iekļaut %[1]d iesūtījumus no %[2]s
zarā %[3]s
"
+ },
+ "search.milestone_kind": "Meklēt atskaites punktus..."
+}
diff --git a/options/locale_next/locale_ml-IN.json b/options/locale_next/locale_ml-IN.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/options/locale_next/locale_ml-IN.json
@@ -0,0 +1 @@
+{}
diff --git a/options/locale_next/locale_nb_NO.json b/options/locale_next/locale_nb_NO.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/options/locale_next/locale_nb_NO.json
@@ -0,0 +1 @@
+{}
diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json
new file mode 100644
index 0000000000..564302820a
--- /dev/null
+++ b/options/locale_next/locale_nds.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "hett %[1]d Kommitteren vun %[2]s
na %[3]s
%[4]s tosamenföhrt",
+ "other": "hett %[1]d Kommitterens vun %[2]s
na %[3]s
%[4]s tosamenföhrt"
+ },
+ "repo.pulls.title_desc": {
+ "one": "will %[1]d Kommitteren vun %[2]s
na %[3]s
tosamenföhren",
+ "other": "will %[1]d Kommitterens vun %[2]s
na %[3]s
tosamenföhren"
+ },
+ "search.milestone_kind": "In Markstenen söken …"
+}
diff --git a/options/locale_next/locale_nl-NL.json b/options/locale_next/locale_nl-NL.json
new file mode 100644
index 0000000000..fbb78e9280
--- /dev/null
+++ b/options/locale_next/locale_nl-NL.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "heeft %[1]d commit van %[2]s
samengevoegd in %[3]s
%[4]s",
+ "other": "heeft %[1]d commits samengevoegd van %[2]s
naar %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "wilt %[1]d commit van %[2]s
samenvoegen in %[3]s
",
+ "other": "wilt %[1]d commits van %[2]s
samenvoegen met %[3]s
"
+ },
+ "search.milestone_kind": "Zoek mijlpalen..."
+}
diff --git a/options/locale_next/locale_pl-PL.json b/options/locale_next/locale_pl-PL.json
new file mode 100644
index 0000000000..2edcb573c4
--- /dev/null
+++ b/options/locale_next/locale_pl-PL.json
@@ -0,0 +1,9 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "many": "scala %[1]d commity/ów z %[2]s
do %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "many": "chce scalić %[1]d commity/ów z %[2]s
do %[3]s
"
+ },
+ "search.milestone_kind": "Wyszukaj kamienie milowe..."
+}
diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json
new file mode 100644
index 0000000000..4de44582a5
--- /dev/null
+++ b/options/locale_next/locale_pt-BR.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "mesclou %[1]d commit de %[2]s
em %[3]s
%[4]s",
+ "other": "mesclou %[1]d commits de %[2]s
em %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "quer mesclar %[1]d commit de %[2]s
em %[3]s
",
+ "other": "quer mesclar %[1]d commits de %[2]s
em %[3]s
"
+ },
+ "search.milestone_kind": "Pesquisar marcos..."
+}
diff --git a/options/locale_next/locale_pt-PT.json b/options/locale_next/locale_pt-PT.json
new file mode 100644
index 0000000000..cf72ef3e09
--- /dev/null
+++ b/options/locale_next/locale_pt-PT.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "integrou %[1]d cometimento do ramo %[2]s
no ramo %[3]s
%[4]s",
+ "other": "integrou %[1]d cometimento(s) do ramo %[2]s
no ramo %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "quer integrar %[1]d cometimento do ramo %[2]s
no ramo %[3]s
",
+ "other": "quer integrar %[1]d cometimento(s) do ramo %[2]s
no ramo %[3]s
"
+ },
+ "search.milestone_kind": "Procurar etapas..."
+}
diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json
new file mode 100644
index 0000000000..36f54f405b
--- /dev/null
+++ b/options/locale_next/locale_ru-RU.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "слит %[1]d коммит из %[2]s
в %[3]s
%[4]s",
+ "many": "слито %[1]d коммит(ов) из %[2]s
в %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "хочет влить %[1]d коммит из %[2]s
в %[3]s
",
+ "many": "хочет влить %[1]d коммит(ов) из %[2]s
в %[3]s
"
+ },
+ "search.milestone_kind": "Найти этапы..."
+}
diff --git a/options/locale_next/locale_si-LK.json b/options/locale_next/locale_si-LK.json
new file mode 100644
index 0000000000..0cdd44acd0
--- /dev/null
+++ b/options/locale_next/locale_si-LK.json
@@ -0,0 +1,8 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "other": "මර්ජ්%[1]d සිට %[2]s
දක්වා %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "other": "%[1]d සිට %[2]s
දක්වා %[3]s
"
+ }
+}
diff --git a/options/locale_next/locale_sk-SK.json b/options/locale_next/locale_sk-SK.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/options/locale_next/locale_sk-SK.json
@@ -0,0 +1 @@
+{}
diff --git a/options/locale_next/locale_sl.json b/options/locale_next/locale_sl.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/options/locale_next/locale_sl.json
@@ -0,0 +1 @@
+{}
diff --git a/options/locale_next/locale_sr-SP.json b/options/locale_next/locale_sr-SP.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/options/locale_next/locale_sr-SP.json
@@ -0,0 +1 @@
+{}
diff --git a/options/locale_next/locale_sv-SE.json b/options/locale_next/locale_sv-SE.json
new file mode 100644
index 0000000000..de7099ad3a
--- /dev/null
+++ b/options/locale_next/locale_sv-SE.json
@@ -0,0 +1,9 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "other": "sammanfogade %[1]d incheckningar från %[2]s
in i %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "other": "vill sammanfoga %[1]d incheckningar från s[2]s
in i %[3]s
"
+ },
+ "search.milestone_kind": "Sök milstolpar..."
+}
diff --git a/options/locale_next/locale_tr-TR.json b/options/locale_next/locale_tr-TR.json
new file mode 100644
index 0000000000..f98b339245
--- /dev/null
+++ b/options/locale_next/locale_tr-TR.json
@@ -0,0 +1,9 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "other": "%[4]s %[2]s
içindeki %[1]d işlemeyi %[3]s
ile birleştirdi"
+ },
+ "repo.pulls.title_desc": {
+ "other": "%[2]s
içindeki %[1]d işlemeyi %[3]s
ile birleştirmek istiyor"
+ },
+ "search.milestone_kind": "Kilometre taşlarını ara..."
+}
diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json
new file mode 100644
index 0000000000..ce37b9bef3
--- /dev/null
+++ b/options/locale_next/locale_uk-UA.json
@@ -0,0 +1,11 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "one": "об'єднав %[1]d коміт з %[2]s
в %[3]s
%[4]s",
+ "many": "об'єднав %[1]d комітів з %[2]s
в %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "хоче об'єднати %[1]d коміт з %[2]s
в %[3]s
",
+ "many": "хоче об'єднати %[1]d комітів з %[2]s
в %[3]s
"
+ },
+ "search.milestone_kind": "Шукати віхи..."
+}
diff --git a/options/locale_next/locale_vi.json b/options/locale_next/locale_vi.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/options/locale_next/locale_vi.json
@@ -0,0 +1 @@
+{}
diff --git a/options/locale_next/locale_yi.json b/options/locale_next/locale_yi.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/options/locale_next/locale_yi.json
@@ -0,0 +1 @@
+{}
diff --git a/options/locale_next/locale_zh-CN.json b/options/locale_next/locale_zh-CN.json
new file mode 100644
index 0000000000..10b1c9a4be
--- /dev/null
+++ b/options/locale_next/locale_zh-CN.json
@@ -0,0 +1,9 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "other": "于 %[4]s 将 %[1]d 次代码提交从 %[2]s
合并至 %[3]s
"
+ },
+ "repo.pulls.title_desc": {
+ "other": "请求将 %[1]d 次代码提交从 %[2]s
合并至 %[3]s
"
+ },
+ "search.milestone_kind": "搜索里程碑…"
+}
diff --git a/options/locale_next/locale_zh-HK.json b/options/locale_next/locale_zh-HK.json
new file mode 100644
index 0000000000..6baf89e022
--- /dev/null
+++ b/options/locale_next/locale_zh-HK.json
@@ -0,0 +1,5 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "other": "於 %[4]s 將 %[1]d 次代碼提交從 %[2]s
合併至 %[3]s
"
+ }
+}
diff --git a/options/locale_next/locale_zh-TW.json b/options/locale_next/locale_zh-TW.json
new file mode 100644
index 0000000000..d04e04c264
--- /dev/null
+++ b/options/locale_next/locale_zh-TW.json
@@ -0,0 +1,9 @@
+{
+ "repo.pulls.merged_title_desc": {
+ "other": "將 %[1]d 次提交從 %[2]s
合併至 %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "other": "請求將 %[1]d 次程式碼提交從 %[2]s
合併至 %[3]s
"
+ },
+ "search.milestone_kind": "搜尋里程碑..."
+}
diff --git a/package-lock.json b/package-lock.json
index ae637779dd..33ff9157ca 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,12 +10,12 @@
"@citation-js/plugin-software-formats": "0.6.1",
"@github/markdown-toolbar-element": "2.2.3",
"@github/quote-selection": "2.1.0",
- "@github/relative-time-element": "4.4.4",
+ "@github/relative-time-element": "4.4.5",
"@github/text-expander-element": "2.8.0",
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
"@primer/octicons": "19.14.0",
"ansi_up": "6.0.2",
- "asciinema-player": "3.8.0",
+ "asciinema-player": "3.8.2",
"chart.js": "4.4.5",
"chartjs-adapter-dayjs-4": "1.0.4",
"chartjs-plugin-zoom": "2.2.0",
@@ -26,18 +26,18 @@
"easymde": "2.18.0",
"esbuild-loader": "4.2.2",
"escape-goat": "4.0.0",
- "fast-glob": "3.3.2",
+ "fast-glob": "3.3.3",
"htmx.org": "1.9.12",
- "idiomorph": "0.4.0",
+ "idiomorph": "0.3.0",
"jquery": "3.7.1",
- "katex": "0.16.18",
+ "katex": "0.16.21",
"mermaid": "11.4.1",
"mini-css-extract-plugin": "2.9.2",
"minimatch": "10.0.1",
- "monaco-editor": "0.51.0",
+ "monaco-editor": "0.52.2",
"monaco-editor-webpack-plugin": "7.1.0",
"pdfobject": "2.3.0",
- "postcss": "8.4.49",
+ "postcss": "8.5.1",
"postcss-loader": "8.1.1",
"postcss-nesting": "13.0.1",
"pretty-ms": "9.0.0",
@@ -69,7 +69,7 @@
"@typescript-eslint/parser": "8.18.2",
"@vitejs/plugin-vue": "5.1.5",
"@vitest/coverage-v8": "2.1.8",
- "@vitest/eslint-plugin": "1.1.20",
+ "@vitest/eslint-plugin": "1.1.22",
"@vue/test-utils": "2.4.6",
"eslint": "9.17.0",
"eslint-import-resolver-typescript": "3.7.0",
@@ -86,16 +86,16 @@
"eslint-plugin-vue-scoped-css": "2.9.0",
"eslint-plugin-wc": "2.2.0",
"globals": "15.14.0",
- "happy-dom": "15.11.7",
+ "happy-dom": "16.3.0",
"license-checker-rseidelsohn": "4.4.2",
"markdownlint-cli": "0.43.0",
- "postcss-html": "1.7.0",
+ "postcss-html": "1.8.0",
"stylelint": "16.12.0",
"stylelint-declaration-block-no-ignored-properties": "2.8.0",
"stylelint-declaration-strict-value": "1.10.6",
"stylelint-value-no-unknown-custom-properties": "6.0.1",
"svgo": "3.2.0",
- "typescript": "5.7.2",
+ "typescript": "5.7.3",
"typescript-eslint": "8.18.2",
"vite-string-plugin": "1.3.4",
"vitest": "2.1.8"
@@ -190,9 +190,9 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.26.3",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz",
- "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz",
+ "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -280,14 +280,14 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.26.3",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz",
- "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz",
+ "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.26.3",
- "@babel/types": "^7.26.3",
+ "@babel/parser": "^7.26.5",
+ "@babel/types": "^7.26.5",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^3.0.2"
@@ -310,13 +310,13 @@
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
- "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
+ "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/compat-data": "^7.25.9",
+ "@babel/compat-data": "^7.26.5",
"@babel/helper-validator-option": "^7.25.9",
"browserslist": "^4.24.0",
"lru-cache": "^5.1.1",
@@ -473,9 +473,9 @@
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
- "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
+ "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -501,15 +501,15 @@
}
},
"node_modules/@babel/helper-replace-supers": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz",
- "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz",
+ "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-member-expression-to-functions": "^7.25.9",
"@babel/helper-optimise-call-expression": "^7.25.9",
- "@babel/traverse": "^7.25.9"
+ "@babel/traverse": "^7.26.5"
},
"engines": {
"node": ">=6.9.0"
@@ -590,12 +590,12 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.26.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
- "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz",
+ "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.26.3"
+ "@babel/types": "^7.26.5"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -869,13 +869,13 @@
}
},
"node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz",
- "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz",
+ "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.26.5"
},
"engines": {
"node": ">=6.9.0"
@@ -1097,14 +1097,14 @@
}
},
"node_modules/@babel/plugin-transform-flow-strip-types": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz",
- "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.26.5.tgz",
+ "integrity": "sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/plugin-syntax-flow": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/plugin-syntax-flow": "^7.26.0"
},
"engines": {
"node": ">=6.9.0"
@@ -1316,13 +1316,13 @@
}
},
"node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz",
- "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==",
+ "version": "7.26.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz",
+ "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.26.5"
},
"engines": {
"node": ">=6.9.0"
@@ -1925,17 +1925,17 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.26.4",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz",
- "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz",
+ "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.26.3",
- "@babel/parser": "^7.26.3",
+ "@babel/generator": "^7.26.5",
+ "@babel/parser": "^7.26.5",
"@babel/template": "^7.25.9",
- "@babel/types": "^7.26.3",
+ "@babel/types": "^7.26.5",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -1954,9 +1954,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.26.3",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
- "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz",
+ "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.25.9",
@@ -2823,18 +2823,32 @@
}
},
"node_modules/@eslint/plugin-kit": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz",
- "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==",
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz",
+ "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
+ "@eslint/core": "^0.10.0",
"levn": "^0.4.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
+ "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz",
+ "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==",
+ "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/@github/combobox-nav": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/@github/combobox-nav/-/combobox-nav-2.3.1.tgz",
@@ -2854,9 +2868,9 @@
"license": "MIT"
},
"node_modules/@github/relative-time-element": {
- "version": "4.4.4",
- "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.4.4.tgz",
- "integrity": "sha512-Oi8uOL8O+ZWLD7dHRWCkm2cudcTYtB3VyOYf9BtzCgDGm+OKomyOREtItNMtWl1dxvec62BTKErq36uy+RYxQg==",
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.4.5.tgz",
+ "integrity": "sha512-9ejPtayBDIJfEU8x1fg/w2o5mahHkkp1SC6uObDtoKs4Gn+2a1vNK8XIiNDD8rMeEfpvDjydgSZZ+uk+7N0VsQ==",
"license": "MIT"
},
"node_modules/@github/text-expander-element": {
@@ -3418,9 +3432,9 @@
"license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz",
- "integrity": "sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz",
+ "integrity": "sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==",
"cpu": [
"arm"
],
@@ -3432,9 +3446,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz",
- "integrity": "sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz",
+ "integrity": "sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==",
"cpu": [
"arm64"
],
@@ -3446,9 +3460,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz",
- "integrity": "sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz",
+ "integrity": "sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==",
"cpu": [
"arm64"
],
@@ -3460,9 +3474,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz",
- "integrity": "sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz",
+ "integrity": "sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==",
"cpu": [
"x64"
],
@@ -3474,9 +3488,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz",
- "integrity": "sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz",
+ "integrity": "sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==",
"cpu": [
"arm64"
],
@@ -3488,9 +3502,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz",
- "integrity": "sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz",
+ "integrity": "sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==",
"cpu": [
"x64"
],
@@ -3502,9 +3516,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz",
- "integrity": "sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz",
+ "integrity": "sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==",
"cpu": [
"arm"
],
@@ -3516,9 +3530,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz",
- "integrity": "sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz",
+ "integrity": "sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==",
"cpu": [
"arm"
],
@@ -3530,9 +3544,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz",
- "integrity": "sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz",
+ "integrity": "sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==",
"cpu": [
"arm64"
],
@@ -3544,9 +3558,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz",
- "integrity": "sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz",
+ "integrity": "sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==",
"cpu": [
"arm64"
],
@@ -3558,9 +3572,9 @@
]
},
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz",
- "integrity": "sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz",
+ "integrity": "sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==",
"cpu": [
"loong64"
],
@@ -3572,9 +3586,9 @@
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz",
- "integrity": "sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz",
+ "integrity": "sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==",
"cpu": [
"ppc64"
],
@@ -3586,9 +3600,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz",
- "integrity": "sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz",
+ "integrity": "sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==",
"cpu": [
"riscv64"
],
@@ -3600,9 +3614,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz",
- "integrity": "sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz",
+ "integrity": "sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==",
"cpu": [
"s390x"
],
@@ -3614,9 +3628,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz",
- "integrity": "sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz",
+ "integrity": "sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==",
"cpu": [
"x64"
],
@@ -3628,9 +3642,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz",
- "integrity": "sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz",
+ "integrity": "sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==",
"cpu": [
"x64"
],
@@ -3642,9 +3656,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz",
- "integrity": "sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz",
+ "integrity": "sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==",
"cpu": [
"arm64"
],
@@ -3656,9 +3670,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz",
- "integrity": "sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz",
+ "integrity": "sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==",
"cpu": [
"ia32"
],
@@ -3670,9 +3684,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz",
- "integrity": "sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz",
+ "integrity": "sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==",
"cpu": [
"x64"
],
@@ -4474,9 +4488,9 @@
"license": "MIT"
},
"node_modules/@types/d3-shape": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz",
- "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==",
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz",
+ "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==",
"license": "MIT",
"dependencies": {
"@types/d3-path": "*"
@@ -4594,9 +4608,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "22.10.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz",
- "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==",
+ "version": "22.10.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz",
+ "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==",
"license": "MIT",
"dependencies": {
"undici-types": "~6.20.0"
@@ -4893,9 +4907,9 @@
}
},
"node_modules/@vitest/eslint-plugin": {
- "version": "1.1.20",
- "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.20.tgz",
- "integrity": "sha512-2eLsgUm+GVOpDfNyH2do//MiNO/WZkXrPi+EjDmXEdUt6Jwnziq4H221L8vJE0aJys+l1FRfSkm4QbaIyDCfBg==",
+ "version": "1.1.22",
+ "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.22.tgz",
+ "integrity": "sha512-ztvy2+thiCMmKnywvKGhH3AcKgEMGd4BsFK2QC9/EXqlyjXDp7Pg96PonbLx8bDvNCAjq4hfCw5YuZSAz1EDIg==",
"dev": true,
"license": "MIT",
"peerDependencies": {
@@ -5010,6 +5024,13 @@
"url": "https://opencollective.com/vitest"
}
},
+ "node_modules/@vitest/runner/node_modules/pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@vitest/snapshot": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz",
@@ -5035,6 +5056,13 @@
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
+ "node_modules/@vitest/snapshot/node_modules/pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@vitest/spy": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz",
@@ -5674,9 +5702,9 @@
}
},
"node_modules/asciinema-player": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/asciinema-player/-/asciinema-player-3.8.0.tgz",
- "integrity": "sha512-yFoAcjFK9WJ0D+aagkT0YXOWRbyXoOe/TQHq07oQP6prItXQkWn46fdvUb6zqJu2AywmY8VjBEwZ6ciL8IbezQ==",
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/asciinema-player/-/asciinema-player-3.8.2.tgz",
+ "integrity": "sha512-Lgcnj9u/H6sRpGRX1my7Azcay6llLmB/GVkCGcDbPwdTVTisS1ir8SQ9jRWRvjlLUjpSJkN0euruvy3sLRM8tw==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.21.0",
@@ -5893,9 +5921,9 @@
}
},
"node_modules/browserslist": {
- "version": "4.24.3",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz",
- "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==",
+ "version": "4.24.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
"funding": [
{
"type": "opencollective",
@@ -6063,9 +6091,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001690",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz",
- "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==",
+ "version": "1.0.30001695",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz",
+ "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==",
"funding": [
{
"type": "opencollective",
@@ -6440,13 +6468,13 @@
"license": "MIT"
},
"node_modules/core-js-compat": {
- "version": "3.39.0",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz",
- "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==",
+ "version": "3.40.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz",
+ "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "browserslist": "^4.24.2"
+ "browserslist": "^4.24.3"
},
"funding": {
"type": "opencollective",
@@ -6658,9 +6686,9 @@
"license": "MIT"
},
"node_modules/cytoscape": {
- "version": "3.30.4",
- "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.4.tgz",
- "integrity": "sha512-OxtlZwQl1WbwMmLiyPSEBuzeTIQnwZhJYYWFzZ2PhEHVFwpeaqNIkUzSiso00D98qk60l8Gwon2RP304d3BJ1A==",
+ "version": "3.31.0",
+ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.31.0.tgz",
+ "integrity": "sha512-zDGn1K/tfZwEnoGOcHc0H4XazqAAXAuDpcYw9mUnUjATjqljyCNGJv8uEvbvxGaGHaVshxMecyl6oc6uKzRfbw==",
"license": "MIT",
"engines": {
"node": ">=0.10"
@@ -7436,9 +7464,9 @@
}
},
"node_modules/domutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
- "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@@ -7530,9 +7558,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.75",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz",
- "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==",
+ "version": "1.5.83",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz",
+ "integrity": "sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==",
"license": "ISC"
},
"node_modules/emoji-regex": {
@@ -7606,9 +7634,9 @@
}
},
"node_modules/es-abstract": {
- "version": "1.23.7",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.7.tgz",
- "integrity": "sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==",
+ "version": "1.23.9",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz",
+ "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7623,10 +7651,11 @@
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.0.0",
- "es-set-tostringtag": "^2.0.3",
+ "es-set-tostringtag": "^2.1.0",
"es-to-primitive": "^1.3.0",
"function.prototype.name": "^1.1.8",
- "get-intrinsic": "^1.2.6",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.0",
"get-symbol-description": "^1.1.0",
"globalthis": "^1.0.4",
"gopd": "^1.2.0",
@@ -7647,9 +7676,12 @@
"object-inspect": "^1.13.3",
"object-keys": "^1.1.1",
"object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
"regexp.prototype.flags": "^1.5.3",
"safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
"safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
"string.prototype.trim": "^1.2.10",
"string.prototype.trimend": "^1.0.9",
"string.prototype.trimstart": "^1.0.8",
@@ -7711,15 +7743,15 @@
}
},
"node_modules/es-module-lexer": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
- "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
+ "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
"license": "MIT"
},
"node_modules/es-object-atoms": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
- "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7730,15 +7762,16 @@
}
},
"node_modules/es-set-tostringtag": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
- "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.2.4",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
- "hasown": "^2.0.1"
+ "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -8525,16 +8558,16 @@
"license": "Apache-2.0"
},
"node_modules/fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
- "micromatch": "^4.0.4"
+ "micromatch": "^4.0.8"
},
"engines": {
"node": ">=8.6.0"
@@ -8573,9 +8606,19 @@
"license": "MIT"
},
"node_modules/fast-uri": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz",
- "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz",
+ "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
"license": "BSD-3-Clause"
},
"node_modules/fastest-levenshtein": {
@@ -8588,9 +8631,9 @@
}
},
"node_modules/fastq": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
+ "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
"license": "ISC",
"dependencies": {
"reusify": "^1.0.4"
@@ -8819,22 +8862,22 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz",
- "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==",
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
+ "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
- "dunder-proto": "^1.0.0",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.0.0",
"function-bind": "^1.1.2",
+ "get-proto": "^1.0.0",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
- "math-intrinsics": "^1.0.0"
+ "math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -8843,6 +8886,20 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/get-set-props": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/get-set-props/-/get-set-props-0.2.0.tgz",
@@ -9098,13 +9155,12 @@
}
},
"node_modules/happy-dom": {
- "version": "15.11.7",
- "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-15.11.7.tgz",
- "integrity": "sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==",
+ "version": "16.3.0",
+ "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-16.3.0.tgz",
+ "integrity": "sha512-Q71RaIhyS21vhW17Tpa5W36yqQXIlE1TZ0A0Gguts8PShUSQE/7fBgxYGxgm3+5y0gF6afdlAVHLQqgrIcfRzg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "entities": "^4.5.0",
"webidl-conversions": "^7.0.0",
"whatwg-mimetype": "^3.0.0"
},
@@ -9314,10 +9370,10 @@
}
},
"node_modules/idiomorph": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/idiomorph/-/idiomorph-0.4.0.tgz",
- "integrity": "sha512-VdXFpZOTXhLatJmhCWJR5oQKLXT01O6sFCJqT0/EqG71C4tYZdPJ5etvttwWsT2WKRYWz160XkNr1DUqXNMZHg==",
- "license": "BSD-2-Clause"
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/idiomorph/-/idiomorph-0.3.0.tgz",
+ "integrity": "sha512-UhV1Ey5xCxIwR9B+OgIjQa+1Jx99XQ1vQHUsKBU1RpQzCx1u+b+N6SOXgf5mEJDqemUI/ffccu6+71l2mJUsRA==",
+ "license": "BSD 2-Clause"
},
"node_modules/ieee754": {
"version": "1.2.1",
@@ -9496,13 +9552,16 @@
"license": "MIT"
},
"node_modules/is-async-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
- "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz",
+ "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -9680,13 +9739,16 @@
}
},
"node_modules/is-generator-function": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
- "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
+ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.0",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -10368,9 +10430,9 @@
"license": "MIT"
},
"node_modules/katex": {
- "version": "0.16.18",
- "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.18.tgz",
- "integrity": "sha512-LRuk0rPdXrecAFwQucYjMiIs0JFefk6N1q/04mlw14aVIVgxq1FO0MA9RiIIGVaKOB5GIP5GH4aBBNraZERmaQ==",
+ "version": "0.16.21",
+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz",
+ "integrity": "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==",
"funding": [
"https://opencollective.com/katex",
"https://github.com/sponsors/katex"
@@ -10786,9 +10848,9 @@
}
},
"node_modules/markdownlint-cli/node_modules/glob": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz",
- "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==",
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz",
+ "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -11109,21 +11171,21 @@
}
},
"node_modules/mlly": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz",
- "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==",
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz",
+ "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==",
"license": "MIT",
"dependencies": {
"acorn": "^8.14.0",
- "pathe": "^1.1.2",
- "pkg-types": "^1.2.1",
+ "pathe": "^2.0.1",
+ "pkg-types": "^1.3.0",
"ufo": "^1.5.4"
}
},
"node_modules/monaco-editor": {
- "version": "0.51.0",
- "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.51.0.tgz",
- "integrity": "sha512-xaGwVV1fq343cM7aOYB6lVE4Ugf0UyimdD/x5PWcWBMKENwectaEu77FAN7c5sFiyumqeJdX1RPTh1ocioyDjw==",
+ "version": "0.52.2",
+ "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz",
+ "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==",
"license": "MIT"
},
"node_modules/monaco-editor-webpack-plugin": {
@@ -11436,6 +11498,24 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -11604,9 +11684,9 @@
}
},
"node_modules/pathe": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
- "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz",
+ "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==",
"license": "MIT"
},
"node_modules/pathval": {
@@ -11726,14 +11806,14 @@
}
},
"node_modules/pkg-types": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz",
- "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
"license": "MIT",
"dependencies": {
"confbox": "^0.1.8",
- "mlly": "^1.7.2",
- "pathe": "^1.1.2"
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
}
},
"node_modules/playwright": {
@@ -11815,9 +11895,9 @@
}
},
"node_modules/postcss": {
- "version": "8.4.49",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
- "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
+ "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
"funding": [
{
"type": "opencollective",
@@ -11834,7 +11914,7 @@
],
"license": "MIT",
"dependencies": {
- "nanoid": "^3.3.7",
+ "nanoid": "^3.3.8",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@@ -11843,15 +11923,15 @@
}
},
"node_modules/postcss-html": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.7.0.tgz",
- "integrity": "sha512-MfcMpSUIaR/nNgeVS8AyvyDugXlADjN9AcV7e5rDfrF1wduIAGSkL4q2+wgrZgA3sHVAHLDO9FuauHhZYW2nBw==",
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.8.0.tgz",
+ "integrity": "sha512-5mMeb1TgLWoRKxZ0Xh9RZDfwUUIqRrcxO2uXO+Ezl1N5lqpCiSU5Gk6+1kZediBfBHFtPCdopr2UZ2SgUsKcgQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"htmlparser2": "^8.0.0",
"js-tokens": "^9.0.0",
- "postcss": "^8.4.0",
+ "postcss": "^8.5.0",
"postcss-safe-parser": "^6.0.0"
},
"engines": {
@@ -12612,19 +12692,19 @@
}
},
"node_modules/reflect.getprototypeof": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz",
- "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==",
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.8",
"define-properties": "^1.2.1",
- "dunder-proto": "^1.0.1",
- "es-abstract": "^1.23.6",
+ "es-abstract": "^1.23.9",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "gopd": "^1.2.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
"which-builtin-type": "^1.2.1"
},
"engines": {
@@ -12695,15 +12775,17 @@
}
},
"node_modules/regexp.prototype.flags": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
- "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"define-properties": "^1.2.1",
"es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
"set-function-name": "^2.0.2"
},
"engines": {
@@ -12999,6 +13081,23 @@
],
"license": "MIT"
},
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/safe-regex-test": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
@@ -13093,18 +13192,18 @@
}
},
"node_modules/seroval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz",
- "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.2.0.tgz",
+ "integrity": "sha512-GURoU99ko2UiAgUC3qDCk59Jb3Ss4Po8VIMGkG8j5PFo2Q7y0YSMP8QG9NuL/fJCoTz9V1XZUbpNIMXPOfaGpA==",
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/seroval-plugins": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.1.1.tgz",
- "integrity": "sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.2.0.tgz",
+ "integrity": "sha512-hULTbfzSe81jGWLH8TAJjkEvw6JWMqOo9Uq+4V4vg+HNq53hyHldM9ZOfjdzokcFysiTp9aFdV2vJpZFqKeDjQ==",
"license": "MIT",
"engines": {
"node": ">=10"
@@ -13147,6 +13246,21 @@
"node": ">= 0.4"
}
},
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/shallow-clone": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
@@ -13340,9 +13454,9 @@
}
},
"node_modules/solid-js": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.3.tgz",
- "integrity": "sha512-5ba3taPoZGt9GY3YlsCB24kCg0Lv/rie/HTD4kG6h4daZZz7+yK02xn8Vx8dLYBc9i6Ps5JwAbEiqjmKaLB3Ag==",
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.4.tgz",
+ "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==",
"license": "MIT",
"dependencies": {
"csstype": "^3.1.0",
@@ -13452,9 +13566,9 @@
}
},
"node_modules/spdx-license-ids": {
- "version": "3.0.20",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz",
- "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==",
+ "version": "3.0.21",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz",
+ "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==",
"dev": true,
"license": "CC0-1.0"
},
@@ -13904,9 +14018,9 @@
}
},
"node_modules/stylis": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz",
- "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==",
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.5.tgz",
+ "integrity": "sha512-K7npNOKGRYuhAFFzkzMGfxFDpN6gDwf8hcMiE+uveTVbBgm93HrNP3ZDUpKqzZ4pG7TP6fmb+EMAQPjq9FqqvA==",
"license": "MIT"
},
"node_modules/stylus": {
@@ -14353,9 +14467,9 @@
"license": "MIT"
},
"node_modules/tinyexec": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz",
- "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==",
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
"license": "MIT"
},
"node_modules/tinypool": {
@@ -14574,9 +14688,9 @@
}
},
"node_modules/typescript": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz",
- "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
+ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
"devOptional": true,
"license": "Apache-2.0",
"bin": {
@@ -14715,9 +14829,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
- "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
+ "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
"funding": [
{
"type": "opencollective",
@@ -14735,7 +14849,7 @@
"license": "MIT",
"dependencies": {
"escalade": "^3.2.0",
- "picocolors": "^1.1.0"
+ "picocolors": "^1.1.1"
},
"bin": {
"update-browserslist-db": "cli.js"
@@ -14899,6 +15013,13 @@
"url": "https://opencollective.com/vitest"
}
},
+ "node_modules/vite-node/node_modules/pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/vite-string-plugin": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/vite-string-plugin/-/vite-string-plugin-1.3.4.tgz",
@@ -14929,9 +15050,9 @@
}
},
"node_modules/vite/node_modules/rollup": {
- "version": "4.29.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz",
- "integrity": "sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.31.0.tgz",
+ "integrity": "sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -14945,25 +15066,25 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.29.1",
- "@rollup/rollup-android-arm64": "4.29.1",
- "@rollup/rollup-darwin-arm64": "4.29.1",
- "@rollup/rollup-darwin-x64": "4.29.1",
- "@rollup/rollup-freebsd-arm64": "4.29.1",
- "@rollup/rollup-freebsd-x64": "4.29.1",
- "@rollup/rollup-linux-arm-gnueabihf": "4.29.1",
- "@rollup/rollup-linux-arm-musleabihf": "4.29.1",
- "@rollup/rollup-linux-arm64-gnu": "4.29.1",
- "@rollup/rollup-linux-arm64-musl": "4.29.1",
- "@rollup/rollup-linux-loongarch64-gnu": "4.29.1",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1",
- "@rollup/rollup-linux-riscv64-gnu": "4.29.1",
- "@rollup/rollup-linux-s390x-gnu": "4.29.1",
- "@rollup/rollup-linux-x64-gnu": "4.29.1",
- "@rollup/rollup-linux-x64-musl": "4.29.1",
- "@rollup/rollup-win32-arm64-msvc": "4.29.1",
- "@rollup/rollup-win32-ia32-msvc": "4.29.1",
- "@rollup/rollup-win32-x64-msvc": "4.29.1",
+ "@rollup/rollup-android-arm-eabi": "4.31.0",
+ "@rollup/rollup-android-arm64": "4.31.0",
+ "@rollup/rollup-darwin-arm64": "4.31.0",
+ "@rollup/rollup-darwin-x64": "4.31.0",
+ "@rollup/rollup-freebsd-arm64": "4.31.0",
+ "@rollup/rollup-freebsd-x64": "4.31.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.31.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.31.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.31.0",
+ "@rollup/rollup-linux-arm64-musl": "4.31.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.31.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.31.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.31.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.31.0",
+ "@rollup/rollup-linux-x64-gnu": "4.31.0",
+ "@rollup/rollup-linux-x64-musl": "4.31.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.31.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.31.0",
+ "@rollup/rollup-win32-x64-msvc": "4.31.0",
"fsevents": "~2.3.2"
}
},
@@ -15043,6 +15164,13 @@
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
+ "node_modules/vitest/node_modules/pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/vscode-jsonrpc": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
@@ -15124,9 +15252,9 @@
}
},
"node_modules/vue-component-type-helpers": {
- "version": "2.1.10",
- "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.1.10.tgz",
- "integrity": "sha512-lfgdSLQKrUmADiSV6PbBvYgQ33KF3Ztv6gP85MfGaGaSGMTXORVaHT1EHfsqCgzRNBstPKYDmvAV9Do5CmJ07A==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.2.0.tgz",
+ "integrity": "sha512-cYrAnv2me7bPDcg9kIcGwjJiSB6Qyi08+jLDo9yuvoFQjzHiPTzML7RnkJB1+3P6KMsX/KbCD4QE3Tv/knEllw==",
"dev": true,
"license": "MIT"
},
@@ -15776,9 +15904,9 @@
"license": "ISC"
},
"node_modules/yaml": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz",
- "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==",
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
+ "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
diff --git a/package.json b/package.json
index c674c011dd..95129444fb 100644
--- a/package.json
+++ b/package.json
@@ -9,12 +9,12 @@
"@citation-js/plugin-software-formats": "0.6.1",
"@github/markdown-toolbar-element": "2.2.3",
"@github/quote-selection": "2.1.0",
- "@github/relative-time-element": "4.4.4",
+ "@github/relative-time-element": "4.4.5",
"@github/text-expander-element": "2.8.0",
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
"@primer/octicons": "19.14.0",
"ansi_up": "6.0.2",
- "asciinema-player": "3.8.0",
+ "asciinema-player": "3.8.2",
"chart.js": "4.4.5",
"chartjs-adapter-dayjs-4": "1.0.4",
"chartjs-plugin-zoom": "2.2.0",
@@ -25,18 +25,18 @@
"easymde": "2.18.0",
"esbuild-loader": "4.2.2",
"escape-goat": "4.0.0",
- "fast-glob": "3.3.2",
+ "fast-glob": "3.3.3",
"htmx.org": "1.9.12",
- "idiomorph": "0.4.0",
+ "idiomorph": "0.3.0",
"jquery": "3.7.1",
- "katex": "0.16.18",
+ "katex": "0.16.21",
"mermaid": "11.4.1",
"mini-css-extract-plugin": "2.9.2",
"minimatch": "10.0.1",
- "monaco-editor": "0.51.0",
+ "monaco-editor": "0.52.2",
"monaco-editor-webpack-plugin": "7.1.0",
"pdfobject": "2.3.0",
- "postcss": "8.4.49",
+ "postcss": "8.5.1",
"postcss-loader": "8.1.1",
"postcss-nesting": "13.0.1",
"pretty-ms": "9.0.0",
@@ -68,7 +68,7 @@
"@typescript-eslint/parser": "8.18.2",
"@vitejs/plugin-vue": "5.1.5",
"@vitest/coverage-v8": "2.1.8",
- "@vitest/eslint-plugin": "1.1.20",
+ "@vitest/eslint-plugin": "1.1.22",
"@vue/test-utils": "2.4.6",
"eslint": "9.17.0",
"eslint-import-resolver-typescript": "3.7.0",
@@ -85,16 +85,16 @@
"eslint-plugin-vue-scoped-css": "2.9.0",
"eslint-plugin-wc": "2.2.0",
"globals": "15.14.0",
- "happy-dom": "15.11.7",
+ "happy-dom": "16.3.0",
"license-checker-rseidelsohn": "4.4.2",
"markdownlint-cli": "0.43.0",
- "postcss-html": "1.7.0",
+ "postcss-html": "1.8.0",
"stylelint": "16.12.0",
"stylelint-declaration-block-no-ignored-properties": "2.8.0",
"stylelint-declaration-strict-value": "1.10.6",
"stylelint-value-no-unknown-custom-properties": "6.0.1",
"svgo": "3.2.0",
- "typescript": "5.7.2",
+ "typescript": "5.7.3",
"typescript-eslint": "8.18.2",
"vite-string-plugin": "1.3.4",
"vitest": "2.1.8"
diff --git a/poetry.lock b/poetry.lock
index f75b2ef8d5..e2bbbdfaae 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -16,13 +16,13 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""}
[[package]]
name = "codespell"
-version = "2.3.0"
-description = "Codespell"
+version = "2.4.0"
+description = "Fix common misspellings in text files"
optional = false
python-versions = ">=3.8"
files = [
- {file = "codespell-2.3.0-py3-none-any.whl", hash = "sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1"},
- {file = "codespell-2.3.0.tar.gz", hash = "sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f"},
+ {file = "codespell-2.4.0-py3-none-any.whl", hash = "sha256:b4c5b779f747dd481587aeecb5773301183f52b94b96ed51a28126d0482eec1d"},
+ {file = "codespell-2.4.0.tar.gz", hash = "sha256:587d45b14707fb8ce51339ba4cce50ae0e98ce228ef61f3c5e160e34f681be58"},
]
[package.extras]
diff --git a/public/.well-known/security.txt b/public/.well-known/security.txt
index 2a75a8dcd2..0ac9f09d34 100644
--- a/public/.well-known/security.txt
+++ b/public/.well-known/security.txt
@@ -5,4 +5,4 @@ Policy: https://codeberg.org/forgejo/governance/src/commit/5c07b3801537212ed6be1
Contact: mailto:security@forgejo.org
Encryption: https://keys.openpgp.org/vks/v1/by-fingerprint/1B638BDF10969D627926B8D9F585D0F99E1FB56F
Preferred-Languages: en
-Expires: 2025-10-25T00:00:00Z
+Expires: 2026-07-16T23:59:59.000Z
diff --git a/public/assets/img/svg/gitea-alt.svg b/public/assets/img/svg/gitea-alt.svg
new file mode 100644
index 0000000000..53e3f17c13
--- /dev/null
+++ b/public/assets/img/svg/gitea-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/release-notes-published/10.0.0.md b/release-notes-published/10.0.0.md
new file mode 100644
index 0000000000..43c0a2d33f
--- /dev/null
+++ b/release-notes-published/10.0.0.md
@@ -0,0 +1,574 @@
+
+
+
+
+## Release notes
+
+- Security bug fixes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): fix(security): [commit](https://codeberg.org/forgejo/forgejo/commit/45435a8789f8ff69603799a9031246d2d621d139) Fix and refactor markdown rendering
+- Security features
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6074): migrate TOTP secrets to `keying`
+- Breaking bug fixes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6240): Ensure `source_id` parameter is not skipped when set to 0 and correctly filter users in `/api/v1/admin/users` endpoint
+- User Interface features
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6407) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6423)): Rework user profile settings
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6386) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6399)): Rework new repository dialog
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6344): Show repository size on mobile
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6274): Add links to commit lists in contributors graph page
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6079): Add copy path button to file view
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6044): Put issue actions in a single row on mobile
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6018): Don't display email in profile settings when hidden
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5899): Highlight user mention in comments and commit messages
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5819): When [bleve is used for issue search](https://forgejo.org/docs/next/admin/config-cheat-sheet/#indexer-indexer), a `fuzzy` search now applies to each word instead of all of them, as if they were a phrase. For instance, searching for `activitypub spam moderation` previously [returned no result in Forgejo discussions](https://v9.next.forgejo.org/snematoda/forgejo-discussions/issues?state=open&type=all&q=activitypub+spam+moderation&fuzzy=true) and now returns the [relevant issues](https://codeberg.org/forgejo/discussions/issues?state=open&type=all&q=activitypub+spam+moderation&fuzzy=true). If the search results are too broad, or for searching exact phrases prefer using an `exact` search. Sorting by newest is still available as a non default option under `Sort`. The query was also reworked to improve performances. It makes a significant difference for large instances such as Codeberg.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5777): Add search to releases page
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5695): Combine review requests comments
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5677): If you select a portion of a comment and use the 'Quote reply' feature in the context menu, only that portion will be quoted. The markdown syntax is preserved.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5593): Set "your repositories" as the default filter for org dashboards
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5589): Add button to create a Markdown table in a comment
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5518): Add a bullet symbol between author and committer
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/4125): Added link to show all Issues/PullRequests
+- User Interface bug fixes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6122): Fix Action log UI race condition that occasionally prevents logs from loading
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6063): Fix wiki search overflowing on wide screens
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5838): Move "forgot_password"-link to fix login tab order
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5697): Update help links on page with no workflows
+- Localization
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6072): Add Low German to list of default languages
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5786): i18n: Add dummy language for checking translation keys (#5785)
+ - Updates from Codeberg Translate: [[1]](https://codeberg.org/forgejo/forgejo/pulls/6566), [[2]](https://codeberg.org/forgejo/forgejo/pulls/6514), [[3]](https://codeberg.org/forgejo/forgejo/pulls/6378) ([backport](https://codeberg.org/forgejo/forgejo/pulls/6450)), [[4]](https://codeberg.org/forgejo/forgejo/pulls/6331) ([backport](https://codeberg.org/forgejo/forgejo/pulls/6377)), [[5]](https://codeberg.org/forgejo/forgejo/pulls/6242), [[6]](https://codeberg.org/forgejo/forgejo/pulls/6161), [[7]](https://codeberg.org/forgejo/forgejo/pulls/6091), [[8]](https://codeberg.org/forgejo/forgejo/pulls/6041), [[9]](https://codeberg.org/forgejo/forgejo/pulls/5960), [[10]](https://codeberg.org/forgejo/forgejo/pulls/5845), [[11]](https://codeberg.org/forgejo/forgejo/pulls/5754), [[12]](https://codeberg.org/forgejo/forgejo/pulls/5681), [[13]](https://codeberg.org/forgejo/forgejo/pulls/5583)
+
+- Features
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6448): Add summary card for repos and releases
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6271): [commit](https://codeberg.org/forgejo/forgejo/commit/b0d6a7f07bff836190a8e87fe5645d5557893e32) Implement update branch API
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6265): Allow changing default branch update style
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6228): Add sorting functionality to `/api/v1/admin/users` endpoint
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6200): [commit](https://codeberg.org/forgejo/forgejo/commit/0786ddc5de37a01d1c3e3bf99b794665341b3c12) Add Swift login endpoint
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6180): Add support for `pacman -F` in Arch package
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6170): Make LFS http_client parallel within a batch
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6146): Improve performance of notifications page for MySQL
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6143): Filepath filter for code search
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6112): Add option to disable builtin authentication
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6110): [commit](https://codeberg.org/forgejo/forgejo/commit/3973f1022d57a3134e8f775e1c1cc6d398681bb4) Add github compatible tarball download API endpoints
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6100): Improve performance of allowed org repo creation query
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6062): [commit](https://codeberg.org/forgejo/forgejo/commit/ddabba5f89c4b196daeeb2af17de9ec2cec14b63) Allow the actions user to login via the jwt token
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6053): Add a "summary card" to issues & PRs for consumption by OpenGraph clients
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/dd3c4d7096cff91854bcc6641f55d9d093e5c86e) Add a doctor check to disable the "Actions" unit for mirrors
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5940): Make AVIF Images work with Forgejo
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5822): Trim spaces from repo names on form submission
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5789): [commit](https://codeberg.org/forgejo/forgejo/commit/1e595979625e54d375a0eaa440b84ef5e17af160) Add new [lfs_client].BATCH_SIZE and [server].LFS_MAX_BATCH_SIZE config settings.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5787): Add setting to block disposable emails
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5751): mermaid: [Add the Kanban board diagram type](https://github.com/mermaid-js/mermaid/pull/5999).
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5751): mermaid: [Class diagram includes a new "classBox" shape, classDef statement, support for styling the default class and lollipop interfaces](https://github.com/mermaid-js/mermaid/pull/5880).
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5714): [commit](https://codeberg.org/forgejo/forgejo/commit/ab660c5944d59cdb4ecc071401445ac9f53cee45) Add `DISABLE_ORGANIZATIONS_PAGE` and `DISABLE_CODE_PAGE` settings for explore pages
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5689): Add branch deletion for scheduled PRs
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5621): [commit](https://codeberg.org/forgejo/forgejo/commit/c3741d7fb0114691da73f00ae0ac9dced87e884d) The `requested_reviewers` data is included in more webhook events.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5621): [commit](https://codeberg.org/forgejo/forgejo/commit/89446e60a6e7ec3441f0c480164c09851ae54ce7) Support migrating GitHub/GitLab PR draft status.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5601): Language detection in the repository learned about the following languages: [Java Template Engine](https://github.com/github-linguist/linguist/pull/6610), [Noir](https://github.com/github-linguist/linguist/pull/6432), [Cylc](https://github.com/github-linguist/linguist/pull/6832), [iCalendar](https://github.com/github-linguist/linguist/pull/6940), [vCard (aka. VCF: Virtual Contact File) and Variant Call Format (VCF)](https://github.com/github-linguist/linguist/pull/6941), [B4X](https://github.com/github-linguist/linguist/pull/6965), [Carbon](https://github.com/github-linguist/linguist/pull/7011), [LiveCode Script](https://github.com/github-linguist/linguist/pull/6833), [Dune (OCaml build system)](https://github.com/github-linguist/linguist/pull/6814).
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5601): The following extensions or filenames in a repository are associated with the matching language: [deno.lock](https://github.com/github-linguist/linguist/pull/6885), [uv.lock](https://github.com/github-linguist/linguist/pull/7006), [HOSTS.TXT](https://github.com/github-linguist/linguist/pull/7014), [.peggy](https://github.com/github-linguist/linguist/pull/7017), [.resource](https://github.com/github-linguist/linguist/pull/6500).
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5543): [commit](https://codeberg.org/forgejo/forgejo/commit/d0af8fe4dc7b294fe5409b2271468494267d5a7d) Allow filtering pull requests by poster in the API.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5477): [commit](https://codeberg.org/forgejo/forgejo/commit/af901ac7bb03d27f175f2292581fc67fa9c8d567) Add support for searching users by email.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5459): New mermaid [flowchart shapes](https://mermaid.js.org/syntax/flowchart.html#complete-list-of-new-shapes).
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5416): [commit](https://codeberg.org/forgejo/forgejo/commit/8178d6eaba64d05799fd3b62fa889bd13bee07c7) Code search results when using the bleve indexer are sorted by relevance.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372): [commit](https://codeberg.org/forgejo/forgejo/commit/9d3473119893ffde0ab36d98e7a0e41c5d0ba9a3) Add bin to Composer Metadata.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/4968): Support regexp in git-grep search
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/4753): Git notes can be modified via the API or the UI
+- Bug fixes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6343): avoid Gitea migration warnings
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6329): maven package where actual pom has no group-id defined, fallback to parent group-id
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6271): [commit](https://codeberg.org/forgejo/forgejo/commit/96a7f0a3f065c5db8fdf352c93c8367e24d259de) Fix missing outputs for jobs with matrix
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6271): [commit](https://codeberg.org/forgejo/forgejo/commit/2b5c69c451a684b20119e2521dc23734c7869241) Detect whether action view branch was deleted
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6271): [commit](https://codeberg.org/forgejo/forgejo/commit/bf934c96c92d643678ac7a18697b6563bc9d20a5) Add standard-compliant route to serve outdated R packages
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6105): Fix unconditional DB queries in commit status fetches
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6062): [commit](https://codeberg.org/forgejo/forgejo/commit/32a91add34519ef7768ec907888ed837ad0dde2f) Fix GetInactiveUsers
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6062): [commit](https://codeberg.org/forgejo/forgejo/commit/64824290912b6300ede2b2f95ff77d55dde9859b) Fix submodule parsing
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6062): [commit](https://codeberg.org/forgejo/forgejo/commit/ddabba5f89c4b196daeeb2af17de9ec2cec14b63) allow the actions user to login via the jwt token
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/a8f2002a9b061ec1092df67c6f05e30aa7d2e2d2) Remove transaction for archive download
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/96ee0f56475204b2bbdc7f2aeb35b1c32eac469c) Fix oauth2 error handle not return immediately
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/c2e8790df37a14b4d2f72c7377db75309e0ebf1d) Trim title before insert/update to database to match the size requirements of database
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/03ab73d92eabaf774278effe3332623b1dc3580a) Fix nil panic if repo doesn't exist
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/56971f9ed90a01fd74a634b7496593e6f62ac260) Disable Oauth check if oauth disabled
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/56971f9ed90a01fd74a634b7496593e6f62ac260) Disable OAuth check if OAuth disabled
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5988): [commit](https://codeberg.org/forgejo/forgejo/commit/fc26becba4b08877a726f2e7e453992310245fe5) When a tag was removed and a release existed for that tag, it would be broken. The release is no longer broken the tag can be added again.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5811): Escaping specific markdown in commit messages on Discord-type embeds
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5789): [commit](https://codeberg.org/forgejo/forgejo/commit/362ad0ba39bdbc87202e349678e21fc2a75ff7cb) Update force-pushed tags too when syncing mirrors
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5789): [commit](https://codeberg.org/forgejo/forgejo/commit/4c5bdddf7751a35985c08ba6506f1f30103749d6) Fix `missing signature key` error when pulling Docker images with `SERVE_DIRECT` enabled
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5789): [commit](https://codeberg.org/forgejo/forgejo/commit/2c5fdb108ff9e23e8f907fb6afe59177c6bb202e) Fix the missing menu in organization project view page
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5789): [commit](https://codeberg.org/forgejo/forgejo/commit/2358c0d899faec8311e46dcb0550041496bcd532) Properly clean temporary index files
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5781): Preview picture not visible on Markdown file
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5714): [commit](https://codeberg.org/forgejo/forgejo/commit/d13a4ab5632d6a9697bd0907f9c69ed57d949340) Fixed a bug related to disabling two-factor authentication
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5621): [commit](https://codeberg.org/forgejo/forgejo/commit/f3f386545ee97b91f1aaac4142480e70a443c655) Always update expiration time when creating an artifact, so that artifacts from re-ran jobs do not get lost.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5621): [commit](https://codeberg.org/forgejo/forgejo/commit/c163bf6fb55c922ab0cf552b47475fc8fc8b99d9) Remove the button toolbar when deleting a diff comment.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5621): [commit](https://codeberg.org/forgejo/forgejo/commit/e8700cee612f0aa769dc6929772d9b04c6c21807) Run scheduled tasks against the latest commit.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5517): Allow Organisations to remove the Email Address
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5477): [commit](https://codeberg.org/forgejo/forgejo/commit/1dfe58ad11bc6fdc73a2b5ffb3c1481fbddbf46b) PR creation on forked repositories.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5477): [commit](https://codeberg.org/forgejo/forgejo/commit/b67b7c12385059898fc8cb7997755a88b3afa483) The logic of finding the latest pull review commit ID is incorrect.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5416): [commit](https://codeberg.org/forgejo/forgejo/commit/b496317b5a2aea970bc94ccf6fcde35cd417ec20) After migrating a repository that contains merged pull requests, the branch is missing and cannot be deleted.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5416): [commit](https://codeberg.org/forgejo/forgejo/commit/a226064711899da07d6b1455a68ef758f2f3e7e0) Forgejo Actions artifact v4 upload above 8MB.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5307): Don't allow modification to internal reference
+- Other changes without a feature or bug label
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5789): chore: [commit](https://codeberg.org/forgejo/forgejo/commit/b308bcca7c950b7f0d127ee4282019c2a9923299) Improved diff view performance
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5714): chore: [commit](https://codeberg.org/forgejo/forgejo/commit/ab26d880932dbc116c43ea277029984c7a6d4e94) Emit a log message when failing to delete an inactive user
+- Included for completeness but not worth a release note
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6553): Update module github.com/alecthomas/chroma/v2 to v2.15.0 (v10.0/forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6513) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6517)): Add lock for parallel maven upload
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6496): Update module github.com/go-git/go-git/v5 to v5.13.1 (v10.0/forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6491) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6493)): fix: upgrade gof3 package and driver
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6488) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6492)): chore: remove illegal git usage
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6463) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6465)): fix(ui): show oauth divider on signup page
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6432) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6444)): Fix editing pr review
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6441) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6442)): fix(code search): empty mode dropdown when keyword is empty
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6427) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6430)): fix(ui): use primary color for button in table modal
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6421) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6426)): Fix edit cancel button
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6419) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6424)): Fix issue/comment menus
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6403) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6420)): chore(branding): strip metadata information from the footer
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6410) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6418)): fix: use DateUtils for blocked users list
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6391) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6416)): [gitea] week 2024-53 cherry pick (gitea/main -> forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6405) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6406)): fix: xorm needs to be lowercase otherwise it is ignored
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6401) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6402)): Cosmetic changes and fixes around repo homepage
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6286) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6398)): feat: When comparing in repos, mention that pull request creation requires sign-in
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6390) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6392)): Fix overflow in git notes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6372) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6382)): Revert "Update dependency idiomorph to v0.4.0"
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6375) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6376)): chore(i18n): user/label translations in danish/latvian
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6368): harden keying implementation
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6367): Update dependency webpack-cli to v6 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6366): Update linters (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6365): Update dependency djlint to v1.36.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6364): Update dependency @vitest/eslint-plugin to v1.1.20 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6363): Update github.com/shurcooL/vfsgen digest to 0000e14 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6357): chore(docs): explain vars.SKIP_END_TO_END when building a release
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6355): Update dependency idiomorph to v0.4.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6354): Update module google.golang.org/protobuf to v1.36.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6349): Lock file maintenance (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6348): Update module github.com/go-testfixtures/testfixtures/v3 to v3.14.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6347): Update renovate Docker tag to v39.82.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6342): [gitea] week 2024-52 cherry pick (gitea/main -> forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6339): repo avatar generating (#6338)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6337): keep commit count limit in file history pagination static and not increase with every page
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6335): template config path (#2836)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6330): branding: update contrib/legal
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6324): chore(release): link to the standalone release notes file
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6322): Update module google.golang.org/grpc to v1.69.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6321): Update dependency globals to v15.14.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6320): Update actions/cascading-pr action to v2.2.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6319): Update dependency katex to v0.16.18 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6316): Update module golang.org/x/net to v0.33.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6313): actions move to data.forgejo.org
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6311): chore: avoid using gock
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6310): chore: remove unused dependency from build.go
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6309): Update dependency markdownlint-cli to v0.43.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6308): Update dependency @playwright/test to v1.49.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6307): Update vitest monorepo to v2.1.8 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6306): Update module github.com/blevesearch/bleve/v2 to v2.4.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6305): Update dependency tailwindcss to v3.4.17 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6304): Update dependency katex to v0.16.17 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6303): Update dependency eslint-plugin-import-x to v4.5.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6301): Replace actions/cascading-pr action with actions/cascading-pr v2.1.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6299): chore: Make Forgejo build with go1.24
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6298): Update actions/setup-forgejo action to v2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6296): Add readme to locale folder
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6295): Update module google.golang.org/protobuf to v1.36.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6293): Update dependency eslint-plugin-sonarjs to v3 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6292): Update linters (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6291): Update module github.com/golangci/golangci-lint/cmd/golangci-lint to v1.62.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6290): Update dependency @vitest/eslint-plugin to v1.1.16 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6288): Some improvements to base locale
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6287): Don't notify when a user self-request as reviewer
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6282): Update module github.com/go-chi/chi/v5 to v5.2.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6281): Update actions/cascading-pr action to v2.2.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6278): Update renovate to v39.69.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6264): Update forgejo/forgejo-build-publish action to v5.2.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6260): Update module golang.org/x/tools/gopls to v0.17.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6259): Update dependency @primer/octicons to v19.14.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6258): Update module github.com/gliderlabs/ssh to v0.3.8 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6256): chore(release-notes): Forgejo v9.0.3 [skip ci]
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6255): chore(release-notes): Forgejo v7.0.12 [skip ci]
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6254): Use correct title for container images
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6245): Adjust MySQL instruction
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6243): Update module golang.org/x/crypto to v0.31.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6237): Avoid having to store i18n linter exceptions for
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6234): Update github.com/grafana/go-json digest to a119ee5 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6233): Add missing automerge feed message
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6229): Update dependency katex to v0.16.15 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6227): Replace actions/setup-forgejo action with actions/setup-forgejo v1.0.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6226): Replace actions/cascading-pr action with actions/cascading-pr v2.1.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6223): chore(ci): set the milestone when a pull request is closed (take 4)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6222): Clipboard read permission for Chromium
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6221): Add `-` as reserved user
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6219): chore(ci): set the milestone when a pull request is open (take 3)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6213): chore(ci): set the milestone when a pull request is open (take 2)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6211): chore(ci): set the milestone when a pull request is open [skip ci]
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6210): Update dependency forgejo-lxc to v12 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6206): Cleanup `package/arch` route
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6205): Update dependency katex to v0.16.14 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6204): Update renovate to v39.57.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6202): nix-dev-improvements
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6201): Simplify main-attribute labels
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6199): feat(secret): generate FORGEJO_TOKEN for all tasks
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6196): Rebrand help text in `forgejo migrate` #6194
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6191): Do not offer duplicating a PR for a recently pushed branch
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6190): Update x/tools to v0.28.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6188): don't specify FOR clause for index hint
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6182): chore(ci): common issue-labels name for all related workflows
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6178): Revert "chore(ci): merge jobs in issue-labels.yml in one workflow"
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6177): chore(ci): docker-runner-one is not a known label
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6175): Update module golang.org/x/net to v0.32.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6172): Update dependency webpack to v5.97.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6171): Update dependency @github/relative-time-element to v4.4.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6165): chore(release-notes): keep release notes in release-notes-published
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6160): Update module golang.org/x/image to v0.23.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6159): Update module golang.org/x/crypto to v0.30.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6157): Update dependency @primer/octicons to v19.13.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6153): highlight Gradle Kotlin as Kotlin
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6152): remove softbreak from github legacy callout
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6151): build: only require go minor
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6150): Update module code.forgejo.org/go-chi/session to v1.0.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6148): Update module code.forgejo.org/go-chi/captcha to v1.0.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6145): Update dependency go to v1.23.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6144): correct permission loading for limited organisation
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6140): Update dependency webpack to v5.97.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6139): Update dependency tailwindcss to v3.4.16 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6137): Update fnetx/setup-cache-go digest to 4b50dd2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6136): build: relax required go version for local development
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6130): avoid sorting for `MakeSelfOnTop`
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6128): clean up log files that no longer exist
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6120): chore(ci): run merge conditions when a new commit is pushed
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6119): Lock file maintenance (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6118): Update dependency globals to v15.13.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6117): Regular visual regression testing
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6115): Update renovate to v39.42.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6114): return correct type in `GetSubModule`
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6113): Rework GetLatestCommitStatusForPairs query using a subquery for PG compatibility
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6109): Update dependency happy-dom to v15.11.7 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6108): Update dependency djlint to v1.36.3 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6107): Update dependency @vitest/eslint-plugin to v1.1.13 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6106): Update dependency @stoplight/spectral-cli to v6.14.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6095): Update dependency sortablejs to v1.15.6 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6090): chore(i18): cleanup locales
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6089): typos, mostly from `codespell`, others just by eyeballing
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6088): Update dependency sortablejs to v1.15.5 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6087): Update dependency mermaid to v11.4.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6084): normalize guessed languages from enry
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6083): improve wording of limited visibility
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6082): Update dependency chartjs-plugin-zoom to v2.2.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6071): Use user.FullName in Oauth2 id_token response
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6067): Lock file maintenance (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6066): Update dependency sortablejs to v1.15.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6065): Update renovate to v39.28.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6059): Improve colors used by colorblind-friendly forgejo themes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6058): Update module github.com/stretchr/testify to v1.10.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6052): Show page titles in wiki search results (#6048)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6050): Improve Swagger documentation for user endpoints
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6049): Update dependency typescript to v5.7.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6046): ci: use more `tmpfs` and `noatime` for faster CI
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6045): test: fix e2e test
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6034): chore(ci): remove unused experimental DNS updates
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6029): bug: git notes edit/remove button displayed to anonymous visitors
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6027): Apply smaller padding to comment headers
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6025): Improve git notes UI
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6023): Update dependency chartjs-plugin-zoom to v2.1.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6021): chore(ci): merge jobs issue label jobs in one workflow
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6020): chore(ci): make release-notes-assistant job copy/pastable (part two)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6019): chore(ci): make release-notes-assistant job copy/pastable
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6013): fix(test): TestGitAttributeCheckerError must allow broken pipe
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6010): Lock file maintenance (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6008): Update renovate to v39.19.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6006): vertical center the date on GPG keys
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6003): chore(release-notes-assistant): security fix / features come first
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6002): chore(ci): make backporting job copy/pastable
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6001): chore(ci): make merge-conditions job copy/pastable
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6000): chore(ci): make end-to-end job copy/pastable
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5996): check read permissions for code owner review requests
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5995): remember fuzzy for open/close state
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5994): Revert defaulting to EdDSA
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5991): api repo compare with commit hashes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5989): use better code to group UID and stopwatches
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5987): Default to generating EdDSA for OAuth JWT signing key
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5986): bug: correctly generate oauth2 jwt signing key
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5984): extend `forgejo_auth_token` table (part two)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5983): improve `GetLatestCommitStatusForPairs`
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5981): Update dependency vue to v3.5.13 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5980): Update github.com/grafana/go-json digest to f14426c (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5978): chore(release-notes): fix the v9.0.2 links
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5977): chore: fix e2e
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5973): ci: upload all e2e artifacts
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5969): Update module google.golang.org/grpc to v1.68.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5968): test: fix e2e tests
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5966): Update dependency tailwindcss to v3.4.15 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5965): use oci mirror for `tonistiigi/xx` image
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5964): ci: proper job name
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5963): ci: use oci mirror images
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5962): ci: disable postgresql fsync
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5958): ci: use tmpfs for service storage
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5957): ci: disable mysql binlog
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5956): test: use sqlite in-memory db for integration
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5955): test: add trailing newline to `testlogger.go:recordError` message
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5954): chore: improve slow tests
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5951): chore(i18n): allow datnes nosaukums for filename (Latvian)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5949): Update module code.forgejo.org/forgejo/act to v1.22.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5948): chore: improve preparing tests
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5946): Update module github.com/blevesearch/bleve/v2 to v2.4.3 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5944): chore(ci): ROLE forgejo-coding & forgejo-testing (part two)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5943): chore(release-notes): update the v9.0.2 & v7.0.11 links
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5942): chore(ci): ROLE forgejo-coding & forgejo-testing
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5935): chore(renovate): throttle down upgrade of linters & test packages
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5934): Update linters (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5933): Update dependency @stoplight/spectral-cli to v6.14.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5932): Update dependency happy-dom to v15.11.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5931): Update dependency @vitest/eslint-plugin to v1.1.10 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5929): tests(e2e): Refactor various tests
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5928): chore(lint): Ignore playwright reports for linting
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5924): fix(ci): synchronize updates the commit status asynchronously
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5923): chore(renovate): always set the test/not-needed label
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5922): Update module github.com/buildkite/terminal-to-html/v3 to v3.16.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5921): Update dependency postcss to v8.4.49 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5920): Update dependency happy-dom to v15.11.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5919): Update dependency @axe-core/playwright to v4.10.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5916): chore(e2e): Update global patterns
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5913): chore: set recommend vscode settings for golangci-lint
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5912): test: fix test linting
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5911): Update module github.com/golangci/golangci-lint/cmd/golangci-lint to v1.62.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5910): Update dependency @vitejs/plugin-vue to v5.1.5 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5909): Re-add least recently updated as sort order
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5908): Update dependency postcss to v8.4.48 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5907): Update renovate to v39.9.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5906): chore: improve database docker instructions
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5904): chore: improve test quality
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5903): chore: simplify CopyDir
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5896): fix(ci): only trigger end-to-end tests when the label is set
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5892): Proper parsing of date for git commits
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5890): Update module golang.org/x/net to v0.31.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5888): chore: lazy-loaded version of goccy/go-json
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5886): chore(ci): Enforce test label with CI check
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5885): fix(ui): Details icon in repo settings sidebar
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5883): Update module golang.org/x/crypto to v0.29.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5881): [THEME] Copy ansi terminal colours from gitea to forgejo themes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5878): fix(ci): slow runners may need more than 50 minutes for a test
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5869): bug: require.Eventually must not test with assert
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5865): Update module code.forgejo.org/go-chi/session to v1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5864): Update module code.forgejo.org/go-chi/captcha to v1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5863): Update module code.forgejo.org/go-chi/cache to v1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5862): Update module code.forgejo.org/go-chi/binding to v1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5858): chore(renovate): only run if renovate workflow changed
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5857): chore(renovate): update settings
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5843): issue labels are not set after deleting one label
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5840): Update dependency happy-dom to v15.11.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5837): Update dependency eslint-plugin-playwright to v2.0.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5836): Update dependency go to v1.23.3 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5835): Make direnv optional to let developers use their own direnv configuration
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5832): chore(renovate): fix regex
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5830): chore(renovate): use squash for automerge
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5829): Update renovate to v39 (forgejo) (major)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5825): Update dependency happy-dom to v15.10.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5824): Update dependency djlint to v1.36.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5820): chore(ci): deprecate legacy infrastructure supporting v*.next
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5817): test: enable gitea migration tests
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5816): test: enable github migration tests
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5815): Update linters to v8.13.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5814): Update dependency globals to v15.12.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5813): Update dependency happy-dom to v15.9.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5804): Lock file maintenance (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5803): Update dependency happy-dom to v15.8.3 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5802): Update renovate to v38.142.5 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5796): [PORT] Replace DateTime with proper functions (gitea#32402)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5795): support `www.github.com` for migrations
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5794): [PORT] Fix git error handling (gitea#32401)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5793): [PORT] Refactor the DB migration system slightly (gitea#32344)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5792): [PORT] Fix toAbsoluteLocaleDate and add more tests (gitea#32387)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5791): [PORT] Fix a number of typescript issues (gitea#32308)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5790): [PORT] Refactor tests to prevent from unnecessary preparations (gitea#32398)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5788): chore(cleanup): remove unused TestCreateFile
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5784): Update dependency eslint-plugin-array-func to v5 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5783): Update module github.com/gorilla/sessions to v1.4.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5782): Update actions/git-backporting action to v4.8.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5780): Update module github.com/yuin/goldmark to v1.7.8 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5779): support color dots for 4 character hex.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5775): Update module github.com/fsnotify/fsnotify to v1.8.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5774): Update linters (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5773): Update dependency happy-dom to v15.8.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5772): Update dependency djlint to v1.35.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5771): tests: improve actvititypub integration test code
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5769): Revert: chore(ci): Enforce test label with CI check
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5768): chore(renovate): explicit base branches
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5767): Improvements to some English strings
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5766): Update infrastructure/next-digest action to v1.1.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5764): Update dependency webpack to v5.96.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5763): Update dependency mini-css-extract-plugin to v2.9.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5762): Update module code.forgejo.org/forgejo/act to v1.21.5 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5756): chore(ci): Enforce test label with CI check
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5755): chore(ci): use rootless for the container images sent to k8s
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5750): Update dependency djlint to v1.35.3 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5747): chore(ci): notify the k8s cluster about experimental releases
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5738): Update module github.com/meilisearch/meilisearch-go to v0.29.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5737): Update vitest monorepo to v2.1.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5734): refactor: Migrate playwright to typescript
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5732): chore(release): also copy the release to code.forgejo.org
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5729): docs: add links to the v7.0.10 & v9.0.1 release notes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5717): Lock file maintenance (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5716): Update renovate to v38.133.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5713): i18n: fix placeholders in string for refusing to review
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5712): Link back to one-time code page from scratch code page
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5705): Update linters (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5704): Update dependency @playwright/test to v1.48.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5703): harden localization against malicious HTML
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5702): use buffered iterate for debian searchpackages
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5698): Update internationalization label in release-notes-assistant
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5692): tests(e2e): skip browser downloads
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5690): Add typescript support
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5688): make branch protection work for new branches
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5685): chore: output playwright directly to std{out,err}
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5684): reset `history.scrollRestoration` if set to `manual` and no issue anchor in url
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5678): Update dependency postcss-nesting to v13.0.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5669): Update dependency eslint-plugin-playwright to v2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5668): chore: remove eslint v9 restriction in renovate
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5665): Update module github.com/jhillyerd/enmime to v2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5664): Update dependency postcss-nesting to v13 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5663): Update dependency eslint-plugin-unicorn to v56 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5662): chore: move to Eslint flat config
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5657): use combo markdown editor for milestone description
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5653): don't show truncated comments in RSS/Atom feeds
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5652): typo on releases for source code downloads
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5651): link to security policy in security.txt
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5646): chore(release-notes): no need to specify they are draft
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5644): conf: Improve delete_old_actions description
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5641): make synchronize tags to database handle annoted tags
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5640): Revert "add gap between branch dropdown and PR button"
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5638): Better messages for cases of private profiles
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5637): feat(ci): allow manual triggering of the test suite
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5633): Lock file maintenance (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5632): Update renovate to v38.128.6 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5625): fix(i18n): edit should not be lowercase here
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5617): Create temporary user helper function
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5615): Don't double escape delete branch text
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5608): Update code.forgejo.org/go-chi/session digest to 2a99226 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5595): Add server logging for OAuth server errors
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5592): forgejo-cli is now a symlink and cannot be used for sanity checks
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5591): Update dependency @primer/octicons to v19.12.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5590): Update dependency @playwright/test to v1.48.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5578): Update module github.com/buildkite/terminal-to-html/v3 to v3.16.3 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5576): Update dependency chart.js to v4.4.5 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5569): Update vitest monorepo to v2.1.3 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5568): Update module github.com/redis/go-redis/v9 to v9.6.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5563): Update security option in issue template
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5561): Fix typo in English locale file
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5560): regression from #4125
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5555): i18n: update of translations from Codeberg Translate
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5554): Fix typo in #5537
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5550): Update module github.com/urfave/cli/v2 to v2.27.5 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5549): Update renovate to v38.121.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5541): Update module github.com/minio/minio-go/v7 to v7.0.78 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5540): Update module github.com/klauspost/compress to v1.17.11 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5539): Update dependency vue to v3.5.12 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5537): i18n: Improve translation strings for webhook events
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5536): use column flex on mobile to prevent project title from wrapping
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5533): i18n: remove unnecessary variable
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5530): Make chroma match case-insensitive
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5523): i18n: Fine tune language for units
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5522): Update dependency @github/text-expander-element to v2.8.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5514): i18n: update of translations from Codeberg Translate
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5511): Update x/tools to v0.26.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5510): Update module google.golang.org/protobuf to v1.35.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5509): Update module golang.org/x/sys to v0.26.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5508): Update module golang.org/x/net to v0.30.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5506): Do not change stroke size in the loading animation
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5505): Small fixes and rename for #5482
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5503): update git book link to v2
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5502): Update module golang.org/x/image to v0.21.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5501): Update dependency @playwright/test to v1.48.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5498): Update actions/cache action to v4.1.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5495): Update dependency eslint-plugin-wc to v2.2.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5494): Update dependency @vitest/eslint-plugin to v1.1.7 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5493): Update actions/git-backporting action to v4.8.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5491): correct documentation for non 200 responses in swagger
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5485): chore(ci): update changed-files actions URL for consistency
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5483): Update renovate to v38.110.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5482): "Assign to me" button on PR and Issues #5215
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5479): Improve 'Verify' error message, stopgap for #2809
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5476): Update dependency @stylistic/eslint-plugin-js to v2.9.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5474): Update actions/cache action to v4.1.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5473): Update module github.com/mattn/go-sqlite3 to v1.14.24 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5472): "forked from" note alignment on 404 error pages #5324
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5471): i18n: update of translations from Codeberg Translate
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5467): Update dependency @vitest/eslint-plugin to v1.1.6 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5466): Update dependency @stylistic/stylelint-plugin to v3.1.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5458): Update dependency vue to v3.5.11 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5456): log concise repo names in lfs doctor
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5454): Update vitest monorepo to v2.1.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5453): Update module github.com/caddyserver/certmagic to v0.21.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5452): Update dependency @vitest/eslint-plugin to v1.1.5 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5450): ci/tests(e2e): always run e2e tests, but only on changed files
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5449): Update dependency go to v1.23.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5441): Update actions/setup-go action to v5 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5437): Update ghcr.io/devcontainers/features/git-lfs Docker tag to v1.2.3 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5436): Update dependency eslint-plugin-sonarjs to v2.0.3 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5435): Update github.com/google/pprof digest to 017d972 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5434): chore: remove spurious comment in tests
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5430): referenced sha256:* container images may be deleted
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5428): Update actions/setup-node action to v4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5427): Update actions/checkout action to v4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5426): Update actions/cache action to v4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5424): Lock file maintenance (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5422): Update renovate to v38.101.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5421): ci: move composite workflow location
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5415): document sqlite3 as suggested database
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5413): i18n: update of translations from Codeberg Translate
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5411): Update dependency webpack to v5.95.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5410): ci: Move preparations to local actions
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5405): Update dependency markdownlint-cli to v0.42.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5404): Update dependency @vitest/eslint-plugin to v1.1.4 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5403): Update dependency @stylistic/stylelint-plugin to v3.1.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5402): Update dependency vue to v3.5.10 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5398): Update module github.com/minio/minio-go/v7 to v7.0.77 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5397): Update module github.com/klauspost/compress to v1.17.10 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5396): Update dependency @github/text-expander-element to v2.7.2 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5395): Update citation-js monorepo (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5391): docs: add link to the v9.0.0 release notes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5389): mail issue: Display issue type in email header
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5374): Update dependency monaco-editor to v0.51.0 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5370): Update module google.golang.org/grpc to v1.67.1 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5355): i18n: update of translations from Codeberg Translate
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5353): Remove some Windows-specific files
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5351): Add architecture-specific removal support for arch package
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5328): ci: use custom action for Go caching
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5294): tests(e2e): Refactor branch protection test
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5249): Makefile: support gotestsum
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5240): Update module github.com/prometheus/client_golang to v1.20.5 (forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5158): use ValidateEmail as binding across web forms
+- Already announced in the release notes of an older stable release
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6249): Revert "allow synchronizing user status from OAuth2 login providers (#31572)"
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6248): ensure correct ssh public key is used for authentication
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6124): doctor fails with pq: syntax error at or near "." whilst counting Authorization token without existing User
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6097): Do not rewrite ssh keys files when deleting a user without one
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6054): Do not delete global Oauth2 applications
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/1ce33aa38d1d258d14523ff2c7c2dbf339f22b74) it was possible to use a token sent via email for secondary email validation to reset the password instead. In other words, a token sent for a given action (registration, password reset or secondary email validation) could be used to perform a different action. It is no longer possible to use a token for an action that is different from its original purpose.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/061abe60045212acf8c3f5c49b5cc758b4cbcde9) a fork of a public repository would show in the list of forks, even if its owner was not a public user or organization. Such a fork is now hidden from the list of forks of the public repository.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/3e3ef76808100cb1c853378733d0f6a910324ac6) the members of an organization team with read access to a repository (e.g. to read issues) but no read access to the code could read the RSS or atom feeds which include the commit activity. Reading the RSS or atom feeds is now denied unless the team has read permissions on the code.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/9508aa7713632ed40124a933d91d5766cf2369c2) the tokens used when [replying by email to issues or pull requests](https://forgejo.org/docs/v9.0/user/incoming/) were weaker than the [rfc2104 recommendations](https://datatracker.ietf.org/doc/html/rfc2104#section-5). The tokens are now truncated to 128 bits instead of 80 bits. It is no longer possible to reply to emails sent before the upgrade because the weaker tokens are invalid.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/786dfc7fb81ee76d4292ca5fcb33e6ea7bdccc29) a registered user could modify the update frequency of any push mirror (e.g. every 4h instead of every 8h). They are now only able to do that if they have administrative permissions on the repository.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/e6bbecb02d47730d3cc630d419fe27ef2fb5cb39) it was possible to use basic authorization (i.e. user:password) for requests to the API even when security keys were enrolled for a user. It is no longer possible, an application token must be used instead.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/7067cc7da4f144cc8a2fd2ae6e5307e0465ace7f) some markup sanitation rules were not as strong as they could be (e.g. allowing `emoji somethingelse` as well as `emoji`). The rules are now stricter and do not allow for such cases.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/b70196653f9d7d3b9d4e72d114e5cc6f472988c4) when Forgejo is configured to enable instance wide search (e.g. with [bleve](https://blevesearch.com/)), results found in the repositories of private or limited users were displayed to anonymous visitors. The results found in private or limited organizations were not displayed. The search results found in the repositories of private or limited user are no longer displayed to anonymous visitors.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5941): handle renamed dependency for cargo registry
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5850): [PORT] Fix code owners will not be mentioned when a pull request comes from a forked repository (gitea#30476)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5831): labels are missing in the pull request payload removing a label
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5778): In a Forgejo Actions workflow, the `unlabeled` event type for pull requests was incorrectly mapped to the labeled event type.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5778): When a Forgejo Actions issue or pull request workflow is triggered by an `labeled` or `unlabeled` event type, it misses information about the label added or removed. It is now available in the `label` data member of the event payload.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5778): The pull request workflow must always update the head SHA commit status. Not just when the PR is synchronized, opened or closed. Otherwise it makes it impossible to define a job to be a required check (for instance a job that is triggered when labels are modified and verifies that a given combination is present).
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5746): git-grep for code search when git version is below 2.38
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5719): Forgejo generates a token which is used to authenticate web endpoints that are only meant to be used internally, for instance when the SSH daemon is used to push a commit with Git. The verification of this token was not done in constant time and was susceptible to [timing attacks](https://en.wikipedia.org/wiki/Timing_attack). A pre-condition for such an attack is the precise measurements of the time for each operation. Since it requires observing the timing of network operations, the issue is mitigated when a Forgejo instance is accessed over the internet because the ISP introduce unpredictable random delays.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5718): Because of a missing permission check, the branch used to propose a pull request to a repository can always be deleted by the user performing the merge. It was fixed so that such a deletion is only allowed if the user performing the merge has write permission to the repository from which the pull request was made.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5634): package arch database not updating when uploading "any" architecture
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5627): correct SQL query for active issues
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5626): specify default value for `EXPLORE_DEFAULT_SORT`.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5613): Add `recentupdated` as recognized sort option
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5587): Dockerfile: use alpine:3.20 instead of golang:1.23-alpine3.20
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5585): Dockerfile: unnecessary container image layer duplication
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5529): Don't allow owner team with incorrect unit access (includes doctor fix)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5515): **Fixing this bug is a breaking change because existing tokens with a public scope will no longer return private resources. They have to be deleted and re-created without the public scope to restore their original behavior**. The public scope of an application token does not filter out private repositories, organizations or packages in some cases. This scope is not the default, it has to be manually set via the web UI or the API. When the public scope is explicitly added to an application token that is allowed to list the repositories and packages of a user or an organization, it is meant as a restriction. For instance if a user has two repositories, one private and the other publicly visible, a token with the public scope used with the API endpoint listing the repositories that belong to this user must only return the publicly visible one and not reveal the existence of the private one.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5492): correct Discord webhook JSON for issue events
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5470): don't cancel schedule workflows on push to main branch
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5439): Fix boolean inputs in workflow_dispatch
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372): [commit](https://codeberg.org/forgejo/forgejo/commit/f709de24039ab7e605d3e09e3b61240836381603) Fix wrong last modify time.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372): [commit](https://codeberg.org/forgejo/forgejo/commit/2675a24649af2fff34f5c7e416d6ff78591d8d9c) Repo Activity: count new issues that were closed.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372): [commit](https://codeberg.org/forgejo/forgejo/commit/526054332acb221e061d3900bba2dc6e012da52d) Fix incorrect /tokens api.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372): [commit](https://codeberg.org/forgejo/forgejo/commit/0cafec4c7a2faf810953e9d522faf5dc019e1522) Do not escape relative path in RPM primary index.
+
diff --git a/release-notes/6351.md b/release-notes/6351.md
new file mode 100644
index 0000000000..b87427724b
--- /dev/null
+++ b/release-notes/6351.md
@@ -0,0 +1 @@
+feat: [Alt Linux Apt-Rpm](https://en.altlinux.org/RPM) repository [support for Forgejo packages](https://forgejo.org/docs/next/user/packages/alt/).
\ No newline at end of file
diff --git a/release-notes/6445.md b/release-notes/6445.md
new file mode 100644
index 0000000000..d3755701b2
--- /dev/null
+++ b/release-notes/6445.md
@@ -0,0 +1 @@
+feat: webhook: sourcehut: submit SSH URL for private repository or when pre-filled
diff --git a/release-notes/6471.md b/release-notes/6471.md
new file mode 100644
index 0000000000..4e70286eee
--- /dev/null
+++ b/release-notes/6471.md
@@ -0,0 +1 @@
+feat: [commit](https://codeberg.org/forgejo/forgejo/commit/76a85d26c8576fc410dc6494f2907ffc2b353c39) Use `Project-URL` metadata field to get a PyPI package's homepage URL
diff --git a/release-notes/6639.md b/release-notes/6639.md
new file mode 100644
index 0000000000..1bc01c12a3
--- /dev/null
+++ b/release-notes/6639.md
@@ -0,0 +1 @@
+Teach the doctor to remove orphaned two_factor with `forgejo doctor check --run check-db-consistency --fix`. Such rows may contain invalid data and [block the migration to v10](https://codeberg.org/forgejo/forgejo/issues/6637) with a message such as `failed: AesDecrypt invalid decrypted base64 string: illegal base64 data at input byte 0`.
diff --git a/renovate.json b/renovate.json
index 4e869db579..c34ae1aaba 100644
--- a/renovate.json
+++ b/renovate.json
@@ -9,8 +9,8 @@
"baseBranches": [
"$default",
"/^v7\\.\\d+/forgejo$/",
- "/^v9\\.\\d+/forgejo$/",
- "/^v10\\.\\d+/forgejo$/"
+ "/^v10\\.\\d+/forgejo$/",
+ "/^v11\\.\\d+/forgejo$/"
],
"postUpdateOptions": ["gomodTidy", "gomodUpdateImportPaths", "npmDedupe"],
"prConcurrentLimit": 10,
@@ -110,34 +110,19 @@
"matchUpdateTypes": ["patch"],
"automerge": true
},
- {
- "description": "Automerge renovate updates",
- "matchDatasources": ["docker"],
- "matchPackageNames": ["code.forgejo.org/forgejo-contrib/renovate"],
- "matchUpdateTypes": ["minor", "patch", "digest"],
- "automerge": true
- },
{
"description": "Add reviewer and additional labels to renovate PRs",
"matchDatasources": ["docker"],
- "matchPackageNames": ["code.forgejo.org/forgejo-contrib/renovate"],
+ "matchPackageNames": ["data.forgejo.org/renovate/renovate"],
"reviewers": ["viceice"],
"addLabels": ["forgejo/ci", "test/not-needed"]
},
- {
- "description": "Update renovate with higher prio to come through rate limit",
- "matchDatasources": ["docker"],
- "matchPackageNames": ["code.forgejo.org/forgejo-contrib/renovate"],
- "extends": ["schedule:weekly"],
- "prPriority": 10,
- "groupName": "renovate"
- },
{
"description": "Disable renovate self-updates for release branches",
"matchBaseBranches": ["/^v\\d+\\.\\d+\\/forgejo$/"],
- "matchDatasources": ["docker"],
"matchPackageNames": [
"code.forgejo.org/forgejo-contrib/renovate",
+ "data.forgejo.org/renovate/renovate",
"ghcr.io/visualon/renovate"
],
"enabled": false
diff --git a/routers/api/packages/alt/alt.go b/routers/api/packages/alt/alt.go
new file mode 100644
index 0000000000..37a2b64563
--- /dev/null
+++ b/routers/api/packages/alt/alt.go
@@ -0,0 +1,260 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package alt
+
+import (
+ stdctx "context"
+ "errors"
+ "fmt"
+ "io"
+ "net/http"
+ "strings"
+
+ "code.gitea.io/gitea/models/db"
+ packages_model "code.gitea.io/gitea/models/packages"
+ "code.gitea.io/gitea/modules/json"
+ packages_module "code.gitea.io/gitea/modules/packages"
+ rpm_module "code.gitea.io/gitea/modules/packages/rpm"
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/util"
+ "code.gitea.io/gitea/routers/api/packages/helper"
+ "code.gitea.io/gitea/services/context"
+ notify_service "code.gitea.io/gitea/services/notify"
+ packages_service "code.gitea.io/gitea/services/packages"
+ alt_service "code.gitea.io/gitea/services/packages/alt"
+)
+
+func apiError(ctx *context.Context, status int, obj any) {
+ helper.LogAndProcessError(ctx, status, obj, func(message string) {
+ ctx.PlainText(status, message)
+ })
+}
+
+func GetRepositoryConfig(ctx *context.Context) {
+ group := ctx.Params("group")
+
+ var groupParts []string
+ if group != "" {
+ groupParts = strings.Split(group, "/")
+ }
+
+ url := fmt.Sprintf("%sapi/packages/%s/alt", setting.AppURL, ctx.Package.Owner.Name)
+
+ ctx.PlainText(http.StatusOK, `[gitea-`+strings.Join(append([]string{ctx.Package.Owner.LowerName}, groupParts...), "-")+`]
+name=`+strings.Join(append([]string{ctx.Package.Owner.Name, setting.AppName}, groupParts...), " - ")+`
+baseurl=`+strings.Join(append([]string{url}, groupParts...), "/")+`
+enabled=1`)
+}
+
+// Gets a pre-generated repository metadata file
+func GetRepositoryFile(ctx *context.Context, arch string) {
+ pv, err := alt_service.GetOrCreateRepositoryVersion(ctx, ctx.Package.Owner.ID)
+ if err != nil {
+ apiError(ctx, http.StatusInternalServerError, err)
+ return
+ }
+
+ s, u, pf, err := packages_service.GetFileStreamByPackageVersion(
+ ctx,
+ pv,
+ &packages_service.PackageFileInfo{
+ Filename: ctx.Params("filename"),
+ CompositeKey: arch + "__" + ctx.Params("group"),
+ },
+ )
+ if err != nil {
+ if errors.Is(err, util.ErrNotExist) {
+ apiError(ctx, http.StatusNotFound, err)
+ } else {
+ apiError(ctx, http.StatusInternalServerError, err)
+ }
+ return
+ }
+
+ helper.ServePackageFile(ctx, s, u, pf)
+}
+
+func UploadPackageFile(ctx *context.Context) {
+ upload, needToClose, err := ctx.UploadStream()
+ if err != nil {
+ apiError(ctx, http.StatusInternalServerError, err)
+ return
+ }
+ if needToClose {
+ defer upload.Close()
+ }
+
+ buf, err := packages_module.CreateHashedBufferFromReader(upload)
+ if err != nil {
+ apiError(ctx, http.StatusInternalServerError, err)
+ return
+ }
+ defer buf.Close()
+
+ pck, err := rpm_module.ParsePackage(buf, "alt")
+ if err != nil {
+ if errors.Is(err, util.ErrInvalidArgument) {
+ apiError(ctx, http.StatusBadRequest, err)
+ } else {
+ apiError(ctx, http.StatusInternalServerError, err)
+ }
+ return
+ }
+ if _, err := buf.Seek(0, io.SeekStart); err != nil {
+ apiError(ctx, http.StatusInternalServerError, err)
+ return
+ }
+
+ fileMetadataRaw, err := json.Marshal(pck.FileMetadata)
+ if err != nil {
+ apiError(ctx, http.StatusInternalServerError, err)
+ return
+ }
+ group := ctx.Params("group")
+ _, _, err = packages_service.CreatePackageOrAddFileToExisting(
+ ctx,
+ &packages_service.PackageCreationInfo{
+ PackageInfo: packages_service.PackageInfo{
+ Owner: ctx.Package.Owner,
+ PackageType: packages_model.TypeAlt,
+ Name: pck.Name,
+ Version: pck.Version,
+ },
+ Creator: ctx.Doer,
+ Metadata: pck.VersionMetadata,
+ },
+ &packages_service.PackageFileCreationInfo{
+ PackageFileInfo: packages_service.PackageFileInfo{
+ Filename: fmt.Sprintf("%s-%s.%s.rpm", pck.Name, pck.Version, pck.FileMetadata.Architecture),
+ CompositeKey: group,
+ },
+ Creator: ctx.Doer,
+ Data: buf,
+ IsLead: true,
+ Properties: map[string]string{
+ rpm_module.PropertyGroup: group,
+ rpm_module.PropertyArchitecture: pck.FileMetadata.Architecture,
+ rpm_module.PropertyMetadata: string(fileMetadataRaw),
+ },
+ },
+ )
+ if err != nil {
+ switch err {
+ case packages_model.ErrDuplicatePackageVersion, packages_model.ErrDuplicatePackageFile:
+ apiError(ctx, http.StatusConflict, err)
+ case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
+ apiError(ctx, http.StatusForbidden, err)
+ default:
+ apiError(ctx, http.StatusInternalServerError, err)
+ }
+ return
+ }
+
+ if err := alt_service.BuildSpecificRepositoryFiles(ctx, ctx.Package.Owner.ID, group); err != nil {
+ apiError(ctx, http.StatusInternalServerError, err)
+ return
+ }
+
+ ctx.Status(http.StatusCreated)
+}
+
+func DownloadPackageFile(ctx *context.Context) {
+ name := ctx.Params("name")
+ version := ctx.Params("version")
+
+ s, u, pf, err := packages_service.GetFileStreamByPackageNameAndVersion(
+ ctx,
+ &packages_service.PackageInfo{
+ Owner: ctx.Package.Owner,
+ PackageType: packages_model.TypeAlt,
+ Name: name,
+ Version: version,
+ },
+ &packages_service.PackageFileInfo{
+ Filename: fmt.Sprintf("%s-%s.%s.rpm", name, version, ctx.Params("architecture")),
+ CompositeKey: ctx.Params("group"),
+ },
+ )
+ if err != nil {
+ if errors.Is(err, util.ErrNotExist) {
+ apiError(ctx, http.StatusNotFound, err)
+ } else {
+ apiError(ctx, http.StatusInternalServerError, err)
+ }
+ return
+ }
+
+ helper.ServePackageFile(ctx, s, u, pf)
+}
+
+func DeletePackageFile(webctx *context.Context) {
+ group := webctx.Params("group")
+ name := webctx.Params("name")
+ version := webctx.Params("version")
+ architecture := webctx.Params("architecture")
+
+ var pd *packages_model.PackageDescriptor
+
+ err := db.WithTx(webctx, func(ctx stdctx.Context) error {
+ pv, err := packages_model.GetVersionByNameAndVersion(ctx,
+ webctx.Package.Owner.ID,
+ packages_model.TypeAlt,
+ name,
+ version,
+ )
+ if err != nil {
+ return err
+ }
+
+ pf, err := packages_model.GetFileForVersionByName(
+ ctx,
+ pv.ID,
+ fmt.Sprintf("%s-%s.%s.rpm", name, version, architecture),
+ group,
+ )
+ if err != nil {
+ return err
+ }
+
+ if err := packages_service.DeletePackageFile(ctx, pf); err != nil {
+ return err
+ }
+
+ has, err := packages_model.HasVersionFileReferences(ctx, pv.ID)
+ if err != nil {
+ return err
+ }
+ if !has {
+ pd, err = packages_model.GetPackageDescriptor(ctx, pv)
+ if err != nil {
+ return err
+ }
+
+ if err := packages_service.DeletePackageVersionAndReferences(ctx, pv); err != nil {
+ return err
+ }
+ }
+
+ return nil
+ })
+ if err != nil {
+ if errors.Is(err, util.ErrNotExist) {
+ apiError(webctx, http.StatusNotFound, err)
+ } else {
+ apiError(webctx, http.StatusInternalServerError, err)
+ }
+ return
+ }
+
+ if pd != nil {
+ notify_service.PackageDelete(webctx, webctx.Doer, pd)
+ }
+
+ if err := alt_service.BuildSpecificRepositoryFiles(webctx, webctx.Package.Owner.ID, group); err != nil {
+ apiError(webctx, http.StatusInternalServerError, err)
+ return
+ }
+
+ webctx.Status(http.StatusNoContent)
+}
diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go
index e216a0c02b..ffc62254d0 100644
--- a/routers/api/packages/api.go
+++ b/routers/api/packages/api.go
@@ -15,6 +15,7 @@ import (
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/web"
"code.gitea.io/gitea/routers/api/packages/alpine"
+ "code.gitea.io/gitea/routers/api/packages/alt"
"code.gitea.io/gitea/routers/api/packages/arch"
"code.gitea.io/gitea/routers/api/packages/cargo"
"code.gitea.io/gitea/routers/api/packages/chef"
@@ -624,6 +625,73 @@ func CommonRoutes() *web.Route {
ctx.Status(http.StatusNotFound)
})
}, reqPackageAccess(perm.AccessModeRead))
+ r.Group("/alt", func() {
+ var (
+ baseURLPattern = regexp.MustCompile(`\A(.*?)\.repo\z`)
+ uploadPattern = regexp.MustCompile(`\A(.*?)/upload\z`)
+ baseRepoPattern = regexp.MustCompile(`(\S+)\.repo/(\S+)\/base/(\S+)`)
+ rpmsRepoPattern = regexp.MustCompile(`(\S+)\.repo/(\S+)\.(\S+)\/([a-zA-Z0-9_-]+)-([\d.]+-[a-zA-Z0-9_-]+)\.(\S+)\.rpm`)
+ )
+
+ r.Methods("HEAD,GET,PUT,DELETE", "*", func(ctx *context.Context) {
+ path := ctx.Params("*")
+ isGetHead := ctx.Req.Method == "HEAD" || ctx.Req.Method == "GET"
+ isPut := ctx.Req.Method == "PUT"
+ isDelete := ctx.Req.Method == "DELETE"
+
+ m := baseURLPattern.FindStringSubmatch(path)
+ if len(m) == 2 && isGetHead {
+ ctx.SetParams("group", strings.Trim(m[1], "/"))
+ alt.GetRepositoryConfig(ctx)
+ return
+ }
+
+ m = baseRepoPattern.FindStringSubmatch(path)
+ if len(m) == 4 {
+ if strings.Trim(m[1], "/") != "alt" {
+ ctx.SetParams("group", strings.Trim(m[1], "/"))
+ }
+ ctx.SetParams("filename", m[3])
+ if isGetHead {
+ alt.GetRepositoryFile(ctx, m[2])
+ }
+ return
+ }
+
+ m = uploadPattern.FindStringSubmatch(path)
+ if len(m) == 2 && isPut {
+ reqPackageAccess(perm.AccessModeWrite)(ctx)
+ if ctx.Written() {
+ return
+ }
+ ctx.SetParams("group", strings.Trim(m[1], "/"))
+ alt.UploadPackageFile(ctx)
+ return
+ }
+
+ m = rpmsRepoPattern.FindStringSubmatch(path)
+ if len(m) == 7 && (isGetHead || isDelete) {
+ if strings.Trim(m[1], "/") != "alt" {
+ ctx.SetParams("group", strings.Trim(m[1], "/"))
+ }
+ ctx.SetParams("name", m[4])
+ ctx.SetParams("version", m[5])
+ ctx.SetParams("architecture", m[6])
+ if isGetHead {
+ alt.DownloadPackageFile(ctx)
+ } else {
+ reqPackageAccess(perm.AccessModeWrite)(ctx)
+ if ctx.Written() {
+ return
+ }
+ alt.DeletePackageFile(ctx)
+ }
+ return
+ }
+
+ ctx.Status(http.StatusNotFound)
+ })
+ }, reqPackageAccess(perm.AccessModeRead))
r.Group("/rubygems", func() {
r.Get("/specs.4.8.gz", rubygems.EnumeratePackages)
r.Get("/latest_specs.4.8.gz", rubygems.EnumeratePackagesLatest)
diff --git a/routers/api/packages/container/blob.go b/routers/api/packages/container/blob.go
index 9e3a47076c..24e52d0972 100644
--- a/routers/api/packages/container/blob.go
+++ b/routers/api/packages/container/blob.go
@@ -193,7 +193,7 @@ func deleteBlob(ctx context.Context, ownerID int64, image, digest string) error
}
func digestFromHashSummer(h packages_module.HashSummer) string {
- _, _, hashSHA256, _ := h.Sums()
+ _, _, hashSHA256, _, _ := h.Sums()
return "sha256:" + hex.EncodeToString(hashSHA256)
}
diff --git a/routers/api/packages/maven/maven.go b/routers/api/packages/maven/maven.go
index 521ef2209a..92f20255e1 100644
--- a/routers/api/packages/maven/maven.go
+++ b/routers/api/packages/maven/maven.go
@@ -24,6 +24,7 @@ import (
"code.gitea.io/gitea/modules/log"
packages_module "code.gitea.io/gitea/modules/packages"
maven_module "code.gitea.io/gitea/modules/packages/maven"
+ "code.gitea.io/gitea/modules/sync"
"code.gitea.io/gitea/routers/api/packages/helper"
"code.gitea.io/gitea/services/context"
packages_service "code.gitea.io/gitea/services/packages"
@@ -228,6 +229,8 @@ func servePackageFile(ctx *context.Context, params parameters, serveContent bool
helper.ServePackageFile(ctx, s, u, pf, opts)
}
+var mavenUploadLock = sync.NewExclusivePool()
+
// UploadPackageFile adds a file to the package. If the package does not exist, it gets created.
func UploadPackageFile(ctx *context.Context) {
params, err := extractPathParameters(ctx)
@@ -246,6 +249,9 @@ func UploadPackageFile(ctx *context.Context) {
packageName := params.GroupID + "-" + params.ArtifactID
+ mavenUploadLock.CheckIn(packageName)
+ defer mavenUploadLock.CheckOut(packageName)
+
buf, err := packages_module.CreateHashedBufferFromReader(ctx.Req.Body)
if err != nil {
apiError(ctx, http.StatusInternalServerError, err)
diff --git a/routers/api/packages/pypi/pypi.go b/routers/api/packages/pypi/pypi.go
index 7824db1823..19d6dc6903 100644
--- a/routers/api/packages/pypi/pypi.go
+++ b/routers/api/packages/pypi/pypi.go
@@ -10,6 +10,7 @@ import (
"regexp"
"sort"
"strings"
+ "unicode"
packages_model "code.gitea.io/gitea/models/packages"
packages_module "code.gitea.io/gitea/modules/packages"
@@ -120,7 +121,7 @@ func UploadPackageFile(ctx *context.Context) {
}
defer buf.Close()
- _, _, hashSHA256, _ := buf.Sums()
+ _, _, hashSHA256, _, _ := buf.Sums()
if !strings.EqualFold(ctx.Req.FormValue("sha256_digest"), hex.EncodeToString(hashSHA256)) {
apiError(ctx, http.StatusBadRequest, "hash mismatch")
@@ -139,9 +140,30 @@ func UploadPackageFile(ctx *context.Context) {
return
}
- projectURL := ctx.Req.FormValue("home_page")
- if !validation.IsValidURL(projectURL) {
- projectURL = ""
+ // Ensure ctx.Req.Form exists.
+ _ = ctx.Req.ParseForm()
+
+ var homepageURL string
+ projectURLs := ctx.Req.Form["project_urls"]
+ for _, purl := range projectURLs {
+ label, url, found := strings.Cut(purl, ",")
+ if !found {
+ continue
+ }
+ if normalizeLabel(label) != "homepage" {
+ continue
+ }
+ homepageURL = strings.TrimSpace(url)
+ break
+ }
+
+ if len(homepageURL) == 0 {
+ // TODO: Home-page is a deprecated metadata field. Remove this branch once it's no longer apart of the spec.
+ homepageURL = ctx.Req.FormValue("home_page")
+ }
+
+ if !validation.IsValidURL(homepageURL) {
+ homepageURL = ""
}
_, _, err = packages_service.CreatePackageOrAddFileToExisting(
@@ -160,7 +182,7 @@ func UploadPackageFile(ctx *context.Context) {
Description: ctx.Req.FormValue("description"),
LongDescription: ctx.Req.FormValue("long_description"),
Summary: ctx.Req.FormValue("summary"),
- ProjectURL: projectURL,
+ ProjectURL: homepageURL,
License: ctx.Req.FormValue("license"),
RequiresPython: ctx.Req.FormValue("requires_python"),
},
@@ -189,6 +211,23 @@ func UploadPackageFile(ctx *context.Context) {
ctx.Status(http.StatusCreated)
}
+// Normalizes a Project-URL label.
+// See https://packaging.python.org/en/latest/specifications/well-known-project-urls/#label-normalization.
+func normalizeLabel(label string) string {
+ var builder strings.Builder
+
+ // "A label is normalized by deleting all ASCII punctuation and whitespace, and then converting the result
+ // to lowercase."
+ for _, r := range label {
+ if unicode.IsPunct(r) || unicode.IsSpace(r) {
+ continue
+ }
+ builder.WriteRune(unicode.ToLower(r))
+ }
+
+ return builder.String()
+}
+
func isValidNameAndVersion(packageName, packageVersion string) bool {
return nameMatcher.MatchString(packageName) && versionMatcher.MatchString(packageVersion)
}
diff --git a/routers/api/packages/pypi/pypi_test.go b/routers/api/packages/pypi/pypi_test.go
index 3023692177..786105693f 100644
--- a/routers/api/packages/pypi/pypi_test.go
+++ b/routers/api/packages/pypi/pypi_test.go
@@ -36,3 +36,13 @@ func TestIsValidNameAndVersion(t *testing.T) {
assert.False(t, isValidNameAndVersion("test-name", "1.0.1aa"))
assert.False(t, isValidNameAndVersion("test-name", "1.0.0-alpha.beta"))
}
+
+func TestNormalizeLabel(t *testing.T) {
+ // Cases fetched from https://packaging.python.org/en/latest/specifications/well-known-project-urls/#label-normalization.
+ assert.Equal(t, "homepage", normalizeLabel("Homepage"))
+ assert.Equal(t, "homepage", normalizeLabel("Home-page"))
+ assert.Equal(t, "homepage", normalizeLabel("Home page"))
+ assert.Equal(t, "changelog", normalizeLabel("Change_Log"))
+ assert.Equal(t, "whatsnew", normalizeLabel("What's New?"))
+ assert.Equal(t, "github", normalizeLabel("github"))
+}
diff --git a/routers/api/packages/rpm/rpm.go b/routers/api/packages/rpm/rpm.go
index 54fb01c854..d56678514c 100644
--- a/routers/api/packages/rpm/rpm.go
+++ b/routers/api/packages/rpm/rpm.go
@@ -149,7 +149,7 @@ func UploadPackageFile(ctx *context.Context) {
buf = signedBuf
}
- pck, err := rpm_module.ParsePackage(buf)
+ pck, err := rpm_module.ParsePackage(buf, "rpm")
if err != nil {
if errors.Is(err, util.ErrInvalidArgument) {
apiError(ctx, http.StatusBadRequest, err)
diff --git a/routers/api/v1/activitypub/reqsignature.go b/routers/api/v1/activitypub/reqsignature.go
index 6003f664a0..19d167b50b 100644
--- a/routers/api/v1/activitypub/reqsignature.go
+++ b/routers/api/v1/activitypub/reqsignature.go
@@ -18,8 +18,8 @@ import (
"code.gitea.io/gitea/modules/setting"
gitea_context "code.gitea.io/gitea/services/context"
+ "github.com/42wim/httpsig"
ap "github.com/go-ap/activitypub"
- "github.com/go-fed/httpsig"
)
func getPublicKeyFromResponse(b []byte, keyID *url.URL) (p crypto.PublicKey, err error) {
diff --git a/routers/api/v1/admin/runners.go b/routers/api/v1/admin/runners.go
index 329242d9f6..d0cfef8e48 100644
--- a/routers/api/v1/admin/runners.go
+++ b/routers/api/v1/admin/runners.go
@@ -24,3 +24,23 @@ func GetRegistrationToken(ctx *context.APIContext) {
shared.GetRegistrationToken(ctx, 0, 0)
}
+
+// SearchActionRunJobs return a list of actions jobs filtered by the provided parameters
+func SearchActionRunJobs(ctx *context.APIContext) {
+ // swagger:operation GET /admin/runners/jobs admin adminSearchRunJobs
+ // ---
+ // summary: Search action jobs according filter conditions
+ // produces:
+ // - application/json
+ // parameters:
+ // - name: labels
+ // in: query
+ // description: a comma separated list of run job labels to search for
+ // type: string
+ // responses:
+ // "200":
+ // "$ref": "#/responses/RunJobList"
+ // "403":
+ // "$ref": "#/responses/forbidden"
+ shared.GetActionRunJobs(ctx, 0, 0)
+}
diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go
index acab883107..db8f6627e6 100644
--- a/routers/api/v1/admin/user.go
+++ b/routers/api/v1/admin/user.go
@@ -523,7 +523,7 @@ func RenameUser(ctx *context.APIContext) {
newName := web.GetForm(ctx).(*api.RenameUserOption).NewName
// Check if user name has been changed
- if err := user_service.RenameUser(ctx, ctx.ContextUser, newName); err != nil {
+ if err := user_service.AdminRenameUser(ctx, ctx.ContextUser, newName); err != nil {
switch {
case user_model.IsErrUserAlreadyExist(err):
ctx.Error(http.StatusUnprocessableEntity, "", ctx.Tr("form.username_been_taken"))
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index 4928c9ff58..8e1ccdc5e2 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -822,6 +822,7 @@ func Routes() *web.Route {
m.Group("/runners", func() {
m.Get("/registration-token", reqToken(), reqChecker, act.GetRegistrationToken)
+ m.Get("/jobs", reqToken(), reqChecker, act.SearchActionRunJobs)
})
})
}
@@ -907,9 +908,9 @@ func Routes() *web.Route {
m.Get("/repos", tokenRequiresScopes(auth_model.AccessTokenScopeCategoryRepository), reqExploreSignIn(), user.ListUserRepos)
m.Group("/tokens", func() {
m.Combo("").Get(user.ListAccessTokens).
- Post(bind(api.CreateAccessTokenOption{}), reqToken(), user.CreateAccessToken)
- m.Combo("/{id}").Delete(reqToken(), user.DeleteAccessToken)
- }, reqSelfOrAdmin(), reqBasicOrRevProxyAuth())
+ Post(bind(api.CreateAccessTokenOption{}), reqBasicOrRevProxyAuth(), reqToken(), user.CreateAccessToken)
+ m.Combo("/{id}").Delete(reqBasicOrRevProxyAuth(), reqToken(), user.DeleteAccessToken)
+ }, reqSelfOrAdmin())
m.Get("/activities/feeds", user.ListUserActivityFeeds)
}, context.UserAssignmentAPI(), checkTokenPublicOnly(), individualPermsChecker)
@@ -975,6 +976,7 @@ func Routes() *web.Route {
m.Group("/runners", func() {
m.Get("/registration-token", reqToken(), user.GetRegistrationToken)
+ m.Get("/jobs", reqToken(), user.SearchActionRunJobs)
})
})
@@ -1631,6 +1633,7 @@ func Routes() *web.Route {
})
m.Group("/runners", func() {
m.Get("/registration-token", admin.GetRegistrationToken)
+ m.Get("/jobs", admin.SearchActionRunJobs)
})
if setting.Quota.Enabled {
m.Group("/quota", func() {
diff --git a/routers/api/v1/org/action.go b/routers/api/v1/org/action.go
index 03a1fa8ccc..8cd2e00e00 100644
--- a/routers/api/v1/org/action.go
+++ b/routers/api/v1/org/action.go
@@ -189,6 +189,31 @@ func (Action) GetRegistrationToken(ctx *context.APIContext) {
shared.GetRegistrationToken(ctx, ctx.Org.Organization.ID, 0)
}
+// SearchActionRunJobs return a list of actions jobs filtered by the provided parameters
+func (Action) SearchActionRunJobs(ctx *context.APIContext) {
+ // swagger:operation GET /orgs/{org}/actions/runners/jobs organization orgSearchRunJobs
+ // ---
+ // summary: Search for organization's action jobs according filter conditions
+ // produces:
+ // - application/json
+ // parameters:
+ // - name: org
+ // in: path
+ // description: name of the organization
+ // type: string
+ // required: true
+ // - name: labels
+ // in: query
+ // description: a comma separated list of run job labels to search for
+ // type: string
+ // responses:
+ // "200":
+ // "$ref": "#/responses/RunJobList"
+ // "403":
+ // "$ref": "#/responses/forbidden"
+ shared.GetActionRunJobs(ctx, ctx.Org.Organization.ID, 0)
+}
+
// ListVariables list org-level variables
func (Action) ListVariables(ctx *context.APIContext) {
// swagger:operation GET /orgs/{org}/actions/variables organization getOrgVariablesList
diff --git a/routers/api/v1/repo/action.go b/routers/api/v1/repo/action.go
index 0c7506b13b..2ff52c3744 100644
--- a/routers/api/v1/repo/action.go
+++ b/routers/api/v1/repo/action.go
@@ -507,6 +507,36 @@ func (Action) GetRegistrationToken(ctx *context.APIContext) {
shared.GetRegistrationToken(ctx, 0, ctx.Repo.Repository.ID)
}
+// SearchActionRunJobs return a list of actions jobs filtered by the provided parameters
+func (Action) SearchActionRunJobs(ctx *context.APIContext) {
+ // swagger:operation GET /repos/{owner}/{repo}/actions/runners/jobs repository repoSearchRunJobs
+ // ---
+ // summary: Search for repository's action jobs according filter conditions
+ // produces:
+ // - application/json
+ // parameters:
+ // - name: owner
+ // in: path
+ // description: owner of the repo
+ // type: string
+ // required: true
+ // - name: repo
+ // in: path
+ // description: name of the repo
+ // type: string
+ // required: true
+ // - name: labels
+ // in: query
+ // description: a comma separated list of run job labels to search for
+ // type: string
+ // responses:
+ // "200":
+ // "$ref": "#/responses/RunJobList"
+ // "403":
+ // "$ref": "#/responses/forbidden"
+ shared.GetActionRunJobs(ctx, 0, ctx.Repo.Repository.ID)
+}
+
var _ actions_service.API = new(Action)
// Action implements actions_service.API
diff --git a/routers/api/v1/repo/compare.go b/routers/api/v1/repo/compare.go
index 429145c714..7781e996f5 100644
--- a/routers/api/v1/repo/compare.go
+++ b/routers/api/v1/repo/compare.go
@@ -77,6 +77,7 @@ func CompareDiff(ctx *context.APIContext) {
files := ctx.FormString("files") == "" || ctx.FormBool("files")
apiCommits := make([]*api.Commit, 0, len(ci.Commits))
+ apiFiles := []*api.CommitAffectedFiles{}
userCache := make(map[string]*user_model.User)
for i := 0; i < len(ci.Commits); i++ {
apiCommit, err := convert.ToCommit(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ci.Commits[i], userCache,
@@ -90,10 +91,12 @@ func CompareDiff(ctx *context.APIContext) {
return
}
apiCommits = append(apiCommits, apiCommit)
+ apiFiles = append(apiFiles, apiCommit.Files...)
}
ctx.JSON(http.StatusOK, &api.Compare{
TotalCommits: len(ci.Commits),
Commits: apiCommits,
+ Files: apiFiles,
})
}
diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go
index 2cea538b72..55b245676d 100644
--- a/routers/api/v1/repo/file.go
+++ b/routers/api/v1/repo/file.go
@@ -11,7 +11,6 @@ import (
"fmt"
"io"
"net/http"
- "path"
"strings"
"time"
@@ -247,19 +246,14 @@ func getBlobForEntry(ctx *context.APIContext) (blob *git.Blob, entry *git.TreeEn
return nil, nil, nil
}
- info, _, err := git.Entries([]*git.TreeEntry{entry}).GetCommitsInfo(ctx, ctx.Repo.Commit, path.Dir("/" + ctx.Repo.TreePath)[1:])
+ latestCommit, err := ctx.Repo.GitRepo.GetTreePathLatestCommit(ctx.Repo.Commit.ID.String(), ctx.Repo.TreePath)
if err != nil {
- ctx.Error(http.StatusInternalServerError, "GetCommitsInfo", err)
+ ctx.Error(http.StatusInternalServerError, "GetTreePathLatestCommit", err)
return nil, nil, nil
}
+ when := &latestCommit.Committer.When
- if len(info) == 1 {
- // Not Modified
- lastModified = &info[0].Commit.Committer.When
- }
- blob = entry.Blob()
-
- return blob, entry, lastModified
+ return entry.Blob(), entry, when
}
// GetArchive get archive of a repository
diff --git a/routers/api/v1/repo/issue_label.go b/routers/api/v1/repo/issue_label.go
index ae05544365..6458fbf514 100644
--- a/routers/api/v1/repo/issue_label.go
+++ b/routers/api/v1/repo/issue_label.go
@@ -350,6 +350,9 @@ func prepareForReplaceOrAdd(ctx *context.APIContext, form api.IssueLabelsOption)
labelIDs = append(labelIDs, int64(rv.Float()))
case reflect.String:
labelNames = append(labelNames, rv.String())
+ default:
+ ctx.Error(http.StatusBadRequest, "InvalidLabel", "a label must be an integer or a string")
+ return nil, nil, fmt.Errorf("invalid label")
}
}
if len(labelIDs) > 0 && len(labelNames) > 0 {
@@ -357,11 +360,20 @@ func prepareForReplaceOrAdd(ctx *context.APIContext, form api.IssueLabelsOption)
return nil, nil, fmt.Errorf("invalid labels")
}
if len(labelNames) > 0 {
- labelIDs, err = issues_model.GetLabelIDsInRepoByNames(ctx, ctx.Repo.Repository.ID, labelNames)
+ repoLabelIDs, err := issues_model.GetLabelIDsInRepoByNames(ctx, ctx.Repo.Repository.ID, labelNames)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetLabelIDsInRepoByNames", err)
return nil, nil, err
}
+ labelIDs = append(labelIDs, repoLabelIDs...)
+ if ctx.Repo.Owner.IsOrganization() {
+ orgLabelIDs, err := issues_model.GetLabelIDsInOrgByNames(ctx, ctx.Repo.Owner.ID, labelNames)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "GetLabelIDsInOrgByNames", err)
+ return nil, nil, err
+ }
+ labelIDs = append(labelIDs, orgLabelIDs...)
+ }
}
labels, err := issues_model.GetLabelsByIDs(ctx, labelIDs, "id", "repo_id", "org_id", "name", "exclusive")
diff --git a/routers/api/v1/repo/migrate.go b/routers/api/v1/repo/migrate.go
index 0991723d47..723a696b92 100644
--- a/routers/api/v1/repo/migrate.go
+++ b/routers/api/v1/repo/migrate.go
@@ -218,6 +218,18 @@ func Migrate(ctx *context.APIContext) {
return
}
+ if opts.Releases || opts.Wiki {
+ repoOpt := api.EditRepoOption{
+ HasReleases: &opts.Releases,
+ HasWiki: &opts.Wiki,
+ }
+
+ // only enabling wiki could return an error
+ if err = updateRepoUnits(ctx, repoOpt); err != nil {
+ log.Error("Failed to enable wiki on %s/%s repo. %w", repoOwner.Name, form.RepoName, err)
+ }
+ }
+
log.Trace("Repository migrated: %s/%s", repoOwner.Name, form.RepoName)
ctx.JSON(http.StatusCreated, convert.ToRepo(ctx, repo, access_model.Permission{AccessMode: perm.AccessModeAdmin}))
}
diff --git a/routers/api/v1/shared/runners.go b/routers/api/v1/shared/runners.go
index f184786d7d..53761a07e9 100644
--- a/routers/api/v1/shared/runners.go
+++ b/routers/api/v1/shared/runners.go
@@ -6,8 +6,11 @@ package shared
import (
"errors"
"net/http"
+ "strings"
actions_model "code.gitea.io/gitea/models/actions"
+ "code.gitea.io/gitea/models/db"
+ "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/services/context"
)
@@ -30,3 +33,48 @@ func GetRegistrationToken(ctx *context.APIContext, ownerID, repoID int64) {
ctx.JSON(http.StatusOK, RegistrationToken{Token: token.Token})
}
+
+// RunJobList is a list of action run jobs
+// swagger:response RunJobList
+type RunJobList struct {
+ // in:body
+ Body []*structs.ActionRunJob `json:"body"`
+}
+
+func GetActionRunJobs(ctx *context.APIContext, ownerID, repoID int64) {
+ labels := strings.Split(ctx.FormTrim("labels"), ",")
+
+ total, err := db.Find[actions_model.ActionRunJob](ctx, &actions_model.FindTaskOptions{
+ Status: []actions_model.Status{actions_model.StatusWaiting, actions_model.StatusRunning},
+ OwnerID: ownerID,
+ RepoID: repoID,
+ })
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "CountWaitingActionRunJobs", err)
+ return
+ }
+
+ res := new(RunJobList)
+ res.Body = fromRunJobModelToResponse(total, labels)
+
+ ctx.JSON(http.StatusOK, res)
+}
+
+func fromRunJobModelToResponse(job []*actions_model.ActionRunJob, labels []string) []*structs.ActionRunJob {
+ var res []*structs.ActionRunJob
+ for i := range job {
+ if job[i].ItRunsOn(labels) {
+ res = append(res, &structs.ActionRunJob{
+ ID: job[i].ID,
+ RepoID: job[i].RepoID,
+ OwnerID: job[i].OwnerID,
+ Name: job[i].Name,
+ Needs: job[i].Needs,
+ RunsOn: job[i].RunsOn,
+ TaskID: job[i].TaskID,
+ Status: job[i].Status.String(),
+ })
+ }
+ }
+ return res
+}
diff --git a/routers/api/v1/user/runners.go b/routers/api/v1/user/runners.go
index dc4c187ffe..5e8cdbeb58 100644
--- a/routers/api/v1/user/runners.go
+++ b/routers/api/v1/user/runners.go
@@ -28,3 +28,25 @@ func GetRegistrationToken(ctx *context.APIContext) {
shared.GetRegistrationToken(ctx, ctx.Doer.ID, 0)
}
+
+// SearchActionRunJobs return a list of actions jobs filtered by the provided parameters
+func SearchActionRunJobs(ctx *context.APIContext) {
+ // swagger:operation GET /user/actions/runners/jobs user userSearchRunJobs
+ // ---
+ // summary: Search for user's action jobs according filter conditions
+ // produces:
+ // - application/json
+ // parameters:
+ // - name: labels
+ // in: query
+ // description: a comma separated list of run job labels to search for
+ // type: string
+ // responses:
+ // "200":
+ // "$ref": "#/responses/RunJobList"
+ // "401":
+ // "$ref": "#/responses/unauthorized"
+ // "403":
+ // "$ref": "#/responses/forbidden"
+ shared.GetActionRunJobs(ctx, ctx.Doer.ID, 0)
+}
diff --git a/routers/common/middleware.go b/routers/common/middleware.go
index 59e59b8d3f..ebc4d62d03 100644
--- a/routers/common/middleware.go
+++ b/routers/common/middleware.go
@@ -6,6 +6,7 @@ package common
import (
"fmt"
"net/http"
+ "runtime/trace"
"strings"
"code.gitea.io/gitea/modules/cache"
@@ -43,6 +44,8 @@ func ProtocolMiddlewares() (handlers []any) {
return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
ctx, _, finished := process.GetManager().AddTypedContext(req.Context(), fmt.Sprintf("%s: %s", req.Method, req.RequestURI), process.RequestProcessType, true)
defer finished()
+ trace.Log(ctx, "method", req.Method)
+ trace.Log(ctx, "url", req.RequestURI)
next.ServeHTTP(context.WrapResponseWriter(resp), req.WithContext(cache.WithCacheContext(ctx)))
})
})
diff --git a/routers/web/admin/auths.go b/routers/web/admin/auths.go
index 799b7e8a84..dcdc8e6a2a 100644
--- a/routers/web/admin/auths.go
+++ b/routers/web/admin/auths.go
@@ -197,6 +197,7 @@ func parseOAuth2Config(form forms.AuthenticationForm) *oauth2.Source {
CustomURLMapping: customURLMapping,
IconURL: form.Oauth2IconURL,
Scopes: scopes,
+ AttributeSSHPublicKey: form.Oauth2AttributeSSHPublicKey,
RequiredClaimName: form.Oauth2RequiredClaimName,
RequiredClaimValue: form.Oauth2RequiredClaimValue,
SkipLocalTwoFA: form.SkipLocalTwoFA,
diff --git a/routers/web/admin/diagnosis.go b/routers/web/admin/diagnosis.go
index 020554a35a..959c9bc444 100644
--- a/routers/web/admin/diagnosis.go
+++ b/routers/web/admin/diagnosis.go
@@ -6,7 +6,9 @@ package admin
import (
"archive/zip"
"fmt"
+ "runtime"
"runtime/pprof"
+ "runtime/trace"
"time"
"code.gitea.io/gitea/modules/httplib"
@@ -15,17 +17,12 @@ import (
func MonitorDiagnosis(ctx *context.Context) {
seconds := ctx.FormInt64("seconds")
- if seconds <= 5 {
- seconds = 5
- }
- if seconds > 300 {
- seconds = 300
- }
+ seconds = max(5, min(300, seconds))
httplib.ServeSetHeaders(ctx.Resp, &httplib.ServeHeaderOptions{
ContentType: "application/zip",
Disposition: "attachment",
- Filename: fmt.Sprintf("gitea-diagnosis-%s.zip", time.Now().Format("20060102-150405")),
+ Filename: fmt.Sprintf("forgejo-diagnosis-%s.zip", time.Now().Format("20060102-150405")),
})
zipWriter := zip.NewWriter(ctx.Resp)
@@ -44,14 +41,27 @@ func MonitorDiagnosis(ctx *context.Context) {
return
}
- err = pprof.StartCPUProfile(f)
- if err == nil {
- time.Sleep(time.Duration(seconds) * time.Second)
- pprof.StopCPUProfile()
- } else {
+ if err := pprof.StartCPUProfile(f); err != nil {
_, _ = f.Write([]byte(err.Error()))
}
+ f, err = zipWriter.CreateHeader(&zip.FileHeader{Name: "trace.dat", Method: zip.Deflate, Modified: time.Now()})
+ if err != nil {
+ ctx.ServerError("Failed to create zip file", err)
+ return
+ }
+
+ if err := trace.Start(f); err != nil {
+ _, _ = f.Write([]byte(err.Error()))
+ }
+
+ select {
+ case <-time.After(time.Duration(seconds) * time.Second):
+ case <-ctx.Done():
+ }
+ pprof.StopCPUProfile()
+ trace.Stop()
+
f, err = zipWriter.CreateHeader(&zip.FileHeader{Name: "goroutine-after.txt", Method: zip.Deflate, Modified: time.Now()})
if err != nil {
ctx.ServerError("Failed to create zip file", err)
@@ -64,5 +74,8 @@ func MonitorDiagnosis(ctx *context.Context) {
ctx.ServerError("Failed to create zip file", err)
return
}
+ // To avoid showing memory that actually can be cleaned, run the garbage
+ // collector.
+ runtime.GC()
_ = pprof.Lookup("heap").WriteTo(f, 0)
}
diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go
index fb4a1ffa61..6bfc35cb99 100644
--- a/routers/web/admin/users.go
+++ b/routers/web/admin/users.go
@@ -349,7 +349,7 @@ func EditUserPost(ctx *context.Context) {
}
if form.UserName != "" {
- if err := user_service.RenameUser(ctx, u, form.UserName); err != nil {
+ if err := user_service.AdminRenameUser(ctx, u, form.UserName); err != nil {
switch {
case user_model.IsErrUserIsNotLocal(err):
ctx.Data["Err_UserName"] = true
diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go
index ccab47a9a2..5cb4ebb440 100644
--- a/routers/web/auth/auth.go
+++ b/routers/web/auth/auth.go
@@ -9,6 +9,7 @@ import (
"fmt"
"net/http"
"strings"
+ "time"
"code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/db"
@@ -555,6 +556,9 @@ func createUserInContext(ctx *context.Context, tpl base.TplName, form any, u *us
case user_model.IsErrEmailAlreadyUsed(err):
ctx.Data["Err_Email"] = true
ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tpl, form)
+ case user_model.IsErrCooldownPeriod(err):
+ ctx.Data["Err_UserName"] = true
+ ctx.RenderWithErr(ctx.Locale.Tr("form.username_claiming_cooldown", err.(user_model.ErrCooldownPeriod).ExpireTime.Format(time.RFC1123Z)), tpl, form)
case validation.IsErrEmailCharIsNotSupported(err):
ctx.Data["Err_Email"] = true
ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tpl, form)
diff --git a/routers/web/auth/oauth.go b/routers/web/auth/oauth.go
index fbdd47479a..62b7b0b6d3 100644
--- a/routers/web/auth/oauth.go
+++ b/routers/web/auth/oauth.go
@@ -17,6 +17,7 @@ import (
"sort"
"strings"
+ asymkey_model "code.gitea.io/gitea/models/asymkey"
"code.gitea.io/gitea/models/auth"
org_model "code.gitea.io/gitea/models/organization"
user_model "code.gitea.io/gitea/models/user"
@@ -1183,8 +1184,62 @@ func updateAvatarIfNeed(ctx *context.Context, url string, u *user_model.User) {
}
}
+func getSSHKeys(source *oauth2.Source, gothUser *goth.User) ([]string, error) {
+ key := source.AttributeSSHPublicKey
+ value, exists := gothUser.RawData[key]
+ if !exists {
+ return []string{}, nil
+ }
+
+ rawSlice, ok := value.([]any)
+ if !ok {
+ return nil, fmt.Errorf("unexpected type for SSH public key, expected []interface{} but got %T", value)
+ }
+
+ sshKeys := make([]string, 0, len(rawSlice))
+ for i, v := range rawSlice {
+ str, ok := v.(string)
+ if !ok {
+ return nil, fmt.Errorf("unexpected element type at index %d in SSH public key array, expected string but got %T", i, v)
+ }
+ sshKeys = append(sshKeys, str)
+ }
+
+ return sshKeys, nil
+}
+
+func updateSSHPubIfNeed(
+ ctx *context.Context,
+ authSource *auth.Source,
+ fetchedUser *goth.User,
+ user *user_model.User,
+) error {
+ oauth2Source := authSource.Cfg.(*oauth2.Source)
+
+ if oauth2Source.ProvidesSSHKeys() {
+ sshKeys, err := getSSHKeys(oauth2Source, fetchedUser)
+ if err != nil {
+ return err
+ }
+
+ if asymkey_model.SynchronizePublicKeys(ctx, user, authSource, sshKeys) {
+ err = asymkey_model.RewriteAllPublicKeys(ctx)
+ if err != nil {
+ return err
+ }
+ }
+ }
+
+ return nil
+}
+
func handleOAuth2SignIn(ctx *context.Context, source *auth.Source, u *user_model.User, gothUser goth.User) {
updateAvatarIfNeed(ctx, gothUser.AvatarURL, u)
+ err := updateSSHPubIfNeed(ctx, source, &gothUser, u)
+ if err != nil {
+ ctx.ServerError("updateSSHPubIfNeed", err)
+ return
+ }
needs2FA := false
if !source.Cfg.(*oauth2.Source).SkipLocalTwoFA {
diff --git a/routers/web/home.go b/routers/web/home.go
index d4be0931e8..4ea961c055 100644
--- a/routers/web/home.go
+++ b/routers/web/home.go
@@ -61,6 +61,9 @@ func Home(ctx *context.Context) {
ctx.Data["PageIsHome"] = true
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
+
+ ctx.Data["OpenGraphDescription"] = setting.UI.Meta.Description
+
ctx.HTML(http.StatusOK, tplHome)
}
diff --git a/routers/web/org/home.go b/routers/web/org/home.go
index 9ebefa334c..1b58d8fde9 100644
--- a/routers/web/org/home.go
+++ b/routers/web/org/home.go
@@ -47,6 +47,12 @@ func Home(ctx *context.Context) {
ctx.Data["PageIsUserProfile"] = true
ctx.Data["Title"] = org.DisplayName()
+ ctx.Data["OpenGraphTitle"] = ctx.ContextUser.DisplayName()
+ ctx.Data["OpenGraphType"] = "profile"
+ ctx.Data["OpenGraphImageURL"] = ctx.ContextUser.AvatarLink(ctx)
+ ctx.Data["OpenGraphURL"] = ctx.ContextUser.HTMLURL()
+ ctx.Data["OpenGraphDescription"] = ctx.ContextUser.Description
+
var orderBy db.SearchOrderBy
sortOrder := ctx.FormString("sort")
if _, ok := repo_model.OrderByFlatMap[sortOrder]; !ok {
diff --git a/routers/web/org/projects.go b/routers/web/org/projects.go
index 64d233fc45..32eb6eeef1 100644
--- a/routers/web/org/projects.go
+++ b/routers/web/org/projects.go
@@ -209,7 +209,7 @@ func ChangeProjectStatus(ctx *context.Context) {
ctx.NotFoundOrServerError("ChangeProjectStatusByRepoIDAndID", project_model.IsErrProjectNotExist, err)
return
}
- ctx.JSONRedirect(fmt.Sprintf("%s/-/projects/%d", ctx.ContextUser.HomeLink(), id))
+ ctx.JSONRedirect(project_model.ProjectLinkForOrg(ctx.ContextUser, id))
}
// DeleteProject delete a project
@@ -259,7 +259,7 @@ func RenderEditProject(ctx *context.Context) {
ctx.Data["redirect"] = ctx.FormString("redirect")
ctx.Data["HomeLink"] = ctx.ContextUser.HomeLink()
ctx.Data["card_type"] = p.CardType
- ctx.Data["CancelLink"] = fmt.Sprintf("%s/-/projects/%d", ctx.ContextUser.HomeLink(), p.ID)
+ ctx.Data["CancelLink"] = project_model.ProjectLinkForOrg(ctx.ContextUser, p.ID)
ctx.HTML(http.StatusOK, tplProjectsNew)
}
@@ -273,7 +273,7 @@ func EditProjectPost(ctx *context.Context) {
ctx.Data["PageIsViewProjects"] = true
ctx.Data["CanWriteProjects"] = canWriteProjects(ctx)
ctx.Data["CardTypes"] = project_model.GetCardConfig()
- ctx.Data["CancelLink"] = fmt.Sprintf("%s/-/projects/%d", ctx.ContextUser.HomeLink(), projectID)
+ ctx.Data["CancelLink"] = project_model.ProjectLinkForOrg(ctx.ContextUser, projectID)
shared_user.RenderUserHeader(ctx)
diff --git a/routers/web/org/setting.go b/routers/web/org/setting.go
index 8bd8ae6126..1683728a8e 100644
--- a/routers/web/org/setting.go
+++ b/routers/web/org/setting.go
@@ -7,6 +7,7 @@ package org
import (
"net/http"
"net/url"
+ "time"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/models/db"
@@ -48,6 +49,7 @@ func Settings(ctx *context.Context) {
ctx.Data["CurrentVisibility"] = ctx.Org.Organization.Visibility
ctx.Data["RepoAdminChangeTeamAccess"] = ctx.Org.Organization.RepoAdminChangeTeamAccess
ctx.Data["ContextUser"] = ctx.ContextUser
+ ctx.Data["CooldownPeriod"] = setting.Service.UsernameCooldownPeriod
err := shared_user.LoadHeaderCount(ctx)
if err != nil {
@@ -65,6 +67,7 @@ func SettingsPost(ctx *context.Context) {
ctx.Data["PageIsOrgSettings"] = true
ctx.Data["PageIsSettingsOptions"] = true
ctx.Data["CurrentVisibility"] = ctx.Org.Organization.Visibility
+ ctx.Data["CooldownPeriod"] = setting.Service.UsernameCooldownPeriod
if ctx.HasError() {
ctx.HTML(http.StatusOK, tplSettingsOptions)
@@ -78,6 +81,9 @@ func SettingsPost(ctx *context.Context) {
if user_model.IsErrUserAlreadyExist(err) {
ctx.Data["Err_Name"] = true
ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), tplSettingsOptions, &form)
+ } else if user_model.IsErrCooldownPeriod(err) {
+ ctx.Data["Err_UserName"] = true
+ ctx.RenderWithErr(ctx.Locale.Tr("form.username_claiming_cooldown", err.(user_model.ErrCooldownPeriod).ExpireTime.Format(time.RFC1123Z)), tplSettingsOptions, form)
} else if db.IsErrNameReserved(err) {
ctx.Data["Err_Name"] = true
ctx.RenderWithErr(ctx.Tr("repo.form.name_reserved", err.(db.ErrNameReserved).Name), tplSettingsOptions, &form)
diff --git a/routers/web/org/setting/blocked_users.go b/routers/web/org/setting/blocked_users.go
index 0c7f245c13..2cf3f39ef4 100644
--- a/routers/web/org/setting/blocked_users.go
+++ b/routers/web/org/setting/blocked_users.go
@@ -53,6 +53,12 @@ func BlockedUsersBlock(ctx *context.Context) {
return
}
+ if u.ID == ctx.Doer.ID {
+ ctx.Flash.Error(ctx.Tr("settings.user_block_yourself"))
+ ctx.Redirect(ctx.Org.OrgLink + "/settings/blocked_users")
+ return
+ }
+
if err := user_service.BlockUser(ctx, ctx.Org.Organization.ID, u.ID); err != nil {
ctx.ServerError("BlockUser", err)
return
diff --git a/routers/web/repo/card.go b/routers/web/repo/card.go
new file mode 100644
index 0000000000..e73971cd94
--- /dev/null
+++ b/routers/web/repo/card.go
@@ -0,0 +1,526 @@
+// Copyright 2024 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package repo
+
+import (
+ "bytes"
+ "encoding/hex"
+ "fmt"
+ "image"
+ "image/color"
+ "image/png"
+ "net/http"
+ "strconv"
+ "strings"
+ "time"
+
+ "code.gitea.io/gitea/models/db"
+ issue_model "code.gitea.io/gitea/models/issues"
+ repo_model "code.gitea.io/gitea/models/repo"
+ unit_model "code.gitea.io/gitea/models/unit"
+ user_model "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/cache"
+ "code.gitea.io/gitea/modules/card"
+ "code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/storage"
+ "code.gitea.io/gitea/services/context"
+)
+
+// drawUser draws a user avatar in a summary card
+func drawUser(ctx *context.Context, card *card.Card, user *user_model.User) error {
+ if user.UseCustomAvatar {
+ posterAvatarPath := user.CustomAvatarRelativePath()
+ if posterAvatarPath != "" {
+ userAvatarFile, err := storage.Avatars.Open(user.CustomAvatarRelativePath())
+ if err != nil {
+ return err
+ }
+ userAvatarImage, _, err := image.Decode(userAvatarFile)
+ if err != nil {
+ return err
+ }
+ card.DrawImage(userAvatarImage)
+ }
+ } else {
+ posterAvatarLink := user.AvatarLinkWithSize(ctx, 256)
+ card.DrawExternalImage(posterAvatarLink)
+ }
+ return nil
+}
+
+// drawRepoIcon draws the repo icon in a summary card
+func drawRepoIcon(ctx *context.Context, card *card.Card, repo *repo_model.Repository) error {
+ repoAvatarPath := repo.CustomAvatarRelativePath()
+
+ if repoAvatarPath != "" {
+ repoAvatarFile, err := storage.RepoAvatars.Open(repoAvatarPath)
+ if err != nil {
+ return err
+ }
+ repoAvatarImage, _, err := image.Decode(repoAvatarFile)
+ if err != nil {
+ return err
+ }
+ card.DrawImage(repoAvatarImage)
+ return nil
+ }
+
+ // If the repo didn't have an avatar, fallback to the repo owner's avatar for the right-hand-side icon
+ err := repo.LoadOwner(ctx)
+ if err != nil {
+ return err
+ }
+ if repo.Owner != nil {
+ err = drawUser(ctx, card, repo.Owner)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+// hexToColor converts a hex color to a go color
+func hexToColor(colorStr string) (*color.RGBA, error) {
+ colorStr = strings.TrimLeft(colorStr, "#")
+
+ b, err := hex.DecodeString(colorStr)
+ if err != nil {
+ return nil, err
+ }
+
+ if len(b) < 3 {
+ return nil, fmt.Errorf("expected at least 3 bytes from DecodeString, got %d", len(b))
+ }
+
+ color := color.RGBA{b[0], b[1], b[2], 255}
+
+ return &color, nil
+}
+
+func drawLanguagesCard(ctx *context.Context, card *card.Card) error {
+ languageList, err := repo_model.GetTopLanguageStats(ctx, ctx.Repo.Repository, 5)
+ if err != nil {
+ return err
+ }
+ if len(languageList) == 0 {
+ card.DrawRect(0, 0, card.Width, card.Height, color.White)
+ return nil
+ }
+
+ currentX := 0
+ var langColor *color.RGBA
+
+ for _, lang := range languageList {
+ langColor, err = hexToColor(lang.Color)
+ if err != nil {
+ return err
+ }
+
+ langWidth := float32(card.Width) * (lang.Percentage / 100)
+ card.DrawRect(currentX, 0, currentX+int(langWidth), card.Width, langColor)
+ currentX += int(langWidth)
+ }
+
+ if currentX < card.Width {
+ card.DrawRect(currentX, 0, card.Width, card.Height, langColor)
+ }
+
+ return nil
+}
+
+func drawRepoSummaryCard(ctx *context.Context, repo *repo_model.Repository) (*card.Card, error) {
+ width, height := card.DefaultSize()
+ mainCard, err := card.NewCard(width, height)
+ if err != nil {
+ return nil, err
+ }
+
+ contentCard, languageBarCard := mainCard.Split(false, 90)
+
+ contentCard.SetMargin(60)
+ topSection, bottomSection := contentCard.Split(false, 75)
+ issueSummary, issueIcon := topSection.Split(true, 80)
+ repoInfo, issueDescription := issueSummary.Split(false, 30)
+
+ repoInfo.SetMargin(10)
+ _, err = repoInfo.DrawText(repo.FullName(), color.Black, 56, card.Top, card.Left)
+ if err != nil {
+ return nil, err
+ }
+
+ issueDescription.SetMargin(10)
+ _, err = issueDescription.DrawText(repo.Description, color.Gray{128}, 36, card.Top, card.Left)
+ if err != nil {
+ return nil, err
+ }
+
+ issueIcon.SetMargin(10)
+ err = drawRepoIcon(ctx, issueIcon, repo)
+ if err != nil {
+ return nil, err
+ }
+
+ topCountCard, bottomCountCard := bottomSection.Split(false, 50)
+
+ releaseCount, err := db.Count[repo_model.Release](ctx, repo_model.FindReleasesOptions{
+ // only show draft releases for users who can write, read-only users shouldn't see draft releases.
+ IncludeDrafts: ctx.Repo.CanWrite(unit_model.TypeReleases),
+ RepoID: ctx.Repo.Repository.ID,
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ starsText := ctx.Locale.TrN(
+ repo.NumStars,
+ "explore.stars_one",
+ "explore.stars_few",
+ repo.NumStars,
+ )
+ forksText := ctx.Locale.TrN(
+ repo.NumForks,
+ "explore.forks_one",
+ "explore.forks_few",
+ repo.NumForks,
+ )
+ releasesText := ctx.Locale.TrN(
+ releaseCount,
+ "repo.activity.title.releases_1",
+ "repo.activity.title.releases_n",
+ releaseCount,
+ )
+
+ topCountText := fmt.Sprintf("%s • %s • %s", starsText, forksText, releasesText)
+
+ topCountCard.SetMargin(10)
+ _, err = topCountCard.DrawText(topCountText, color.Gray{128}, 36, card.Top, card.Left)
+ if err != nil {
+ return nil, err
+ }
+
+ issuesText := ctx.Locale.TrN(
+ repo.NumOpenIssues,
+ "repo.activity.title.issues_1",
+ "repo.activity.title.issues_n",
+ repo.NumOpenIssues,
+ )
+ pullRequestsText := ctx.Locale.TrN(
+ repo.NumOpenPulls,
+ "repo.activity.title.prs_1",
+ "repo.activity.title.prs_n",
+ repo.NumOpenPulls,
+ )
+
+ bottomCountText := fmt.Sprintf("%s • %s", issuesText, pullRequestsText)
+
+ bottomCountCard.SetMargin(10)
+ _, err = bottomCountCard.DrawText(bottomCountText, color.Gray{128}, 36, card.Top, card.Left)
+ if err != nil {
+ return nil, err
+ }
+
+ err = drawLanguagesCard(ctx, languageBarCard)
+ if err != nil {
+ return nil, err
+ }
+
+ return mainCard, nil
+}
+
+func drawIssueSummaryCard(ctx *context.Context, issue *issue_model.Issue) (*card.Card, error) {
+ width, height := card.DefaultSize()
+ mainCard, err := card.NewCard(width, height)
+ if err != nil {
+ return nil, err
+ }
+
+ mainCard.SetMargin(60)
+ topSection, bottomSection := mainCard.Split(false, 75)
+ issueSummary, issueIcon := topSection.Split(true, 80)
+ repoInfo, issueDescription := issueSummary.Split(false, 15)
+
+ repoInfo.SetMargin(10)
+ _, err = repoInfo.DrawText(fmt.Sprintf("%s - #%d", issue.Repo.FullName(), issue.Index), color.Gray{128}, 36, card.Top, card.Left)
+ if err != nil {
+ return nil, err
+ }
+
+ issueDescription.SetMargin(10)
+ _, err = issueDescription.DrawText(issue.Title, color.Black, 56, card.Top, card.Left)
+ if err != nil {
+ return nil, err
+ }
+
+ issueIcon.SetMargin(10)
+ err = drawRepoIcon(ctx, issueIcon, issue.Repo)
+ if err != nil {
+ return nil, err
+ }
+
+ issueStats, issueAttribution := bottomSection.Split(false, 50)
+
+ var state string
+ if issue.IsPull && issue.PullRequest.HasMerged {
+ if issue.PullRequest.Status == 3 {
+ state = ctx.Locale.TrString("repo.pulls.manually_merged")
+ } else {
+ state = ctx.Locale.TrString("repo.pulls.merged")
+ }
+ } else if issue.IsClosed {
+ state = ctx.Locale.TrString("repo.issues.closed_title")
+ } else if issue.IsPull {
+ if issue.PullRequest.IsWorkInProgress(ctx) {
+ state = ctx.Locale.TrString("repo.issues.draft_title")
+ } else {
+ state = ctx.Locale.TrString("repo.issues.open_title")
+ }
+ } else {
+ state = ctx.Locale.TrString("repo.issues.open_title")
+ }
+ state = strings.ToLower(state)
+
+ issueStats.SetMargin(10)
+ if issue.IsPull {
+ reviews := map[int64]bool{}
+ for _, comment := range issue.Comments {
+ if comment.Review != nil {
+ reviews[comment.Review.ID] = true
+ }
+ }
+ _, err = issueStats.DrawText(
+ fmt.Sprintf("%s, %s, %s",
+ ctx.Locale.TrN(
+ issue.NumComments,
+ "repo.issues.num_comments_1",
+ "repo.issues.num_comments",
+ issue.NumComments,
+ ),
+ ctx.Locale.TrN(
+ len(reviews),
+ "repo.issues.num_reviews_one",
+ "repo.issues.num_reviews_few",
+ len(reviews),
+ ),
+ state,
+ ),
+ color.Gray{128}, 36, card.Top, card.Left)
+ } else {
+ _, err = issueStats.DrawText(
+ fmt.Sprintf("%s, %s",
+ ctx.Locale.TrN(
+ issue.NumComments,
+ "repo.issues.num_comments_1",
+ "repo.issues.num_comments",
+ issue.NumComments,
+ ),
+ state,
+ ),
+ color.Gray{128}, 36, card.Top, card.Left)
+ }
+ if err != nil {
+ return nil, err
+ }
+
+ issueAttributionIcon, issueAttributionText := issueAttribution.Split(true, 8)
+ issueAttributionText.SetMargin(5)
+ _, err = issueAttributionText.DrawText(
+ fmt.Sprintf(
+ "%s - %s",
+ issue.Poster.Name,
+ issue.Created.AsTime().Format(time.DateOnly),
+ ),
+ color.Gray{128}, 36, card.Middle, card.Left)
+ if err != nil {
+ return nil, err
+ }
+ err = drawUser(ctx, issueAttributionIcon, issue.Poster)
+ if err != nil {
+ return nil, err
+ }
+
+ return mainCard, nil
+}
+
+func drawReleaseSummaryCard(ctx *context.Context, release *repo_model.Release) (*card.Card, error) {
+ width, height := card.DefaultSize()
+ mainCard, err := card.NewCard(width, height)
+ if err != nil {
+ return nil, err
+ }
+
+ mainCard.SetMargin(60)
+ topSection, bottomSection := mainCard.Split(false, 75)
+ releaseSummary, repoIcon := topSection.Split(true, 80)
+ repoInfo, releaseDescription := releaseSummary.Split(false, 15)
+
+ repoInfo.SetMargin(10)
+ _, err = repoInfo.DrawText(release.Repo.FullName(), color.Gray{128}, 36, card.Top, card.Left)
+ if err != nil {
+ return nil, err
+ }
+
+ releaseDescription.SetMargin(10)
+ _, err = releaseDescription.DrawText(release.DisplayName(), color.Black, 56, card.Top, card.Left)
+ if err != nil {
+ return nil, err
+ }
+
+ repoIcon.SetMargin(10)
+ err = drawRepoIcon(ctx, repoIcon, release.Repo)
+ if err != nil {
+ return nil, err
+ }
+
+ downloadCountCard, releaseDateCard := bottomSection.Split(true, 75)
+
+ downloadCount, err := release.GetTotalDownloadCount(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ downloadCountText := ctx.Locale.TrN(
+ strconv.FormatInt(downloadCount, 10),
+ "repo.release.download_count_one",
+ "repo.release.download_count_few",
+ strconv.FormatInt(downloadCount, 10),
+ )
+
+ _, err = downloadCountCard.DrawText(string(downloadCountText), color.Gray{128}, 36, card.Bottom, card.Left)
+ if err != nil {
+ return nil, err
+ }
+
+ _, err = releaseDateCard.DrawText(release.CreatedUnix.AsTime().Format(time.DateOnly), color.Gray{128}, 36, card.Bottom, card.Left)
+ if err != nil {
+ return nil, err
+ }
+
+ return mainCard, nil
+}
+
+// checkCardCache checks if a card in cache and serves it
+func checkCardCache(ctx *context.Context, cacheKey string) bool {
+ cache := cache.GetCache()
+ pngData, ok := cache.Get(cacheKey).([]byte)
+ if ok && pngData != nil && len(pngData) > 0 {
+ ctx.Resp.Header().Set("Content-Type", "image/png")
+ ctx.Resp.WriteHeader(http.StatusOK)
+ _, err := ctx.Resp.Write(pngData)
+ if err != nil {
+ ctx.ServerError("GetSummaryCard", err)
+ }
+ return true
+ }
+
+ return false
+}
+
+// serveCard server a Card to the user adds it to the cache
+func serveCard(ctx *context.Context, card *card.Card, cacheKey string) {
+ cache := cache.GetCache()
+
+ // Encode image, store in cache
+ var imageBuffer bytes.Buffer
+ err := png.Encode(&imageBuffer, card.Img)
+ if err != nil {
+ ctx.ServerError("GetSummaryCard", err)
+ return
+ }
+ imageBytes := imageBuffer.Bytes()
+ err = cache.Put(cacheKey, imageBytes, setting.CacheService.TTLSeconds())
+ if err != nil {
+ // don't abort serving the image if we just had a cache storage failure
+ log.Warn("failed to cache issue summary card: %v", err)
+ }
+
+ // Finish the uncached image response
+ ctx.Resp.Header().Set("Content-Type", "image/png")
+ ctx.Resp.WriteHeader(http.StatusOK)
+ _, err = ctx.Resp.Write(imageBytes)
+ if err != nil {
+ ctx.ServerError("GetSummaryCard", err)
+ return
+ }
+}
+
+func DrawRepoSummaryCard(ctx *context.Context) {
+ cacheKey := fmt.Sprintf("summary_card:repo:%s:%d", ctx.Locale.Language(), ctx.Repo.Repository.ID)
+
+ if checkCardCache(ctx, cacheKey) {
+ return
+ }
+
+ card, err := drawRepoSummaryCard(ctx, ctx.Repo.Repository)
+ if err != nil {
+ ctx.ServerError("drawRepoSummaryCar", err)
+ return
+ }
+
+ serveCard(ctx, card, cacheKey)
+}
+
+func DrawIssueSummaryCard(ctx *context.Context) {
+ issue, err := issue_model.GetIssueWithAttrsByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
+ if err != nil {
+ if issue_model.IsErrIssueNotExist(err) {
+ ctx.Error(http.StatusNotFound)
+ } else {
+ ctx.Error(http.StatusInternalServerError, "GetIssueByIndex", err.Error())
+ }
+ return
+ }
+
+ if !ctx.Repo.CanReadIssuesOrPulls(issue.IsPull) {
+ ctx.Error(http.StatusNotFound)
+ return
+ }
+
+ cacheKey := fmt.Sprintf("summary_card:issue:%s:%d", ctx.Locale.Language(), issue.ID)
+
+ if checkCardCache(ctx, cacheKey) {
+ return
+ }
+
+ card, err := drawIssueSummaryCard(ctx, issue)
+ if err != nil {
+ ctx.ServerError("drawIssueSummaryCar", err)
+ return
+ }
+
+ serveCard(ctx, card, cacheKey)
+}
+
+func DrawReleaseSummaryCard(ctx *context.Context) {
+ release, err := repo_model.GetRelease(ctx, ctx.Repo.Repository.ID, ctx.Params("*"))
+ if err != nil {
+ if repo_model.IsErrReleaseNotExist(err) {
+ ctx.NotFound("", nil)
+ } else {
+ ctx.ServerError("GetReleaseForRepoByID", err)
+ }
+ return
+ }
+
+ err = release.LoadRepo(ctx)
+ if err != nil {
+ ctx.ServerError("LoadRepo", err)
+ return
+ }
+
+ cacheKey := fmt.Sprintf("summary_card:release:%s:%d", ctx.Locale.Language(), release.ID)
+
+ if checkCardCache(ctx, cacheKey) {
+ return
+ }
+
+ card, err := drawReleaseSummaryCard(ctx, release)
+ if err != nil {
+ ctx.ServerError("drawRepoSummaryCar", err)
+ return
+ }
+
+ serveCard(ctx, card, cacheKey)
+}
diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go
index a06da71429..2feb898224 100644
--- a/routers/web/repo/commit.go
+++ b/routers/web/repo/commit.go
@@ -419,6 +419,10 @@ func Diff(ctx *context.Context) {
}
}
+ ctx.Data["OpenGraphTitle"] = commit.Summary() + " · " + base.ShortSha(commitID)
+ ctx.Data["OpenGraphURL"] = fmt.Sprintf("%s/commit/%s", ctx.Repo.Repository.HTMLURL(), commitID)
+ _, ctx.Data["OpenGraphDescription"], _ = strings.Cut(commit.Message(), "\n")
+
ctx.HTML(http.StatusOK, tplCommitPage)
}
diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go
index e5eab2bffa..24785d867e 100644
--- a/routers/web/repo/compare.go
+++ b/routers/web/repo/compare.go
@@ -51,6 +51,7 @@ const (
func setCompareContext(ctx *context.Context, before, head *git.Commit, headOwner, headName string) {
ctx.Data["BeforeCommit"] = before
ctx.Data["HeadCommit"] = head
+ ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login?redirect_to=" + url.QueryEscape(ctx.Data["Link"].(string))
ctx.Data["GetBlobByPathForCommit"] = func(commit *git.Commit, path string) *git.Blob {
if commit == nil {
@@ -230,6 +231,13 @@ func ParseCompareInfo(ctx *context.Context) *common.CompareInfo {
if infoPath == "" {
infos = []string{baseRepo.DefaultBranch, baseRepo.DefaultBranch}
} else {
+ infoPath, isDiff := strings.CutSuffix(infoPath, ".diff")
+ ctx.Data["ComparingDiff"] = isDiff
+ if !isDiff {
+ var isPatch bool
+ infoPath, isPatch = strings.CutSuffix(infoPath, ".patch")
+ ctx.Data["ComparingPatch"] = isPatch
+ }
infos = strings.SplitN(infoPath, "...", 2)
if len(infos) != 2 {
if infos = strings.SplitN(infoPath, "..", 2); len(infos) == 2 {
@@ -716,6 +724,22 @@ func CompareDiff(ctx *context.Context) {
return
}
+ if ctx.Data["ComparingDiff"] != nil && ctx.Data["ComparingDiff"].(bool) {
+ err := git.GetRepoRawDiffForFile(ci.HeadGitRepo, ci.BaseBranch, ci.HeadBranch, git.RawDiffNormal, "", ctx.Resp)
+ if err != nil {
+ ctx.ServerError("ComparingDiff", err)
+ return
+ }
+ }
+
+ if ctx.Data["ComparingPatch"] != nil && ctx.Data["ComparingPatch"].(bool) {
+ err := git.GetRepoRawDiffForFile(ci.HeadGitRepo, ci.BaseBranch, ci.HeadBranch, git.RawDiffPatch, "", ctx.Resp)
+ if err != nil {
+ ctx.ServerError("ComparingPatch", err)
+ return
+ }
+ }
+
ctx.Data["PullRequestWorkInProgressPrefixes"] = setting.Repository.PullRequest.WorkInProgressPrefixes
ctx.Data["DirectComparison"] = ci.DirectComparison
ctx.Data["OtherCompareSeparator"] = ".."
@@ -801,7 +825,8 @@ func CompareDiff(ctx *context.Context) {
if ci.DirectComparison {
separator = ".."
}
- ctx.Data["Title"] = "Comparing " + base.ShortSha(beforeCommitID) + separator + base.ShortSha(afterCommitID)
+ ctx.Data["Comparing"] = base.ShortSha(beforeCommitID) + separator + base.ShortSha(afterCommitID)
+ ctx.Data["Title"] = "Comparing " + ctx.Data["Comparing"].(string)
ctx.Data["IsDiffCompare"] = true
_, templateErrs := setTemplateIfExists(ctx, pullRequestTemplateKey, pullRequestTemplateCandidates)
diff --git a/routers/web/repo/download.go b/routers/web/repo/download.go
index 1e87bbf015..d7fe368474 100644
--- a/routers/web/repo/download.go
+++ b/routers/web/repo/download.go
@@ -5,7 +5,6 @@
package repo
import (
- "path"
"time"
git_model "code.gitea.io/gitea/models/git"
@@ -82,7 +81,7 @@ func ServeBlobOrLFS(ctx *context.Context, blob *git.Blob, lastModified *time.Tim
return common.ServeBlob(ctx.Base, ctx.Repo.TreePath, blob, lastModified)
}
-func getBlobForEntry(ctx *context.Context) (blob *git.Blob, lastModified *time.Time) {
+func getBlobForEntry(ctx *context.Context) (*git.Blob, *time.Time) {
entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath)
if err != nil {
if git.IsErrNotExist(err) {
@@ -98,19 +97,14 @@ func getBlobForEntry(ctx *context.Context) (blob *git.Blob, lastModified *time.T
return nil, nil
}
- info, _, err := git.Entries([]*git.TreeEntry{entry}).GetCommitsInfo(ctx, ctx.Repo.Commit, path.Dir("/" + ctx.Repo.TreePath)[1:])
+ latestCommit, err := ctx.Repo.GitRepo.GetTreePathLatestCommit(ctx.Repo.Commit.ID.String(), ctx.Repo.TreePath)
if err != nil {
- ctx.ServerError("GetCommitsInfo", err)
+ ctx.ServerError("GetTreePathLatestCommit", err)
return nil, nil
}
+ lastModified := &latestCommit.Committer.When
- if len(info) == 1 {
- // Not Modified
- lastModified = &info[0].Commit.Committer.When
- }
- blob = entry.Blob()
-
- return blob, lastModified
+ return entry.Blob(), lastModified
}
// SingleDownload download a file by repos path
diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go
index c154a9b665..61711095b9 100644
--- a/routers/web/repo/issue.go
+++ b/routers/web/repo/issue.go
@@ -10,9 +10,6 @@ import (
"errors"
"fmt"
"html/template"
- "image"
- "image/color"
- "image/png"
"math/big"
"net/http"
"net/url"
@@ -34,8 +31,6 @@ import (
"code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/base"
- "code.gitea.io/gitea/modules/cache"
- "code.gitea.io/gitea/modules/card"
"code.gitea.io/gitea/modules/container"
"code.gitea.io/gitea/modules/emoji"
"code.gitea.io/gitea/modules/git"
@@ -47,7 +42,6 @@ import (
"code.gitea.io/gitea/modules/optional"
repo_module "code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/setting"
- "code.gitea.io/gitea/modules/storage"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/templates"
"code.gitea.io/gitea/modules/templates/vars"
@@ -1297,10 +1291,17 @@ func NewIssuePost(ctx *context.Context) {
log.Trace("Issue created: %d/%d", repo.ID, issue.ID)
if ctx.FormString("redirect_after_creation") == "project" && projectID > 0 {
- ctx.JSONRedirect(ctx.Repo.RepoLink + "/projects/" + strconv.FormatInt(projectID, 10))
- } else {
- ctx.JSONRedirect(issue.Link())
+ project, err := project_model.GetProjectByID(ctx, projectID)
+ if err == nil {
+ if project.Type == project_model.TypeOrganization {
+ ctx.JSONRedirect(project_model.ProjectLinkForOrg(ctx.Repo.Owner, project.ID))
+ } else {
+ ctx.JSONRedirect(project_model.ProjectLinkForRepo(repo, project.ID))
+ }
+ return
+ }
}
+ ctx.JSONRedirect(issue.Link())
}
// roleDescriptor returns the role descriptor for a comment in/with the given repo, poster and issue
@@ -2076,6 +2077,11 @@ func ViewIssue(ctx *context.Context) {
ctx.Data["RefEndName"] = git.RefName(issue.Ref).ShortName()
ctx.Data["NewPinAllowed"] = pinAllowed
ctx.Data["PinEnabled"] = setting.Repository.Issue.MaxPinned != 0
+ ctx.Data["OpenGraphTitle"] = issue.Title
+ ctx.Data["OpenGraphURL"] = issue.HTMLURL()
+ ctx.Data["OpenGraphDescription"] = issue.Content
+ ctx.Data["OpenGraphImageURL"] = issue.SummaryCardURL()
+ ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.issues.summary_card_alt", issue.Title, issue.Repo.FullName())
prepareHiddenCommentType(ctx)
if ctx.Written() {
@@ -2233,222 +2239,6 @@ func GetIssueInfo(ctx *context.Context) {
ctx.JSON(http.StatusOK, convert.ToIssue(ctx, ctx.Doer, issue))
}
-// GetSummaryCard get an issue of a repository
-func GetSummaryCard(ctx *context.Context) {
- issue, err := issues_model.GetIssueWithAttrsByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
- if err != nil {
- if issues_model.IsErrIssueNotExist(err) {
- ctx.Error(http.StatusNotFound)
- } else {
- ctx.Error(http.StatusInternalServerError, "GetIssueByIndex", err.Error())
- }
- return
- }
-
- if !ctx.Repo.CanReadIssuesOrPulls(issue.IsPull) {
- ctx.Error(http.StatusNotFound)
- return
- }
-
- cache := cache.GetCache()
- cacheKey := fmt.Sprintf("summary_card:issue:%s:%d", ctx.Locale.Language(), issue.ID)
- pngData, ok := cache.Get(cacheKey).([]byte)
- if ok && pngData != nil && len(pngData) > 0 {
- ctx.Resp.Header().Set("Content-Type", "image/png")
- ctx.Resp.WriteHeader(http.StatusOK)
- _, err = ctx.Resp.Write(pngData)
- if err != nil {
- ctx.ServerError("GetSummaryCard", err)
- }
- return
- }
-
- card, err := drawSummaryCard(ctx, issue)
- if err != nil {
- ctx.ServerError("GetSummaryCard", err)
- return
- }
-
- // Encode image, store in cache
- var imageBuffer bytes.Buffer
- err = png.Encode(&imageBuffer, card.Img)
- if err != nil {
- ctx.ServerError("GetSummaryCard", err)
- return
- }
- imageBytes := imageBuffer.Bytes()
- err = cache.Put(cacheKey, imageBytes, setting.CacheService.TTLSeconds())
- if err != nil {
- // don't abort serving the image if we just had a cache storage failure
- log.Warn("failed to cache issue summary card: %v", err)
- }
-
- // Finish the uncached image response
- ctx.Resp.Header().Set("Content-Type", "image/png")
- ctx.Resp.WriteHeader(http.StatusOK)
- _, err = ctx.Resp.Write(imageBytes)
- if err != nil {
- ctx.ServerError("GetSummaryCard", err)
- return
- }
-}
-
-func drawSummaryCard(ctx *context.Context, issue *issues_model.Issue) (*card.Card, error) {
- width, height := issue.SummaryCardSize()
- mainCard, err := card.NewCard(width, height)
- if err != nil {
- return nil, err
- }
-
- mainCard.SetMargin(60)
- topSection, bottomSection := mainCard.Split(false, 75)
- issueSummary, issueIcon := topSection.Split(true, 80)
- repoInfo, issueDescription := issueSummary.Split(false, 15)
-
- repoInfo.SetMargin(10)
- _, err = repoInfo.DrawText(fmt.Sprintf("%s - #%d", issue.Repo.FullName(), issue.Index), color.Gray{128}, 36, card.Top, card.Left)
- if err != nil {
- return nil, err
- }
-
- issueDescription.SetMargin(10)
- _, err = issueDescription.DrawText(issue.Title, color.Black, 56, card.Top, card.Left)
- if err != nil {
- return nil, err
- }
-
- issueIcon.SetMargin(10)
-
- repoAvatarPath := issue.Repo.CustomAvatarRelativePath()
- if repoAvatarPath != "" {
- repoAvatarFile, err := storage.RepoAvatars.Open(repoAvatarPath)
- if err != nil {
- return nil, err
- }
- repoAvatarImage, _, err := image.Decode(repoAvatarFile)
- if err != nil {
- return nil, err
- }
- issueIcon.DrawImage(repoAvatarImage)
- } else {
- // If the repo didn't have an avatar, fallback to the repo owner's avatar for the right-hand-side icon
- err = issue.Repo.LoadOwner(ctx)
- if err != nil {
- return nil, err
- }
- if issue.Repo.Owner != nil {
- err = drawUser(ctx, issueIcon, issue.Repo.Owner)
- if err != nil {
- return nil, err
- }
- }
- }
-
- issueStats, issueAttribution := bottomSection.Split(false, 50)
-
- var state string
- if issue.IsPull && issue.PullRequest.HasMerged {
- if issue.PullRequest.Status == 3 {
- state = ctx.Locale.TrString("repo.pulls.manually_merged")
- } else {
- state = ctx.Locale.TrString("repo.pulls.merged")
- }
- } else if issue.IsClosed {
- state = ctx.Locale.TrString("repo.issues.closed_title")
- } else if issue.IsPull {
- if issue.PullRequest.IsWorkInProgress(ctx) {
- state = ctx.Locale.TrString("repo.issues.draft_title")
- } else {
- state = ctx.Locale.TrString("repo.issues.open_title")
- }
- } else {
- state = ctx.Locale.TrString("repo.issues.open_title")
- }
- state = strings.ToLower(state)
-
- issueStats.SetMargin(10)
- if issue.IsPull {
- reviews := map[int64]bool{}
- for _, comment := range issue.Comments {
- if comment.Review != nil {
- reviews[comment.Review.ID] = true
- }
- }
- _, err = issueStats.DrawText(
- fmt.Sprintf("%s, %s, %s",
- ctx.Locale.TrN(
- issue.NumComments,
- "repo.issues.num_comments_1",
- "repo.issues.num_comments",
- issue.NumComments,
- ),
- ctx.Locale.TrN(
- len(reviews),
- "repo.issues.num_reviews_one",
- "repo.issues.num_reviews_few",
- len(reviews),
- ),
- state,
- ),
- color.Gray{128}, 36, card.Top, card.Left)
- } else {
- _, err = issueStats.DrawText(
- fmt.Sprintf("%s, %s",
- ctx.Locale.TrN(
- issue.NumComments,
- "repo.issues.num_comments_1",
- "repo.issues.num_comments",
- issue.NumComments,
- ),
- state,
- ),
- color.Gray{128}, 36, card.Top, card.Left)
- }
- if err != nil {
- return nil, err
- }
-
- issueAttributionIcon, issueAttributionText := issueAttribution.Split(true, 8)
- issueAttributionText.SetMargin(5)
- _, err = issueAttributionText.DrawText(
- fmt.Sprintf(
- "%s - %s",
- issue.Poster.Name,
- issue.Created.AsTime().Format("2006-01-02"),
- ),
- color.Gray{128}, 36, card.Middle, card.Left)
- if err != nil {
- return nil, err
- }
- err = drawUser(ctx, issueAttributionIcon, issue.Poster)
- if err != nil {
- return nil, err
- }
-
- return mainCard, nil
-}
-
-func drawUser(ctx *context.Context, card *card.Card, user *user_model.User) error {
- if user.UseCustomAvatar {
- posterAvatarPath := user.CustomAvatarRelativePath()
- if posterAvatarPath != "" {
- userAvatarFile, err := storage.Avatars.Open(user.CustomAvatarRelativePath())
- if err != nil {
- return err
- }
- userAvatarImage, _, err := image.Decode(userAvatarFile)
- if err != nil {
- return err
- }
- card.DrawImage(userAvatarImage)
- }
- } else {
- posterAvatarLink := user.AvatarLinkWithSize(ctx, 256)
- card.DrawExternalImage(posterAvatarLink)
- }
- return nil
-}
-
// UpdateIssueTitle change issue's title
func UpdateIssueTitle(ctx *context.Context) {
issue := GetActionIssue(ctx)
diff --git a/routers/web/repo/projects.go b/routers/web/repo/projects.go
index f4b027dae1..55a422453f 100644
--- a/routers/web/repo/projects.go
+++ b/routers/web/repo/projects.go
@@ -183,7 +183,7 @@ func ChangeProjectStatus(ctx *context.Context) {
ctx.NotFoundOrServerError("ChangeProjectStatusByRepoIDAndID", project_model.IsErrProjectNotExist, err)
return
}
- ctx.JSONRedirect(fmt.Sprintf("%s/projects/%d", ctx.Repo.RepoLink, id))
+ ctx.JSONRedirect(project_model.ProjectLinkForRepo(ctx.Repo.Repository, id))
}
// DeleteProject delete a project
@@ -237,7 +237,7 @@ func RenderEditProject(ctx *context.Context) {
ctx.Data["content"] = p.Description
ctx.Data["card_type"] = p.CardType
ctx.Data["redirect"] = ctx.FormString("redirect")
- ctx.Data["CancelLink"] = fmt.Sprintf("%s/projects/%d", ctx.Repo.Repository.Link(), p.ID)
+ ctx.Data["CancelLink"] = project_model.ProjectLinkForRepo(ctx.Repo.Repository, p.ID)
ctx.HTML(http.StatusOK, tplProjectsNew)
}
@@ -251,7 +251,7 @@ func EditProjectPost(ctx *context.Context) {
ctx.Data["PageIsEditProjects"] = true
ctx.Data["CanWriteProjects"] = ctx.Repo.Permission.CanWrite(unit.TypeProjects)
ctx.Data["CardTypes"] = project_model.GetCardConfig()
- ctx.Data["CancelLink"] = fmt.Sprintf("%s/projects/%d", ctx.Repo.Repository.Link(), projectID)
+ ctx.Data["CancelLink"] = project_model.ProjectLinkForRepo(ctx.Repo.Repository, projectID)
if ctx.HasError() {
ctx.HTML(http.StatusOK, tplProjectsNew)
diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go
index 65d526d2f2..1791788743 100644
--- a/routers/web/repo/release.go
+++ b/routers/web/repo/release.go
@@ -365,11 +365,7 @@ func SingleRelease(ctx *context.Context) {
addVerifyTagToContext(ctx)
ctx.Data["PageIsSingleTag"] = release.IsTag
- if release.IsTag {
- ctx.Data["Title"] = release.TagName
- } else {
- ctx.Data["Title"] = release.Title
- }
+ ctx.Data["Title"] = release.DisplayName()
err = release.LoadArchiveDownloadCount(ctx)
if err != nil {
@@ -378,6 +374,13 @@ func SingleRelease(ctx *context.Context) {
}
ctx.Data["Releases"] = releases
+
+ ctx.Data["OpenGraphTitle"] = fmt.Sprintf("%s - %s", release.DisplayName(), release.Repo.FullName())
+ ctx.Data["OpenGraphDescription"] = base.EllipsisString(release.Note, 300)
+ ctx.Data["OpenGraphURL"] = release.HTMLURL()
+ ctx.Data["OpenGraphImageURL"] = release.SummaryCardURL()
+ ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.release.summary_card_alt", release.DisplayName(), release.Repo.FullName())
+
ctx.HTML(http.StatusOK, tplReleasesList)
}
diff --git a/routers/web/repo/search.go b/routers/web/repo/search.go
index f2264360ec..442034b287 100644
--- a/routers/web/repo/search.go
+++ b/routers/web/repo/search.go
@@ -67,6 +67,12 @@ func Search(ctx *context.Context) {
ctx.Data["CodeSearchPath"] = path
ctx.Data["CodeSearchMode"] = mode.String()
ctx.Data["PageIsViewCode"] = true
+ ctx.Data["CodeIndexerDisabled"] = !setting.Indexer.RepoIndexerEnabled
+ if setting.Indexer.RepoIndexerEnabled {
+ ctx.Data["CodeSearchOptions"] = code_indexer.CodeSearchOptions
+ } else {
+ ctx.Data["CodeSearchOptions"] = git.GrepSearchOptions
+ }
if keyword == "" {
ctx.HTML(http.StatusOK, tplSearch)
@@ -103,7 +109,6 @@ func Search(ctx *context.Context) {
} else {
ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx)
}
- ctx.Data["CodeSearchOptions"] = code_indexer.CodeSearchOptions
} else {
grepOpt := git.GrepOptions{
ContextLineNumber: 1,
@@ -139,10 +144,8 @@ func Search(ctx *context.Context) {
strings.Join(r.LineCodes, "\n")),
})
}
- ctx.Data["CodeSearchOptions"] = git.GrepSearchOptions
}
- ctx.Data["CodeIndexerDisabled"] = !setting.Indexer.RepoIndexerEnabled
ctx.Data["Repo"] = ctx.Repo.Repository
ctx.Data["SourcePath"] = ctx.Repo.Repository.Link()
ctx.Data["SearchResults"] = searchResults
diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go
index fd8c1da058..9030b03a90 100644
--- a/routers/web/repo/view.go
+++ b/routers/web/repo/view.go
@@ -394,6 +394,10 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
ctx.Data["FileName"] = blob.Name()
ctx.Data["RawFileLink"] = ctx.Repo.RepoLink + "/raw/" + ctx.Repo.BranchNameSubURL() + "/" + util.PathEscapeSegments(ctx.Repo.TreePath)
+ ctx.Data["OpenGraphTitle"] = ctx.Data["Title"]
+ ctx.Data["OpenGraphURL"] = fmt.Sprintf("%s%s", setting.AppURL, ctx.Data["Link"])
+ ctx.Data["OpenGraphNoDescription"] = true
+
if entry.IsLink() {
_, link, err := entry.FollowLinks()
// Errors should be allowed, because this shouldn't
diff --git a/routers/web/repo/wiki.go b/routers/web/repo/wiki.go
index 3d55afe294..070d07cdf3 100644
--- a/routers/web/repo/wiki.go
+++ b/routers/web/repo/wiki.go
@@ -535,6 +535,9 @@ func Wiki(ctx *context.Context) {
}
ctx.Data["Author"] = lastCommit.Author
+ ctx.Data["OpenGraphTitle"] = ctx.Data["Title"]
+ ctx.Data["OpenGraphURL"] = fmt.Sprintf("%s%s", setting.AppURL, ctx.Data["Link"])
+
ctx.HTML(http.StatusOK, tplWikiView)
}
diff --git a/routers/web/repo/wiki_test.go b/routers/web/repo/wiki_test.go
index 47bad6d8e0..0c49e7d902 100644
--- a/routers/web/repo/wiki_test.go
+++ b/routers/web/repo/wiki_test.go
@@ -86,7 +86,7 @@ func TestWiki(t *testing.T) {
Wiki(ctx)
assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
assert.EqualValues(t, "Home", ctx.Data["Title"])
- assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"])
+ assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File", "XSS"}, ctx.Data["Pages"])
}
func TestWikiPages(t *testing.T) {
@@ -96,7 +96,7 @@ func TestWikiPages(t *testing.T) {
contexttest.LoadRepo(t, ctx, 1)
WikiPages(ctx)
assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
- assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"])
+ assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File", "XSS"}, ctx.Data["Pages"])
}
func TestNewWiki(t *testing.T) {
diff --git a/routers/web/shared/actions/runners.go b/routers/web/shared/actions/runners.go
index f38933226b..7ed3f88f6c 100644
--- a/routers/web/shared/actions/runners.go
+++ b/routers/web/shared/actions/runners.go
@@ -79,7 +79,7 @@ func RunnerDetails(ctx *context.Context, page int, runnerID, ownerID, repoID int
Page: page,
PageSize: 30,
},
- Status: actions_model.StatusUnknown, // Unknown means all
+ Status: []actions_model.Status{actions_model.StatusUnknown}, // Unknown means all
RunnerID: runner.ID,
}
diff --git a/routers/web/user/package.go b/routers/web/user/package.go
index cb4735da7e..707c86db7a 100644
--- a/routers/web/user/package.go
+++ b/routers/web/user/package.go
@@ -235,7 +235,7 @@ func ViewPackageVersion(ctx *context.Context) {
ctx.Data["Distributions"] = util.Sorted(distributions.Values())
ctx.Data["Components"] = util.Sorted(components.Values())
ctx.Data["Architectures"] = util.Sorted(architectures.Values())
- case packages_model.TypeRpm:
+ case packages_model.TypeRpm, packages_model.TypeAlt:
groups := make(container.Set[string])
architectures := make(container.Set[string])
diff --git a/routers/web/user/profile.go b/routers/web/user/profile.go
index 9cb392d878..de1c6850aa 100644
--- a/routers/web/user/profile.go
+++ b/routers/web/user/profile.go
@@ -63,6 +63,12 @@ func userProfile(ctx *context.Context) {
ctx.Data["Title"] = ctx.ContextUser.DisplayName()
ctx.Data["PageIsUserProfile"] = true
+ ctx.Data["OpenGraphTitle"] = ctx.ContextUser.DisplayName()
+ ctx.Data["OpenGraphType"] = "profile"
+ ctx.Data["OpenGraphImageURL"] = ctx.ContextUser.AvatarLink(ctx)
+ ctx.Data["OpenGraphURL"] = ctx.ContextUser.HTMLURL()
+ ctx.Data["OpenGraphDescription"] = ctx.ContextUser.Description
+
// prepare heatmap data
if setting.Service.EnableUserHeatmap {
data, err := activities_model.GetUserHeatmapDataByUser(ctx, ctx.ContextUser, ctx.Doer)
diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go
index 907f0f5061..818da9e3fa 100644
--- a/routers/web/user/setting/profile.go
+++ b/routers/web/user/setting/profile.go
@@ -14,6 +14,7 @@ import (
"path/filepath"
"slices"
"strings"
+ "time"
"code.gitea.io/gitea/models/avatars"
"code.gitea.io/gitea/models/db"
@@ -51,6 +52,7 @@ func Profile(ctx *context.Context) {
ctx.Data["AllowedUserVisibilityModes"] = setting.Service.AllowedUserVisibilityModesSlice.ToVisibleTypeSlice()
ctx.Data["DisableGravatar"] = setting.Config().Picture.DisableGravatar.Value(ctx)
ctx.Data["PronounsAreCustom"] = !slices.Contains(recognisedPronouns, ctx.Doer.Pronouns)
+ ctx.Data["CooldownPeriod"] = setting.Service.UsernameCooldownPeriod
ctx.HTML(http.StatusOK, tplSettingsProfile)
}
@@ -62,6 +64,7 @@ func ProfilePost(ctx *context.Context) {
ctx.Data["AllowedUserVisibilityModes"] = setting.Service.AllowedUserVisibilityModesSlice.ToVisibleTypeSlice()
ctx.Data["DisableGravatar"] = setting.Config().Picture.DisableGravatar.Value(ctx)
ctx.Data["PronounsAreCustom"] = !slices.Contains(recognisedPronouns, ctx.Doer.Pronouns)
+ ctx.Data["CooldownPeriod"] = setting.Service.UsernameCooldownPeriod
if ctx.HasError() {
ctx.HTML(http.StatusOK, tplSettingsProfile)
@@ -77,6 +80,8 @@ func ProfilePost(ctx *context.Context) {
ctx.Flash.Error(ctx.Tr("form.username_change_not_local_user"))
case user_model.IsErrUserAlreadyExist(err):
ctx.Flash.Error(ctx.Tr("form.username_been_taken"))
+ case user_model.IsErrCooldownPeriod(err):
+ ctx.Flash.Error(ctx.Tr("form.username_claiming_cooldown", err.(user_model.ErrCooldownPeriod).ExpireTime.Format(time.RFC1123Z)))
case db.IsErrNameReserved(err):
ctx.Flash.Error(ctx.Tr("user.form.name_reserved", form.Name))
case db.IsErrNamePatternNotAllowed(err):
diff --git a/routers/web/web.go b/routers/web/web.go
index 6061863895..4d8d280c89 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -1146,9 +1146,10 @@ func registerRoutes(m *web.Route) {
m.Group("/{type:issues|pulls}", func() {
m.Group("/{index}", func() {
m.Get("/info", repo.GetIssueInfo)
- m.Get("/summary-card", repo.GetSummaryCard)
+ m.Get("/summary-card", repo.DrawIssueSummaryCard)
})
})
+ m.Get("/-/summary-card", repo.DrawRepoSummaryCard)
}, ignSignIn, context.RepoAssignment, context.UnitTypes()) // for "/{username}/{reponame}" which doesn't require authentication
// Grouping for those endpoints that do require authentication
@@ -1298,6 +1299,7 @@ func registerRoutes(m *web.Route) {
m.Get("/latest", repo.LatestRelease)
m.Get(".rss", feedEnabled, repo.ReleasesFeedRSS)
m.Get(".atom", feedEnabled, repo.ReleasesFeedAtom)
+ m.Get("/summary-card/*", repo.DrawReleaseSummaryCard)
}, ctxDataSet("EnableFeed", setting.Other.EnableFeed),
repo.MustBeNotEmpty, context.RepoRefByType(context.RepoRefTag, true))
m.Get("/releases/attachments/{uuid}", repo.MustBeNotEmpty, repo.GetAttachment)
diff --git a/services/actions/clear_tasks.go b/services/actions/clear_tasks.go
index 67373782d5..f146c22372 100644
--- a/services/actions/clear_tasks.go
+++ b/services/actions/clear_tasks.go
@@ -19,7 +19,7 @@ import (
// StopZombieTasks stops the task which have running status, but haven't been updated for a long time
func StopZombieTasks(ctx context.Context) error {
return stopTasks(ctx, actions_model.FindTaskOptions{
- Status: actions_model.StatusRunning,
+ Status: []actions_model.Status{actions_model.StatusRunning},
UpdatedBefore: timeutil.TimeStamp(time.Now().Add(-setting.Actions.ZombieTaskTimeout).Unix()),
})
}
@@ -27,7 +27,7 @@ func StopZombieTasks(ctx context.Context) error {
// StopEndlessTasks stops the tasks which have running status and continuous updates, but don't end for a long time
func StopEndlessTasks(ctx context.Context) error {
return stopTasks(ctx, actions_model.FindTaskOptions{
- Status: actions_model.StatusRunning,
+ Status: []actions_model.Status{actions_model.StatusRunning},
StartedBefore: timeutil.TimeStamp(time.Now().Add(-setting.Actions.EndlessTaskTimeout).Unix()),
})
}
diff --git a/services/actions/interface.go b/services/actions/interface.go
index d4fa782fec..76bee6f153 100644
--- a/services/actions/interface.go
+++ b/services/actions/interface.go
@@ -25,4 +25,6 @@ type API interface {
UpdateVariable(*context.APIContext)
// GetRegistrationToken get registration token
GetRegistrationToken(*context.APIContext)
+ // SearchActionRunJobs get pending Action run jobs
+ SearchActionRunJobs(*context.APIContext)
}
diff --git a/services/auth/httpsign.go b/services/auth/httpsign.go
index b604349f80..83a36bef23 100644
--- a/services/auth/httpsign.go
+++ b/services/auth/httpsign.go
@@ -17,7 +17,7 @@ import (
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
- "github.com/go-fed/httpsig"
+ "github.com/42wim/httpsig"
"golang.org/x/crypto/ssh"
)
@@ -205,7 +205,7 @@ func doVerify(verifier httpsig.Verifier, sshPublicKeys []ssh.PublicKey) error {
case strings.HasPrefix(publicKey.Type(), "ssh-ed25519"):
algos = []httpsig.Algorithm{httpsig.ED25519}
case strings.HasPrefix(publicKey.Type(), "ssh-rsa"):
- algos = []httpsig.Algorithm{httpsig.RSA_SHA1, httpsig.RSA_SHA256, httpsig.RSA_SHA512}
+ algos = []httpsig.Algorithm{httpsig.RSA_SHA256, httpsig.RSA_SHA512}
}
for _, algo := range algos {
if err := verifier.Verify(cryptoPubkey, algo); err == nil {
diff --git a/services/auth/source/oauth2/providers_base.go b/services/auth/source/oauth2/providers_base.go
index 9d4ab106e5..63318b84ef 100644
--- a/services/auth/source/oauth2/providers_base.go
+++ b/services/auth/source/oauth2/providers_base.go
@@ -48,4 +48,8 @@ func (b *BaseProvider) CustomURLSettings() *CustomURLSettings {
return nil
}
+func (b *BaseProvider) CanProvideSSHKeys() bool {
+ return false
+}
+
var _ Provider = &BaseProvider{}
diff --git a/services/auth/source/oauth2/providers_openid.go b/services/auth/source/oauth2/providers_openid.go
index 285876d5ac..f606581271 100644
--- a/services/auth/source/oauth2/providers_openid.go
+++ b/services/auth/source/oauth2/providers_openid.go
@@ -51,6 +51,10 @@ func (o *OpenIDProvider) CustomURLSettings() *CustomURLSettings {
return nil
}
+func (o *OpenIDProvider) CanProvideSSHKeys() bool {
+ return true
+}
+
var _ GothProvider = &OpenIDProvider{}
func init() {
diff --git a/services/auth/source/oauth2/source.go b/services/auth/source/oauth2/source.go
index 675005e55a..3f8616c6ff 100644
--- a/services/auth/source/oauth2/source.go
+++ b/services/auth/source/oauth2/source.go
@@ -4,6 +4,8 @@
package oauth2
import (
+ "strings"
+
"code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/modules/json"
)
@@ -17,15 +19,16 @@ type Source struct {
CustomURLMapping *CustomURLMapping
IconURL string
- Scopes []string
- RequiredClaimName string
- RequiredClaimValue string
- GroupClaimName string
- AdminGroup string
- GroupTeamMap string
- GroupTeamMapRemoval bool
- RestrictedGroup string
- SkipLocalTwoFA bool `json:",omitempty"`
+ Scopes []string
+ AttributeSSHPublicKey string
+ RequiredClaimName string
+ RequiredClaimValue string
+ GroupClaimName string
+ AdminGroup string
+ GroupTeamMap string
+ GroupTeamMapRemoval bool
+ RestrictedGroup string
+ SkipLocalTwoFA bool `json:",omitempty"`
// reference to the authSource
authSource *auth.Source
@@ -41,6 +44,11 @@ func (source *Source) ToDB() ([]byte, error) {
return json.Marshal(source)
}
+// ProvidesSSHKeys returns if this source provides SSH Keys
+func (source *Source) ProvidesSSHKeys() bool {
+ return len(strings.TrimSpace(source.AttributeSSHPublicKey)) > 0
+}
+
// SetAuthSource sets the related AuthSource
func (source *Source) SetAuthSource(authSource *auth.Source) {
source.authSource = authSource
diff --git a/services/context/repo.go b/services/context/repo.go
index 45a046eff6..d294c00455 100644
--- a/services/context/repo.go
+++ b/services/context/repo.go
@@ -25,6 +25,7 @@ import (
unit_model "code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/cache"
+ "code.gitea.io/gitea/modules/card"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/gitrepo"
code_indexer "code.gitea.io/gitea/modules/indexer/code"
@@ -632,6 +633,16 @@ func RepoAssignment(ctx *Context) context.CancelFunc {
ctx.Data["IsStaringRepo"] = repo_model.IsStaring(ctx, ctx.Doer.ID, repo.ID)
}
+ cardWidth, cardHeight := card.DefaultSize()
+ ctx.Data["OpenGraphTitle"] = repo.Name
+ ctx.Data["OpenGraphURL"] = repo.HTMLURL()
+ ctx.Data["OpenGraphType"] = "object"
+ ctx.Data["OpenGraphDescription"] = repo.Description
+ ctx.Data["OpenGraphImageURL"] = repo.SummaryCardURL()
+ ctx.Data["OpenGraphImageWidth"] = cardWidth
+ ctx.Data["OpenGraphImageHeight"] = cardHeight
+ ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.summary_card_alt", repo.FullName())
+
if repo.IsFork {
RetrieveBaseRepo(ctx, repo)
if ctx.Written() {
diff --git a/services/doctor/dbconsistency.go b/services/doctor/dbconsistency.go
index 80f538d670..9e2fcb645f 100644
--- a/services/doctor/dbconsistency.go
+++ b/services/doctor/dbconsistency.go
@@ -246,6 +246,9 @@ func checkDBConsistency(ctx context.Context, logger log.Logger, autofix bool) er
// find authorization tokens without existing user
genericOrphanCheck("Authorization token without existing User",
"forgejo_auth_token", "user", "forgejo_auth_token.uid=`user`.id"),
+ // find two_factor without existing user
+ genericOrphanCheck("Orphaned TwoFactor without existing User",
+ "two_factor", "user", "`two_factor`.uid=`user`.id"),
)
for _, c := range consistencyChecks {
diff --git a/services/f3/driver/issue.go b/services/f3/driver/issue.go
index 7f1614deef..371ff9d45a 100644
--- a/services/f3/driver/issue.go
+++ b/services/f3/driver/issue.go
@@ -48,7 +48,7 @@ func (o *issue) ToFormat() f3.Interface {
return o.NewFormat()
}
- var milestone *f3.Reference
+ milestone := &f3.Reference{}
if o.forgejoIssue.Milestone != nil {
milestone = f3_tree.NewIssueMilestoneReference(o.forgejoIssue.Milestone.ID)
}
@@ -82,9 +82,11 @@ func (o *issue) ToFormat() f3.Interface {
func (o *issue) FromFormat(content f3.Interface) {
issue := content.(*f3.Issue)
var milestone *issues_model.Milestone
+ var milestoneID int64
if issue.Milestone != nil {
+ milestoneID = issue.Milestone.GetIDAsInt()
milestone = &issues_model.Milestone{
- ID: issue.Milestone.GetIDAsInt(),
+ ID: milestoneID,
}
}
o.forgejoIssue = &issues_model.Issue{
@@ -95,6 +97,7 @@ func (o *issue) FromFormat(content f3.Interface) {
ID: issue.PosterID.GetIDAsInt(),
},
Content: issue.Content,
+ MilestoneID: milestoneID,
Milestone: milestone,
IsClosed: issue.State == f3.IssueStateClosed,
CreatedUnix: timeutil.TimeStamp(issue.Created.Unix()),
@@ -134,7 +137,7 @@ func (o *issue) Get(ctx context.Context) bool {
panic(fmt.Errorf("issue %v %w", id, err))
}
if err := issue.LoadAttributes(ctx); err != nil {
- panic(err)
+ panic(fmt.Errorf("LoadAttributes %v %w", id, err))
}
o.forgejoIssue = issue
@@ -144,11 +147,67 @@ func (o *issue) Get(ctx context.Context) bool {
func (o *issue) Patch(ctx context.Context) {
node := o.GetNode()
project := f3_tree.GetProjectID(o.GetNode())
- id := node.GetID().Int64()
- o.Trace("repo_id = %d, index = %d", project, id)
- if _, err := db.GetEngine(ctx).Where("`repo_id` = ? AND `index` = ?", project, id).Cols("name", "content", "is_closed").Update(o.forgejoIssue); err != nil {
+ index := node.GetID().Int64()
+ id := getIssueID(ctx, project, index)
+ o.Trace("id = %d, repo_id = %d, index = %d, assignees = %v", id, project, index, o.forgejoIssue.Assignees)
+ if _, err := db.GetEngine(ctx).Where("`id` = ?", id).Cols("name", "content", "is_closed", "milestone_id", "is_locked").Update(o.forgejoIssue); err != nil {
panic(fmt.Errorf("%v %v", o.forgejoIssue, err))
}
+
+ updateIssueAssignees(ctx, id, o.forgejoIssue.Assignees)
+ updateIssueLabels(ctx, id, o.forgejoIssue.Labels)
+}
+
+func getIssueID(ctx context.Context, repoID, index int64) int64 {
+ var id int64
+ if _, err := db.GetEngine(ctx).Select("id").Table("issue").Where("`repo_id` = ? AND `index` = ?", repoID, index).Get(&id); err != nil {
+ panic(fmt.Errorf("%v %v: %w", repoID, index, err))
+ }
+ return id
+}
+
+func updateIssueAssignees(ctx context.Context, issueID int64, assignees []*user_model.User) {
+ sess := db.GetEngine(ctx)
+
+ if _, err := sess.Where("issue_id = ?", issueID).Delete(new(issues_model.IssueAssignees)); err != nil {
+ panic(fmt.Errorf("delete IssueAssignees %v %w", issueID, err))
+ }
+
+ issueAssignees := make([]issues_model.IssueAssignees, 0, len(assignees))
+ for _, assignee := range assignees {
+ issueAssignees = append(issueAssignees, issues_model.IssueAssignees{
+ IssueID: issueID,
+ AssigneeID: assignee.ID,
+ })
+ }
+
+ if len(issueAssignees) > 0 {
+ if _, err := sess.Insert(issueAssignees); err != nil {
+ panic(fmt.Errorf("Insert %v %w", issueID, err))
+ }
+ }
+}
+
+func updateIssueLabels(ctx context.Context, issueID int64, labels []*issues_model.Label) {
+ sess := db.GetEngine(ctx)
+
+ if _, err := sess.Where("issue_id = ?", issueID).Delete(new(issues_model.IssueLabel)); err != nil {
+ panic(fmt.Errorf("delete IssueLabel %v %w", issueID, err))
+ }
+
+ issueLabels := make([]issues_model.IssueLabel, 0, len(labels))
+ for _, label := range labels {
+ issueLabels = append(issueLabels, issues_model.IssueLabel{
+ IssueID: issueID,
+ LabelID: label.ID,
+ })
+ }
+
+ if len(issueLabels) > 0 {
+ if _, err := sess.Insert(issueLabels); err != nil {
+ panic(fmt.Errorf("Insert %v %w", issueID, err))
+ }
+ }
}
func (o *issue) Put(ctx context.Context) generic.NodeID {
@@ -156,17 +215,6 @@ func (o *issue) Put(ctx context.Context) generic.NodeID {
o.Trace("%s", node.GetID())
o.forgejoIssue.RepoID = f3_tree.GetProjectID(o.GetNode())
- makeLabels := func(issueID int64) []issues_model.IssueLabel {
- labels := make([]issues_model.IssueLabel, 0, len(o.forgejoIssue.Labels))
- for _, label := range o.forgejoIssue.Labels {
- o.Trace("%d with label %d", issueID, label.ID)
- labels = append(labels, issues_model.IssueLabel{
- IssueID: issueID,
- LabelID: label.ID,
- })
- }
- return labels
- }
idx, err := db.GetNextResourceIndex(ctx, "issue_index", o.forgejoIssue.RepoID)
if err != nil {
@@ -180,31 +228,8 @@ func (o *issue) Put(ctx context.Context) generic.NodeID {
panic(err)
}
- labels := makeLabels(o.forgejoIssue.ID)
- if len(labels) > 0 {
- if _, err := sess.Insert(labels); err != nil {
- panic(err)
- }
- }
-
- makeAssignees := func(issueID int64) []issues_model.IssueAssignees {
- assignees := make([]issues_model.IssueAssignees, 0, len(o.forgejoIssue.Assignees))
- for _, assignee := range o.forgejoIssue.Assignees {
- o.Trace("%d with assignee %d", issueID, assignee.ID)
- assignees = append(assignees, issues_model.IssueAssignees{
- IssueID: issueID,
- AssigneeID: assignee.ID,
- })
- }
- return assignees
- }
-
- assignees := makeAssignees(o.forgejoIssue.ID)
- if len(assignees) > 0 {
- if _, err := sess.Insert(assignees); err != nil {
- panic(err)
- }
- }
+ updateIssueAssignees(ctx, o.forgejoIssue.ID, o.forgejoIssue.Assignees)
+ updateIssueLabels(ctx, o.forgejoIssue.ID, o.forgejoIssue.Labels)
o.Trace("issue created %d/%d", o.forgejoIssue.ID, o.forgejoIssue.Index)
return generic.NewNodeID(o.forgejoIssue.Index)
diff --git a/services/f3/driver/label.go b/services/f3/driver/label.go
index 6d1fcaad1a..aef0d0256d 100644
--- a/services/f3/driver/label.go
+++ b/services/f3/driver/label.go
@@ -7,6 +7,7 @@ package driver
import (
"context"
"fmt"
+ "strings"
"code.gitea.io/gitea/models/db"
issues_model "code.gitea.io/gitea/models/issues"
@@ -45,7 +46,7 @@ func (o *label) ToFormat() f3.Interface {
return &f3.Label{
Common: f3.NewCommon(fmt.Sprintf("%d", o.forgejoLabel.ID)),
Name: o.forgejoLabel.Name,
- Color: o.forgejoLabel.Color,
+ Color: strings.TrimPrefix(o.forgejoLabel.Color, "#"),
Description: o.forgejoLabel.Description,
}
}
@@ -56,7 +57,7 @@ func (o *label) FromFormat(content f3.Interface) {
ID: f3_util.ParseInt(label.GetID()),
Name: label.Name,
Description: label.Description,
- Color: label.Color,
+ Color: "#" + label.Color,
}
}
diff --git a/services/f3/driver/milestone.go b/services/f3/driver/milestone.go
index 222407fc30..f133d37f7a 100644
--- a/services/f3/driver/milestone.go
+++ b/services/f3/driver/milestone.go
@@ -117,7 +117,7 @@ func (o *milestone) Get(ctx context.Context) bool {
func (o *milestone) Patch(ctx context.Context) {
o.Trace("%d", o.forgejoMilestone.ID)
- if _, err := db.GetEngine(ctx).ID(o.forgejoMilestone.ID).Cols("name", "description").Update(o.forgejoMilestone); err != nil {
+ if _, err := db.GetEngine(ctx).ID(o.forgejoMilestone.ID).Cols("name", "description", "is_closed", "deadline_unix").Update(o.forgejoMilestone); err != nil {
panic(fmt.Errorf("UpdateMilestoneCols: %v %v", o.forgejoMilestone, err))
}
}
diff --git a/services/forms/auth_form.go b/services/forms/auth_form.go
index f0da63155a..39aae51756 100644
--- a/services/forms/auth_form.go
+++ b/services/forms/auth_form.go
@@ -75,6 +75,7 @@ type AuthenticationForm struct {
Oauth2RestrictedGroup string
Oauth2GroupTeamMap string `binding:"ValidGroupTeamMap"`
Oauth2GroupTeamMapRemoval bool
+ Oauth2AttributeSSHPublicKey string
SkipLocalTwoFA bool
SSPIAutoCreateUsers bool
SSPIAutoActivateUsers bool
diff --git a/services/forms/package_form.go b/services/forms/package_form.go
index d475d2f569..7a7d8752cf 100644
--- a/services/forms/package_form.go
+++ b/services/forms/package_form.go
@@ -15,7 +15,7 @@ import (
type PackageCleanupRuleForm struct {
ID int64
Enabled bool
- Type string `binding:"Required;In(alpine,arch,cargo,chef,composer,conan,conda,container,cran,debian,generic,go,helm,maven,npm,nuget,pub,pypi,rpm,rubygems,swift,vagrant)"`
+ Type string `binding:"Required;In(alpine,arch,cargo,chef,composer,conan,conda,container,cran,debian,generic,go,helm,maven,npm,nuget,pub,pypi,rpm,alt,rubygems,swift,vagrant)"`
KeepCount int `binding:"In(0,1,5,10,25,50,100)"`
KeepPattern string `binding:"RegexPattern"`
RemoveDays int `binding:"In(0,7,14,30,60,90,180)"`
diff --git a/services/forms/user_form.go b/services/forms/user_form.go
index 3ba8724c92..0d06f4b417 100644
--- a/services/forms/user_form.go
+++ b/services/forms/user_form.go
@@ -290,7 +290,7 @@ func (f *UpdateThemeForm) Validate(req *http.Request, errs binding.Errors) bindi
return middleware.Validate(errs, ctx.Data, f, ctx.Locale)
}
-// IsThemeExists checks if the theme is a theme available in the config.
+// IsThemeExists checks if the theme is available in the config.
func (f UpdateThemeForm) IsThemeExists() bool {
var exists bool
diff --git a/services/issue/milestone.go b/services/issue/milestone.go
index 31490c7b03..407ad0a59b 100644
--- a/services/issue/milestone.go
+++ b/services/issue/milestone.go
@@ -85,6 +85,10 @@ func changeMilestoneAssign(ctx context.Context, doer *user_model.User, issue *is
}
}
+ if issue.MilestoneID == 0 {
+ issue.Milestone = nil
+ }
+
return nil
}
diff --git a/services/issue/milestone_test.go b/services/issue/milestone_test.go
index 1c06572f8e..e75f64550c 100644
--- a/services/issue/milestone_test.go
+++ b/services/issue/milestone_test.go
@@ -24,6 +24,7 @@ func TestChangeMilestoneAssign(t *testing.T) {
oldMilestoneID := issue.MilestoneID
issue.MilestoneID = 2
+ require.NoError(t, issue.LoadMilestone(db.DefaultContext))
require.NoError(t, ChangeMilestoneAssign(db.DefaultContext, issue, doer, oldMilestoneID))
unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{
IssueID: issue.ID,
@@ -32,4 +33,11 @@ func TestChangeMilestoneAssign(t *testing.T) {
OldMilestoneID: oldMilestoneID,
})
unittest.CheckConsistencyFor(t, &issues_model.Milestone{}, &issues_model.Issue{})
+ assert.NotNil(t, issue.Milestone)
+
+ oldMilestoneID = issue.MilestoneID
+ issue.MilestoneID = 0
+ require.NoError(t, ChangeMilestoneAssign(db.DefaultContext, issue, doer, oldMilestoneID))
+ assert.EqualValues(t, 0, issue.MilestoneID)
+ assert.Nil(t, issue.Milestone)
}
diff --git a/services/migrations/dump.go b/services/migrations/dump.go
index 07812002af..cb13cd3e5c 100644
--- a/services/migrations/dump.go
+++ b/services/migrations/dump.go
@@ -128,6 +128,7 @@ func (g *RepositoryDumper) CreateRepo(repo *base.Repository, opts base.MigrateOp
"comments": opts.Comments,
"pulls": opts.PullRequests,
"assets": opts.ReleaseAssets,
+ "website": repo.Website,
})
if err != nil {
return err
diff --git a/services/migrations/gitea_downloader.go b/services/migrations/gitea_downloader.go
index 272bf02e11..b42c7aa4da 100644
--- a/services/migrations/gitea_downloader.go
+++ b/services/migrations/gitea_downloader.go
@@ -160,6 +160,7 @@ func (g *GiteaDownloader) GetRepoInfo() (*base.Repository, error) {
CloneURL: repo.CloneURL,
OriginalURL: repo.HTMLURL,
DefaultBranch: repo.DefaultBranch,
+ Website: repo.Website,
}, nil
}
diff --git a/services/migrations/gitea_downloader_test.go b/services/migrations/gitea_downloader_test.go
index 8429682613..48306d7996 100644
--- a/services/migrations/gitea_downloader_test.go
+++ b/services/migrations/gitea_downloader_test.go
@@ -40,6 +40,7 @@ func TestGiteaDownloadRepo(t *testing.T) {
CloneURL: server.URL + "/gitea/test_repo.git",
OriginalURL: server.URL + "/gitea/test_repo",
DefaultBranch: "master",
+ Website: "https://codeberg.org/forgejo/forgejo/",
}, repo)
topics, err := downloader.GetTopics()
diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go
index 2076348535..7bd6538ff2 100644
--- a/services/migrations/gitea_uploader.go
+++ b/services/migrations/gitea_uploader.go
@@ -105,6 +105,7 @@ func (g *GiteaLocalUploader) CreateRepo(repo *base.Repository, opts base.Migrate
r, err = repo_service.CreateRepositoryDirectly(g.ctx, g.doer, owner, repo_service.CreateRepoOptions{
Name: g.repoName,
Description: repo.Description,
+ Website: repo.Website,
OriginalURL: repo.OriginalURL,
GitServiceType: opts.GitServiceType,
IsPrivate: opts.Private || setting.Repository.ForcePrivate,
@@ -119,20 +120,17 @@ func (g *GiteaLocalUploader) CreateRepo(repo *base.Repository, opts base.Migrate
}
r.DefaultBranch = repo.DefaultBranch
r.Description = repo.Description
+ r.Website = repo.Website
r, err = repo_service.MigrateRepositoryGitData(g.ctx, owner, r, base.MigrateOptions{
- RepoName: g.repoName,
- Description: repo.Description,
- OriginalURL: repo.OriginalURL,
- GitServiceType: opts.GitServiceType,
- Mirror: repo.IsMirror,
+ CloneAddr: repo.CloneURL, // SECURITY: we will assume that this has already been checked
LFS: opts.LFS,
LFSEndpoint: opts.LFSEndpoint,
- CloneAddr: repo.CloneURL, // SECURITY: we will assume that this has already been checked
- Private: repo.IsPrivate,
- Wiki: opts.Wiki,
- Releases: opts.Releases, // if didn't get releases, then sync them from tags
+ Mirror: repo.IsMirror,
MirrorInterval: opts.MirrorInterval,
+ Releases: opts.Releases, // if didn't get releases, then sync them from tags
+ RepoName: g.repoName,
+ Wiki: opts.Wiki,
}, NewMigrationHTTPTransport())
g.sameApp = strings.HasPrefix(repo.OriginalURL, setting.AppURL)
diff --git a/services/migrations/github.go b/services/migrations/github.go
index ca7aaeb68f..7025354f77 100644
--- a/services/migrations/github.go
+++ b/services/migrations/github.go
@@ -220,6 +220,7 @@ func (g *GithubDownloaderV3) GetRepoInfo() (*base.Repository, error) {
OriginalURL: gr.GetHTMLURL(),
CloneURL: gr.GetCloneURL(),
DefaultBranch: gr.GetDefaultBranch(),
+ Website: gr.GetHomepage(),
}, nil
}
diff --git a/services/migrations/github_test.go b/services/migrations/github_test.go
index 20a9282756..9270d5d4c4 100644
--- a/services/migrations/github_test.go
+++ b/services/migrations/github_test.go
@@ -38,6 +38,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
CloneURL: server.URL + "/go-gitea/test_repo.git",
OriginalURL: server.URL + "/go-gitea/test_repo",
DefaultBranch: "master",
+ Website: "https://codeberg.org/forgejo/forgejo/",
}, repo)
topics, err := downloader.GetTopics()
diff --git a/services/migrations/gitlab.go b/services/migrations/gitlab.go
index da56d2a175..8ae8fa9a23 100644
--- a/services/migrations/gitlab.go
+++ b/services/migrations/gitlab.go
@@ -21,7 +21,7 @@ import (
base "code.gitea.io/gitea/modules/migration"
"code.gitea.io/gitea/modules/structs"
- "github.com/xanzy/go-gitlab"
+ "gitlab.com/gitlab-org/api/client-go"
)
var (
diff --git a/services/migrations/gitlab_test.go b/services/migrations/gitlab_test.go
index 39edba3cda..9344311656 100644
--- a/services/migrations/gitlab_test.go
+++ b/services/migrations/gitlab_test.go
@@ -19,7 +19,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
- "github.com/xanzy/go-gitlab"
+ "gitlab.com/gitlab-org/api/client-go"
)
func TestGitlabDownloadRepo(t *testing.T) {
diff --git a/services/migrations/gogs.go b/services/migrations/gogs.go
index b31d05fa73..1fef4808b0 100644
--- a/services/migrations/gogs.go
+++ b/services/migrations/gogs.go
@@ -151,6 +151,7 @@ func (g *GogsDownloader) GetRepoInfo() (*base.Repository, error) {
CloneURL: gr.CloneURL,
OriginalURL: gr.HTMLURL,
DefaultBranch: gr.DefaultBranch,
+ Website: gr.Website,
}, nil
}
diff --git a/services/migrations/main_test.go b/services/migrations/main_test.go
index d0ec6a3f8d..f78d75e4db 100644
--- a/services/migrations/main_test.go
+++ b/services/migrations/main_test.go
@@ -219,6 +219,7 @@ func assertRepositoryEqual(t *testing.T, expected, actual *base.Repository) {
assert.Equal(t, expected.CloneURL, actual.CloneURL)
assert.Equal(t, expected.OriginalURL, actual.OriginalURL)
assert.Equal(t, expected.DefaultBranch, actual.DefaultBranch)
+ assert.Equal(t, expected.Website, actual.Website)
}
func assertReviewEqual(t *testing.T, expected, actual *base.Review) {
diff --git a/services/migrations/restore.go b/services/migrations/restore.go
index fd337b22c7..e8725bc647 100644
--- a/services/migrations/restore.go
+++ b/services/migrations/restore.go
@@ -85,6 +85,7 @@ func (r *RepositoryRestorer) GetRepoInfo() (*base.Repository, error) {
OriginalURL: opts["original_url"],
CloneURL: filepath.Join(r.baseDir, "git"),
DefaultBranch: opts["default_branch"],
+ Website: opts["website"],
}, nil
}
diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo
index df201d9072..7b4441ceae 100644
--- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo
+++ b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo
@@ -4,4 +4,4 @@ Cache-Control: max-age=0, private, must-revalidate, no-transform
Vary: Origin
X-Content-Type-Options: nosniff
-{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}
+{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}
diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F1%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F1%2Freactions
index 5a0d95e0c7..d7b453f63b 100644
--- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F1%2Freactions
+++ b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F1%2Freactions
@@ -7,4 +7,4 @@ X-Frame-Options: SAMEORIGIN
Content-Type: application/json;charset=utf-8
Content-Length: 1293
-[{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"gitea","created_at":"2020-09-01T00:15:14Z"},{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"confused","created_at":"2020-09-01T00:15:19Z"}]
+[{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"gitea","created_at":"2020-09-01T00:15:14Z"},{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"confused","created_at":"2020-09-01T00:15:19Z"}]
diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Fcomments%3Flimit=50&page=1 b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Fcomments%3Flimit=50&page=1
index bf66eb26e3..294aa749cb 100644
--- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Fcomments%3Flimit=50&page=1
+++ b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Fcomments%3Flimit=50&page=1
@@ -7,4 +7,4 @@ Content-Length: 1824
Cache-Control: max-age=0, private, must-revalidate, no-transform
Vary: Origin
-[{"id":116550,"html_url":"https://gitea.com/gitea/test_repo/issues/4#issuecomment-116550","pull_request_url":"","issue_url":"https://gitea.com/gitea/test_repo/issues/4","user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"body":"a really good question!\n\nIt is the used as TESTSET for gitea2gitea repo migration function","assets":[],"created_at":"2020-09-01T15:49:30Z","updated_at":"2020-09-02T18:21:05Z"},{"id":116552,"html_url":"https://gitea.com/gitea/test_repo/issues/4#issuecomment-116552","pull_request_url":"","issue_url":"https://gitea.com/gitea/test_repo/issues/4","user":{"id":-1,"login":"Ghost","login_name":"","source_id":0,"full_name":"","email":"ghost@noreply.gitea.com","avatar_url":"https://gitea.com/assets/img/avatar_default.png","html_url":"https://gitea.com/Ghost","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"1970-01-01T00:00:00Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Ghost"},"original_author":"","original_author_id":0,"body":"Oh!","assets":[],"created_at":"2020-09-01T15:49:53Z","updated_at":"2020-09-01T15:49:53Z"}]
+[{"id":116550,"html_url":"https://gitea.com/gitea/test_repo/issues/4#issuecomment-116550","pull_request_url":"","issue_url":"https://gitea.com/gitea/test_repo/issues/4","user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"body":"a really good question!\n\nIt is the used as TESTSET for gitea2gitea repo migration function","assets":[],"created_at":"2020-09-01T15:49:30Z","updated_at":"2020-09-02T18:21:05Z"},{"id":116552,"html_url":"https://gitea.com/gitea/test_repo/issues/4#issuecomment-116552","pull_request_url":"","issue_url":"https://gitea.com/gitea/test_repo/issues/4","user":{"id":-1,"login":"Ghost","login_name":"","source_id":0,"full_name":"","email":"ghost@noreply.gitea.com","avatar_url":"https://gitea.com/assets/img/avatar_default.png","html_url":"https://gitea.com/Ghost","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"1970-01-01T00:00:00Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Ghost"},"original_author":"","original_author_id":0,"body":"Oh!","assets":[],"created_at":"2020-09-01T15:49:53Z","updated_at":"2020-09-01T15:49:53Z"}]
diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Freactions
index 25cefa8da8..0300a779cb 100644
--- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Freactions
+++ b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Freactions
@@ -7,4 +7,4 @@ X-Content-Type-Options: nosniff
Content-Type: application/json;charset=utf-8
Content-Length: 1290
-[{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"gitea","created_at":"2020-09-01T19:36:40Z"},{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"laugh","created_at":"2020-09-01T19:36:45Z"}]
+[{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"gitea","created_at":"2020-09-01T19:36:40Z"},{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"laugh","created_at":"2020-09-01T19:36:45Z"}]
diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F5%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F5%2Freactions
index 7d62b318a9..39606a50cf 100644
--- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F5%2Freactions
+++ b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F5%2Freactions
@@ -7,4 +7,4 @@ Content-Type: application/json;charset=utf-8
Cache-Control: max-age=0, private, must-revalidate, no-transform
X-Total-Count: 2
-[{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"+1","created_at":"2020-09-01T16:07:06Z"},{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"hooray","created_at":"2020-09-01T16:07:11Z"}]
+[{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"+1","created_at":"2020-09-01T16:07:06Z"},{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"hooray","created_at":"2020-09-01T16:07:11Z"}]
diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=2&page=3&state=all&type=issues b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=2&page=3&state=all&type=issues
index 9133152709..1e552b22d4 100644
--- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=2&page=3&state=all&type=issues
+++ b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=2&page=3&state=all&type=issues
@@ -7,4 +7,4 @@ X-Total-Count: 7
Content-Type: application/json;charset=utf-8
Vary: Origin
-[{"id":30475,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/4","html_url":"https://gitea.com/gitea/test_repo/issues/4","number":4,"user":{"id":-1,"login":"Ghost","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/assets/img/avatar_default.png","html_url":"https://gitea.com/Ghost","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"1970-01-01T00:00:00Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Ghost"},"original_author":"","original_author_id":0,"title":"what is this repo about?","body":"","ref":"","assets":[],"labels":[{"id":3733,"name":"Question","exclusive":false,"is_archived":false,"color":"fbca04","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3733"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":null,"assignees":null,"state":"closed","is_locked":true,"comments":2,"created_at":"2020-09-01T15:48:41Z","updated_at":"2020-09-01T15:50:00Z","closed_at":"2020-09-01T15:49:34Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30471,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/2","html_url":"https://gitea.com/gitea/test_repo/issues/2","number":2,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"Spam","body":":(","ref":"","assets":[],"labels":[{"id":3732,"name":"Invalid","exclusive":false,"is_archived":false,"color":"d4c5f9","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3732"}],"milestone":null,"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":2,"created_at":"2020-09-01T00:23:00Z","updated_at":"2020-09-01T14:11:37Z","closed_at":"2020-09-01T14:11:37Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0}]
+[{"id":30475,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/4","html_url":"https://gitea.com/gitea/test_repo/issues/4","number":4,"user":{"id":-1,"login":"Ghost","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/assets/img/avatar_default.png","html_url":"https://gitea.com/Ghost","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"1970-01-01T00:00:00Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Ghost"},"original_author":"","original_author_id":0,"title":"what is this repo about?","body":"","ref":"","assets":[],"labels":[{"id":3733,"name":"Question","exclusive":false,"is_archived":false,"color":"fbca04","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3733"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":null,"assignees":null,"state":"closed","is_locked":true,"comments":2,"created_at":"2020-09-01T15:48:41Z","updated_at":"2020-09-01T15:50:00Z","closed_at":"2020-09-01T15:49:34Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30471,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/2","html_url":"https://gitea.com/gitea/test_repo/issues/2","number":2,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"Spam","body":":(","ref":"","assets":[],"labels":[{"id":3732,"name":"Invalid","exclusive":false,"is_archived":false,"color":"d4c5f9","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3732"}],"milestone":null,"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":2,"created_at":"2020-09-01T00:23:00Z","updated_at":"2020-09-01T14:11:37Z","closed_at":"2020-09-01T14:11:37Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0}]
diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=50&page=1&state=all&type=issues b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=50&page=1&state=all&type=issues
index 47ff443ac1..6b0a6135ac 100644
--- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=50&page=1&state=all&type=issues
+++ b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=50&page=1&state=all&type=issues
@@ -6,4 +6,4 @@ Access-Control-Expose-Headers: X-Total-Count
Cache-Control: max-age=0, private, must-revalidate, no-transform
Vary: Origin
-[{"id":30481,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/10","html_url":"https://gitea.com/gitea/test_repo/issues/10","number":10,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"A'm I allowed to fork it?","body":"yes but do not create pull requests anymore","ref":"","assets":[],"labels":[{"id":3733,"name":"Question","exclusive":false,"is_archived":false,"color":"fbca04","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3733"}],"milestone":null,"assignee":null,"assignees":null,"state":"open","is_locked":false,"comments":0,"created_at":"2020-09-01T17:48:14Z","updated_at":"2020-09-01T17:48:14Z","closed_at":null,"due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30480,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/9","html_url":"https://gitea.com/gitea/test_repo/issues/9","number":9,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"Idears","body":"this is an example for an open issue - they just cant be all closed ;)","ref":"","assets":[],"labels":[{"id":3735,"name":"Enhancement","exclusive":false,"is_archived":false,"color":"207de5","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3735"}],"milestone":{"id":1301,"title":"V2 Finalize","description":"","state":"open","open_issues":1,"closed_issues":2,"created_at":"1970-01-01T00:00:00Z","updated_at":"2022-11-13T05:29:15Z","closed_at":null,"due_on":"2020-09-04T23:59:59Z"},"assignee":null,"assignees":null,"state":"open","is_locked":false,"comments":0,"created_at":"2020-09-01T17:47:11Z","updated_at":"2020-09-01T17:47:17Z","closed_at":null,"due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30477,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/6","html_url":"https://gitea.com/gitea/test_repo/issues/6","number":6,"user":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://techknowlogick.com","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"original_author":"","original_author_id":0,"title":"Please add a tag (or a release)","body":"","ref":"","assets":[],"labels":[],"milestone":null,"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":1,"created_at":"2020-09-01T16:07:01Z","updated_at":"2020-09-01T17:26:02Z","closed_at":"2020-09-01T17:26:02Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30476,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/5","html_url":"https://gitea.com/gitea/test_repo/issues/5","number":5,"user":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://techknowlogick.com","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"original_author":"","original_author_id":0,"title":"Need more contributors to this repo","body":"I volunteer as one","ref":"","assets":[],"labels":[],"milestone":{"id":1301,"title":"V2 Finalize","description":"","state":"open","open_issues":1,"closed_issues":2,"created_at":"1970-01-01T00:00:00Z","updated_at":"2022-11-13T05:29:15Z","closed_at":null,"due_on":"2020-09-04T23:59:59Z"},"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":1,"created_at":"2020-09-01T16:06:30Z","updated_at":"2020-09-01T17:46:09Z","closed_at":"2020-09-01T17:46:09Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30475,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/4","html_url":"https://gitea.com/gitea/test_repo/issues/4","number":4,"user":{"id":-1,"login":"Ghost","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/assets/img/avatar_default.png","html_url":"https://gitea.com/Ghost","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"1970-01-01T00:00:00Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Ghost"},"original_author":"","original_author_id":0,"title":"what is this repo about?","body":"","ref":"","assets":[],"labels":[{"id":3733,"name":"Question","exclusive":false,"is_archived":false,"color":"fbca04","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3733"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":null,"assignees":null,"state":"closed","is_locked":true,"comments":2,"created_at":"2020-09-01T15:48:41Z","updated_at":"2020-09-01T15:50:00Z","closed_at":"2020-09-01T15:49:34Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30471,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/2","html_url":"https://gitea.com/gitea/test_repo/issues/2","number":2,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"Spam","body":":(","ref":"","assets":[],"labels":[{"id":3732,"name":"Invalid","exclusive":false,"is_archived":false,"color":"d4c5f9","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3732"}],"milestone":null,"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":2,"created_at":"2020-09-01T00:23:00Z","updated_at":"2020-09-01T14:11:37Z","closed_at":"2020-09-01T14:11:37Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30470,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/1","html_url":"https://gitea.com/gitea/test_repo/issues/1","number":1,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"Here Is no content!","body":"","ref":"","assets":[],"labels":[{"id":3734,"name":"Valid","exclusive":false,"is_archived":false,"color":"53e917","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3734"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"assignees":[{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"}],"state":"closed","is_locked":false,"comments":0,"created_at":"2020-09-01T00:15:11Z","updated_at":"2020-09-01T17:26:25Z","closed_at":"2020-09-01T17:26:25Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0}]
+[{"id":30481,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/10","html_url":"https://gitea.com/gitea/test_repo/issues/10","number":10,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"A'm I allowed to fork it?","body":"yes but do not create pull requests anymore","ref":"","assets":[],"labels":[{"id":3733,"name":"Question","exclusive":false,"is_archived":false,"color":"fbca04","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3733"}],"milestone":null,"assignee":null,"assignees":null,"state":"open","is_locked":false,"comments":0,"created_at":"2020-09-01T17:48:14Z","updated_at":"2020-09-01T17:48:14Z","closed_at":null,"due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30480,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/9","html_url":"https://gitea.com/gitea/test_repo/issues/9","number":9,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"Idears","body":"this is an example for an open issue - they just cant be all closed ;)","ref":"","assets":[],"labels":[{"id":3735,"name":"Enhancement","exclusive":false,"is_archived":false,"color":"207de5","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3735"}],"milestone":{"id":1301,"title":"V2 Finalize","description":"","state":"open","open_issues":1,"closed_issues":2,"created_at":"1970-01-01T00:00:00Z","updated_at":"2022-11-13T05:29:15Z","closed_at":null,"due_on":"2020-09-04T23:59:59Z"},"assignee":null,"assignees":null,"state":"open","is_locked":false,"comments":0,"created_at":"2020-09-01T17:47:11Z","updated_at":"2020-09-01T17:47:17Z","closed_at":null,"due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30477,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/6","html_url":"https://gitea.com/gitea/test_repo/issues/6","number":6,"user":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"original_author":"","original_author_id":0,"title":"Please add a tag (or a release)","body":"","ref":"","assets":[],"labels":[],"milestone":null,"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":1,"created_at":"2020-09-01T16:07:01Z","updated_at":"2020-09-01T17:26:02Z","closed_at":"2020-09-01T17:26:02Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30476,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/5","html_url":"https://gitea.com/gitea/test_repo/issues/5","number":5,"user":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"original_author":"","original_author_id":0,"title":"Need more contributors to this repo","body":"I volunteer as one","ref":"","assets":[],"labels":[],"milestone":{"id":1301,"title":"V2 Finalize","description":"","state":"open","open_issues":1,"closed_issues":2,"created_at":"1970-01-01T00:00:00Z","updated_at":"2022-11-13T05:29:15Z","closed_at":null,"due_on":"2020-09-04T23:59:59Z"},"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":1,"created_at":"2020-09-01T16:06:30Z","updated_at":"2020-09-01T17:46:09Z","closed_at":"2020-09-01T17:46:09Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30475,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/4","html_url":"https://gitea.com/gitea/test_repo/issues/4","number":4,"user":{"id":-1,"login":"Ghost","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/assets/img/avatar_default.png","html_url":"https://gitea.com/Ghost","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"1970-01-01T00:00:00Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Ghost"},"original_author":"","original_author_id":0,"title":"what is this repo about?","body":"","ref":"","assets":[],"labels":[{"id":3733,"name":"Question","exclusive":false,"is_archived":false,"color":"fbca04","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3733"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":null,"assignees":null,"state":"closed","is_locked":true,"comments":2,"created_at":"2020-09-01T15:48:41Z","updated_at":"2020-09-01T15:50:00Z","closed_at":"2020-09-01T15:49:34Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30471,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/2","html_url":"https://gitea.com/gitea/test_repo/issues/2","number":2,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"Spam","body":":(","ref":"","assets":[],"labels":[{"id":3732,"name":"Invalid","exclusive":false,"is_archived":false,"color":"d4c5f9","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3732"}],"milestone":null,"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":2,"created_at":"2020-09-01T00:23:00Z","updated_at":"2020-09-01T14:11:37Z","closed_at":"2020-09-01T14:11:37Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30470,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/1","html_url":"https://gitea.com/gitea/test_repo/issues/1","number":1,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"Here Is no content!","body":"","ref":"","assets":[],"labels":[{"id":3734,"name":"Valid","exclusive":false,"is_archived":false,"color":"53e917","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3734"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"assignees":[{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"}],"state":"closed","is_locked":false,"comments":0,"created_at":"2020-09-01T00:15:11Z","updated_at":"2020-09-01T17:26:25Z","closed_at":"2020-09-01T17:26:25Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0}]
diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%2F1770%2Fcomments b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%2F1770%2Fcomments
index 81e4dcfd7f..c8cb26c4d1 100644
--- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%2F1770%2Fcomments
+++ b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%2F1770%2Fcomments
@@ -5,4 +5,4 @@ Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
-[{"id":116561,"body":"is one `\\newline` to less?","user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"resolver":null,"pull_request_review_id":1770,"created_at":"2020-09-01T16:12:58Z","updated_at":"2024-06-03T01:18:36Z","path":"README.md","commit_id":"187ece0cb6631e2858a6872e5733433bb3ca3b03","original_commit_id":"","diff_hunk":"@@ -2,3 +2,3 @@\n \n-Test repository for testing migration from gitea 2 gitea\n\\ No newline at end of file\n+Test repository for testing migration from gitea 2 gitea","position":4,"original_position":0,"html_url":"https://gitea.com/gitea/test_repo/pulls/7#issuecomment-116561","pull_request_url":"https://gitea.com/gitea/test_repo/pulls/7"}]
+[{"id":116561,"body":"is one `\\newline` to less?","user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"resolver":null,"pull_request_review_id":1770,"created_at":"2020-09-01T16:12:58Z","updated_at":"2024-06-03T01:18:36Z","path":"README.md","commit_id":"187ece0cb6631e2858a6872e5733433bb3ca3b03","original_commit_id":"","diff_hunk":"@@ -2,3 +2,3 @@\n \n-Test repository for testing migration from gitea 2 gitea\n\\ No newline at end of file\n+Test repository for testing migration from gitea 2 gitea","position":4,"original_position":0,"html_url":"https://gitea.com/gitea/test_repo/pulls/7#issuecomment-116561","pull_request_url":"https://gitea.com/gitea/test_repo/pulls/7"}]
diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%3Flimit=50&page=1 b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%3Flimit=50&page=1
index 8e54635dfc..6aa650bd9c 100644
--- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%3Flimit=50&page=1
+++ b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%3Flimit=50&page=1
@@ -6,4 +6,4 @@ Vary: Origin
X-Frame-Options: SAMEORIGIN
X-Total-Count: 3
-[{"id":1770,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"team":null,"state":"COMMENT","body":"","commit_id":"187ece0cb6631e2858a6872e5733433bb3ca3b03","stale":false,"official":false,"dismissed":true,"comments_count":1,"submitted_at":"2020-09-01T16:12:58Z","updated_at":"2021-04-18T22:00:49Z","html_url":"https://gitea.com/gitea/test_repo/pulls/7#issuecomment-116562","pull_request_url":"https://gitea.com/gitea/test_repo/pulls/7"},{"id":1771,"user":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://techknowlogick.com","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"team":null,"state":"REQUEST_CHANGES","body":"I think this needs some changes","commit_id":"187ece0cb6631e2858a6872e5733433bb3ca3b03","stale":false,"official":false,"dismissed":true,"comments_count":0,"submitted_at":"2020-09-01T17:06:47Z","updated_at":"2021-04-18T22:00:49Z","html_url":"https://gitea.com/gitea/test_repo/pulls/7#issuecomment-116563","pull_request_url":"https://gitea.com/gitea/test_repo/pulls/7"},{"id":1772,"user":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://techknowlogick.com","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"team":null,"state":"APPROVED","body":"looks good","commit_id":"187ece0cb6631e2858a6872e5733433bb3ca3b03","stale":false,"official":true,"dismissed":true,"comments_count":0,"submitted_at":"2020-09-01T17:19:51Z","updated_at":"2021-04-18T22:00:49Z","html_url":"https://gitea.com/gitea/test_repo/pulls/7#issuecomment-116564","pull_request_url":"https://gitea.com/gitea/test_repo/pulls/7"}]
+[{"id":1770,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"team":null,"state":"COMMENT","body":"","commit_id":"187ece0cb6631e2858a6872e5733433bb3ca3b03","stale":false,"official":false,"dismissed":true,"comments_count":1,"submitted_at":"2020-09-01T16:12:58Z","updated_at":"2021-04-18T22:00:49Z","html_url":"https://gitea.com/gitea/test_repo/pulls/7#issuecomment-116562","pull_request_url":"https://gitea.com/gitea/test_repo/pulls/7"},{"id":1771,"user":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"team":null,"state":"REQUEST_CHANGES","body":"I think this needs some changes","commit_id":"187ece0cb6631e2858a6872e5733433bb3ca3b03","stale":false,"official":false,"dismissed":true,"comments_count":0,"submitted_at":"2020-09-01T17:06:47Z","updated_at":"2021-04-18T22:00:49Z","html_url":"https://gitea.com/gitea/test_repo/pulls/7#issuecomment-116563","pull_request_url":"https://gitea.com/gitea/test_repo/pulls/7"},{"id":1772,"user":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"team":null,"state":"APPROVED","body":"looks good","commit_id":"187ece0cb6631e2858a6872e5733433bb3ca3b03","stale":false,"official":true,"dismissed":true,"comments_count":0,"submitted_at":"2020-09-01T17:19:51Z","updated_at":"2021-04-18T22:00:49Z","html_url":"https://gitea.com/gitea/test_repo/pulls/7#issuecomment-116564","pull_request_url":"https://gitea.com/gitea/test_repo/pulls/7"}]
diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=3&page=1&state=all b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=3&page=1&state=all
index 56417b0e90..256c67cc1a 100644
--- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=3&page=1&state=all
+++ b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=3&page=1&state=all
@@ -7,4 +7,4 @@ X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Total-Count: 6
-[{"id":4955,"url":"https://gitea.com/gitea/test_repo/pulls/13","number":13,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"extend","body":"","labels":[],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"open","draft":false,"is_locked":true,"comments":1,"review_comments":0,"additions":1,"deletions":0,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/13","diff_url":"https://gitea.com/gitea/test_repo/pulls/13.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/13.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"6543-patch-1","ref":"6543-patch-1","sha":"0ba7693bfd50d26df7f1b7414e937786c5efb05d","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"merge_base":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","due_date":null,"created_at":"2020-09-01T18:03:54Z","updated_at":"2020-09-01T18:04:26Z","closed_at":null,"pin_order":0},{"id":4954,"url":"https://gitea.com/gitea/test_repo/pulls/12","number":12,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"Dont Touch","body":"\r\nadd dont touch note","labels":[],"milestone":{"id":1301,"title":"V2 Finalize","description":"","state":"open","open_issues":1,"closed_issues":2,"created_at":"1970-01-01T00:00:00Z","updated_at":"2022-11-13T05:29:15Z","closed_at":null,"due_on":"2020-09-04T23:59:59Z"},"assignee":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://techknowlogick.com","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"assignees":[{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://techknowlogick.com","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"}],"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":0,"review_comments":3,"additions":1,"deletions":2,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/12","diff_url":"https://gitea.com/gitea/test_repo/pulls/12.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/12.patch","mergeable":true,"merged":true,"merged_at":"2020-09-01T17:55:34Z","merge_commit_sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"Add-Dont-Touch-Note","ref":"refs/pull/12/head","sha":"b6ab5d9ae000b579a5fff03f92c486da4ddf48b6","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"d9e165e4c7ab6b701f0205d0ffb637e5d2856297","due_date":null,"created_at":"2020-09-01T17:52:39Z","updated_at":"2020-09-02T05:10:25Z","closed_at":"2020-09-01T17:55:33Z","pin_order":0},{"id":4953,"url":"https://gitea.com/gitea/test_repo/pulls/11","number":11,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"add-xkcd-2199","body":"","labels":[{"id":3734,"name":"Valid","exclusive":false,"is_archived":false,"color":"53e917","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3734"}],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"open","draft":false,"is_locked":false,"comments":0,"review_comments":0,"additions":0,"deletions":0,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/11","diff_url":"https://gitea.com/gitea/test_repo/pulls/11.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/11.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"add-xkcd-2199","ref":"add-xkcd-2199","sha":"6bbd02573205288faa95d25e917812b2815a37e5","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"b6ab5d9ae000b579a5fff03f92c486da4ddf48b6","due_date":null,"created_at":"2020-09-01T17:52:28Z","updated_at":"2020-09-01T17:52:29Z","closed_at":null,"pin_order":0}]
+[{"id":4955,"url":"https://gitea.com/gitea/test_repo/pulls/13","number":13,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"extend","body":"","labels":[],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"open","draft":false,"is_locked":true,"comments":1,"review_comments":0,"additions":1,"deletions":0,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/13","diff_url":"https://gitea.com/gitea/test_repo/pulls/13.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/13.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"6543-patch-1","ref":"6543-patch-1","sha":"0ba7693bfd50d26df7f1b7414e937786c5efb05d","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"merge_base":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","due_date":null,"created_at":"2020-09-01T18:03:54Z","updated_at":"2020-09-01T18:04:26Z","closed_at":null,"pin_order":0},{"id":4954,"url":"https://gitea.com/gitea/test_repo/pulls/12","number":12,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"Dont Touch","body":"\r\nadd dont touch note","labels":[],"milestone":{"id":1301,"title":"V2 Finalize","description":"","state":"open","open_issues":1,"closed_issues":2,"created_at":"1970-01-01T00:00:00Z","updated_at":"2022-11-13T05:29:15Z","closed_at":null,"due_on":"2020-09-04T23:59:59Z"},"assignee":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"assignees":[{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"}],"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":0,"review_comments":3,"additions":1,"deletions":2,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/12","diff_url":"https://gitea.com/gitea/test_repo/pulls/12.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/12.patch","mergeable":true,"merged":true,"merged_at":"2020-09-01T17:55:34Z","merge_commit_sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"Add-Dont-Touch-Note","ref":"refs/pull/12/head","sha":"b6ab5d9ae000b579a5fff03f92c486da4ddf48b6","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"d9e165e4c7ab6b701f0205d0ffb637e5d2856297","due_date":null,"created_at":"2020-09-01T17:52:39Z","updated_at":"2020-09-02T05:10:25Z","closed_at":"2020-09-01T17:55:33Z","pin_order":0},{"id":4953,"url":"https://gitea.com/gitea/test_repo/pulls/11","number":11,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"add-xkcd-2199","body":"","labels":[{"id":3734,"name":"Valid","exclusive":false,"is_archived":false,"color":"53e917","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3734"}],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"open","draft":false,"is_locked":false,"comments":0,"review_comments":0,"additions":0,"deletions":0,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/11","diff_url":"https://gitea.com/gitea/test_repo/pulls/11.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/11.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"add-xkcd-2199","ref":"add-xkcd-2199","sha":"6bbd02573205288faa95d25e917812b2815a37e5","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"b6ab5d9ae000b579a5fff03f92c486da4ddf48b6","due_date":null,"created_at":"2020-09-01T17:52:28Z","updated_at":"2020-09-01T17:52:29Z","closed_at":null,"pin_order":0}]
diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=50&page=1&state=all b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=50&page=1&state=all
index 91b4c96fa2..e3a86c5b54 100644
--- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=50&page=1&state=all
+++ b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=50&page=1&state=all
@@ -6,4 +6,4 @@ X-Total-Count: 6
Content-Type: application/json;charset=utf-8
X-Frame-Options: SAMEORIGIN
-[{"id":4955,"url":"https://gitea.com/gitea/test_repo/pulls/13","number":13,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"extend","body":"","labels":[],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"open","draft":false,"is_locked":true,"comments":1,"review_comments":0,"additions":1,"deletions":0,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/13","diff_url":"https://gitea.com/gitea/test_repo/pulls/13.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/13.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"6543-patch-1","ref":"6543-patch-1","sha":"0ba7693bfd50d26df7f1b7414e937786c5efb05d","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"merge_base":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","due_date":null,"created_at":"2020-09-01T18:03:54Z","updated_at":"2020-09-01T18:04:26Z","closed_at":null,"pin_order":0},{"id":4954,"url":"https://gitea.com/gitea/test_repo/pulls/12","number":12,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"Dont Touch","body":"\r\nadd dont touch note","labels":[],"milestone":{"id":1301,"title":"V2 Finalize","description":"","state":"open","open_issues":1,"closed_issues":2,"created_at":"1970-01-01T00:00:00Z","updated_at":"2022-11-13T05:29:15Z","closed_at":null,"due_on":"2020-09-04T23:59:59Z"},"assignee":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://techknowlogick.com","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"assignees":[{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://techknowlogick.com","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"}],"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":0,"review_comments":3,"additions":1,"deletions":2,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/12","diff_url":"https://gitea.com/gitea/test_repo/pulls/12.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/12.patch","mergeable":true,"merged":true,"merged_at":"2020-09-01T17:55:34Z","merge_commit_sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"Add-Dont-Touch-Note","ref":"refs/pull/12/head","sha":"b6ab5d9ae000b579a5fff03f92c486da4ddf48b6","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"d9e165e4c7ab6b701f0205d0ffb637e5d2856297","due_date":null,"created_at":"2020-09-01T17:52:39Z","updated_at":"2020-09-02T05:10:25Z","closed_at":"2020-09-01T17:55:33Z","pin_order":0},{"id":4953,"url":"https://gitea.com/gitea/test_repo/pulls/11","number":11,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"add-xkcd-2199","body":"","labels":[{"id":3734,"name":"Valid","exclusive":false,"is_archived":false,"color":"53e917","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3734"}],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"open","draft":false,"is_locked":false,"comments":0,"review_comments":0,"additions":0,"deletions":0,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/11","diff_url":"https://gitea.com/gitea/test_repo/pulls/11.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/11.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"add-xkcd-2199","ref":"add-xkcd-2199","sha":"6bbd02573205288faa95d25e917812b2815a37e5","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"b6ab5d9ae000b579a5fff03f92c486da4ddf48b6","due_date":null,"created_at":"2020-09-01T17:52:28Z","updated_at":"2020-09-01T17:52:29Z","closed_at":null,"pin_order":0},{"id":4952,"url":"https://gitea.com/gitea/test_repo/pulls/8","number":8,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"add garbage for close pull","body":"well you'll see","labels":[],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":0,"review_comments":0,"additions":1,"deletions":2,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/8","diff_url":"https://gitea.com/gitea/test_repo/pulls/8.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/8.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"garbage-patch","ref":"refs/pull/8/head","sha":"a3427235639a33d2d749e76f076e7619acc75341","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"d9e165e4c7ab6b701f0205d0ffb637e5d2856297","due_date":null,"created_at":"2020-09-01T17:43:20Z","updated_at":"2020-09-01T17:48:41Z","closed_at":"2020-09-01T17:48:29Z","pin_order":0},{"id":4951,"url":"https://gitea.com/gitea/test_repo/pulls/7","number":7,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"Prepare for Release V1","body":"@techknowlogick you might have a look at it?\n\nclose #6","labels":[{"id":3735,"name":"Enhancement","exclusive":false,"is_archived":false,"color":"207de5","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3735"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":1,"review_comments":3,"additions":3,"deletions":1,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/7","diff_url":"https://gitea.com/gitea/test_repo/pulls/7.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/7.patch","mergeable":true,"merged":true,"merged_at":"2020-09-01T17:26:02Z","merge_commit_sha":"d9e165e4c7ab6b701f0205d0ffb637e5d2856297","merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"prepare-v1","ref":"refs/pull/7/head","sha":"187ece0cb6631e2858a6872e5733433bb3ca3b03","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"merge_base":"9396b697d905d1bcb5380befdf4d7e52c6a7ceb2","due_date":null,"created_at":"2020-09-01T16:10:04Z","updated_at":"2020-09-01T17:26:08Z","closed_at":"2020-09-01T17:26:02Z","pin_order":0},{"id":4949,"url":"https://gitea.com/gitea/test_repo/pulls/3","number":3,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"Readme: use '2'","body":"","labels":[{"id":3735,"name":"Enhancement","exclusive":false,"is_archived":false,"color":"207de5","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3735"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":0,"review_comments":0,"additions":1,"deletions":1,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/3","diff_url":"https://gitea.com/gitea/test_repo/pulls/3.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/3.patch","mergeable":true,"merged":true,"merged_at":"2020-09-01T00:27:14Z","merge_commit_sha":"9396b697d905d1bcb5380befdf4d7e52c6a7ceb2","merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"readme_nit","ref":"refs/pull/3/head","sha":"c273a16d4c3b2d745df690005dabe79cc6504ac3","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://about.gitea.com","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"merge_base":"a016fd754759b2cdfe5cad1cdf638c7e6b281940","due_date":null,"created_at":"2020-09-01T00:27:03Z","updated_at":"2020-09-01T15:54:30Z","closed_at":"2020-09-01T00:27:14Z","pin_order":0}]
+[{"id":4955,"url":"https://gitea.com/gitea/test_repo/pulls/13","number":13,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"extend","body":"","labels":[],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"open","draft":false,"is_locked":true,"comments":1,"review_comments":0,"additions":1,"deletions":0,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/13","diff_url":"https://gitea.com/gitea/test_repo/pulls/13.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/13.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"6543-patch-1","ref":"6543-patch-1","sha":"0ba7693bfd50d26df7f1b7414e937786c5efb05d","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"merge_base":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","due_date":null,"created_at":"2020-09-01T18:03:54Z","updated_at":"2020-09-01T18:04:26Z","closed_at":null,"pin_order":0},{"id":4954,"url":"https://gitea.com/gitea/test_repo/pulls/12","number":12,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"Dont Touch","body":"\r\nadd dont touch note","labels":[],"milestone":{"id":1301,"title":"V2 Finalize","description":"","state":"open","open_issues":1,"closed_issues":2,"created_at":"1970-01-01T00:00:00Z","updated_at":"2022-11-13T05:29:15Z","closed_at":null,"due_on":"2020-09-04T23:59:59Z"},"assignee":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"assignees":[{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"}],"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":0,"review_comments":3,"additions":1,"deletions":2,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/12","diff_url":"https://gitea.com/gitea/test_repo/pulls/12.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/12.patch","mergeable":true,"merged":true,"merged_at":"2020-09-01T17:55:34Z","merge_commit_sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"Add-Dont-Touch-Note","ref":"refs/pull/12/head","sha":"b6ab5d9ae000b579a5fff03f92c486da4ddf48b6","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"d9e165e4c7ab6b701f0205d0ffb637e5d2856297","due_date":null,"created_at":"2020-09-01T17:52:39Z","updated_at":"2020-09-02T05:10:25Z","closed_at":"2020-09-01T17:55:33Z","pin_order":0},{"id":4953,"url":"https://gitea.com/gitea/test_repo/pulls/11","number":11,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"add-xkcd-2199","body":"","labels":[{"id":3734,"name":"Valid","exclusive":false,"is_archived":false,"color":"53e917","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3734"}],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"open","draft":false,"is_locked":false,"comments":0,"review_comments":0,"additions":0,"deletions":0,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/11","diff_url":"https://gitea.com/gitea/test_repo/pulls/11.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/11.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"add-xkcd-2199","ref":"add-xkcd-2199","sha":"6bbd02573205288faa95d25e917812b2815a37e5","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"b6ab5d9ae000b579a5fff03f92c486da4ddf48b6","due_date":null,"created_at":"2020-09-01T17:52:28Z","updated_at":"2020-09-01T17:52:29Z","closed_at":null,"pin_order":0},{"id":4952,"url":"https://gitea.com/gitea/test_repo/pulls/8","number":8,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"add garbage for close pull","body":"well you'll see","labels":[],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":0,"review_comments":0,"additions":1,"deletions":2,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/8","diff_url":"https://gitea.com/gitea/test_repo/pulls/8.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/8.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"garbage-patch","ref":"refs/pull/8/head","sha":"a3427235639a33d2d749e76f076e7619acc75341","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"d9e165e4c7ab6b701f0205d0ffb637e5d2856297","due_date":null,"created_at":"2020-09-01T17:43:20Z","updated_at":"2020-09-01T17:48:41Z","closed_at":"2020-09-01T17:48:29Z","pin_order":0},{"id":4951,"url":"https://gitea.com/gitea/test_repo/pulls/7","number":7,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"Prepare for Release V1","body":"@techknowlogick you might have a look at it?\n\nclose #6","labels":[{"id":3735,"name":"Enhancement","exclusive":false,"is_archived":false,"color":"207de5","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3735"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":1,"review_comments":3,"additions":3,"deletions":1,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/7","diff_url":"https://gitea.com/gitea/test_repo/pulls/7.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/7.patch","mergeable":true,"merged":true,"merged_at":"2020-09-01T17:26:02Z","merge_commit_sha":"d9e165e4c7ab6b701f0205d0ffb637e5d2856297","merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"prepare-v1","ref":"refs/pull/7/head","sha":"187ece0cb6631e2858a6872e5733433bb3ca3b03","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"merge_base":"9396b697d905d1bcb5380befdf4d7e52c6a7ceb2","due_date":null,"created_at":"2020-09-01T16:10:04Z","updated_at":"2020-09-01T17:26:08Z","closed_at":"2020-09-01T17:26:02Z","pin_order":0},{"id":4949,"url":"https://gitea.com/gitea/test_repo/pulls/3","number":3,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"Readme: use '2'","body":"","labels":[{"id":3735,"name":"Enhancement","exclusive":false,"is_archived":false,"color":"207de5","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3735"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":0,"review_comments":0,"additions":1,"deletions":1,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/3","diff_url":"https://gitea.com/gitea/test_repo/pulls/3.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/3.patch","mergeable":true,"merged":true,"merged_at":"2020-09-01T00:27:14Z","merge_commit_sha":"9396b697d905d1bcb5380befdf4d7e52c6a7ceb2","merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"readme_nit","ref":"refs/pull/3/head","sha":"c273a16d4c3b2d745df690005dabe79cc6504ac3","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"merge_base":"a016fd754759b2cdfe5cad1cdf638c7e6b281940","due_date":null,"created_at":"2020-09-01T00:27:03Z","updated_at":"2020-09-01T15:54:30Z","closed_at":"2020-09-01T00:27:14Z","pin_order":0}]
diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Freleases%3Flimit=50&page=1 b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Freleases%3Flimit=50&page=1
index 13f5706fc1..bfd164ac2a 100644
--- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Freleases%3Flimit=50&page=1
+++ b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Freleases%3Flimit=50&page=1
@@ -6,4 +6,4 @@ Cache-Control: max-age=0, private, must-revalidate, no-transform
X-Content-Type-Options: nosniff
X-Total-Count: 2
-[{"id":167250,"tag_name":"v2-rc1","target_commitish":"master","name":"Second Release","body":"this repo has:\r\n* reactions\r\n* wiki\r\n* issues (open/closed)\r\n* pulls (open/closed/merged) (external/internal)\r\n* pull reviews\r\n* projects\r\n* milestones\r\n* labels\r\n* releases\r\n\r\nto test migration against","url":"https://gitea.com/api/v1/repos/gitea/test_repo/releases/167250","html_url":"https://gitea.com/gitea/test_repo/releases/tag/v2-rc1","tarball_url":"https://gitea.com/gitea/test_repo/archive/v2-rc1.tar.gz","zipball_url":"https://gitea.com/gitea/test_repo/archive/v2-rc1.zip","upload_url":"https://gitea.com/api/v1/repos/gitea/test_repo/releases/167250/assets","draft":false,"prerelease":true,"created_at":"2020-09-01T18:02:43Z","published_at":"2020-09-01T18:02:43Z","author":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"assets":[]},{"id":167249,"tag_name":"V1","target_commitish":"master","name":"First Release","body":"as title","url":"https://gitea.com/api/v1/repos/gitea/test_repo/releases/167249","html_url":"https://gitea.com/gitea/test_repo/releases/tag/V1","tarball_url":"https://gitea.com/gitea/test_repo/archive/V1.tar.gz","zipball_url":"https://gitea.com/gitea/test_repo/archive/V1.zip","upload_url":"https://gitea.com/api/v1/repos/gitea/test_repo/releases/167249/assets","draft":false,"prerelease":false,"created_at":"2020-09-01T17:30:32Z","published_at":"2020-09-01T17:30:32Z","author":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://mh.obermui.de","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"assets":[]}]
+[{"id":167250,"tag_name":"v2-rc1","target_commitish":"master","name":"Second Release","body":"this repo has:\r\n* reactions\r\n* wiki\r\n* issues (open/closed)\r\n* pulls (open/closed/merged) (external/internal)\r\n* pull reviews\r\n* projects\r\n* milestones\r\n* labels\r\n* releases\r\n\r\nto test migration against","url":"https://gitea.com/api/v1/repos/gitea/test_repo/releases/167250","html_url":"https://gitea.com/gitea/test_repo/releases/tag/v2-rc1","tarball_url":"https://gitea.com/gitea/test_repo/archive/v2-rc1.tar.gz","zipball_url":"https://gitea.com/gitea/test_repo/archive/v2-rc1.zip","upload_url":"https://gitea.com/api/v1/repos/gitea/test_repo/releases/167250/assets","draft":false,"prerelease":true,"created_at":"2020-09-01T18:02:43Z","published_at":"2020-09-01T18:02:43Z","author":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"assets":[]},{"id":167249,"tag_name":"V1","target_commitish":"master","name":"First Release","body":"as title","url":"https://gitea.com/api/v1/repos/gitea/test_repo/releases/167249","html_url":"https://gitea.com/gitea/test_repo/releases/tag/V1","tarball_url":"https://gitea.com/gitea/test_repo/archive/V1.tar.gz","zipball_url":"https://gitea.com/gitea/test_repo/archive/V1.zip","upload_url":"https://gitea.com/api/v1/repos/gitea/test_repo/releases/167249/assets","draft":false,"prerelease":false,"created_at":"2020-09-01T17:30:32Z","published_at":"2020-09-01T17:30:32Z","author":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"assets":[]}]
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo
index 261a153a32..78fde4d424 100644
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo
@@ -22,4 +22,4 @@ X-Ratelimit-Used: 72
X-Frame-Options: deny
Content-Security-Policy: default-src 'none'
-{"id":220672974,"node_id":"MDEwOlJlcG9zaXRvcnkyMjA2NzI5NzQ=","name":"test_repo","full_name":"go-gitea/test_repo","private":false,"owner":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/go-gitea/test_repo","description":"Test repository for testing migration from github to gitea","fork":false,"url":"https://api.github.com/repos/go-gitea/test_repo","forks_url":"https://api.github.com/repos/go-gitea/test_repo/forks","keys_url":"https://api.github.com/repos/go-gitea/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/go-gitea/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/go-gitea/test_repo/teams","hooks_url":"https://api.github.com/repos/go-gitea/test_repo/hooks","issue_events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/go-gitea/test_repo/events","assignees_url":"https://api.github.com/repos/go-gitea/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/go-gitea/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/go-gitea/test_repo/tags","blobs_url":"https://api.github.com/repos/go-gitea/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/go-gitea/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/go-gitea/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/go-gitea/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/go-gitea/test_repo/languages","stargazers_url":"https://api.github.com/repos/go-gitea/test_repo/stargazers","contributors_url":"https://api.github.com/repos/go-gitea/test_repo/contributors","subscribers_url":"https://api.github.com/repos/go-gitea/test_repo/subscribers","subscription_url":"https://api.github.com/repos/go-gitea/test_repo/subscription","commits_url":"https://api.github.com/repos/go-gitea/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/go-gitea/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/go-gitea/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/go-gitea/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/go-gitea/test_repo/merges","archive_url":"https://api.github.com/repos/go-gitea/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/go-gitea/test_repo/downloads","issues_url":"https://api.github.com/repos/go-gitea/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/go-gitea/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/go-gitea/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/go-gitea/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/go-gitea/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/go-gitea/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/go-gitea/test_repo/deployments","created_at":"2019-11-09T16:49:20Z","updated_at":"2023-03-02T14:02:26Z","pushed_at":"2019-11-12T21:54:19Z","git_url":"git://github.com/go-gitea/test_repo.git","ssh_url":"git@github.com:go-gitea/test_repo.git","clone_url":"https://github.com/go-gitea/test_repo.git","svn_url":"https://github.com/go-gitea/test_repo","homepage":null,"size":1,"stargazers_count":3,"watchers_count":3,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["gitea"],"visibility":"public","forks":6,"open_issues":2,"watchers":3,"default_branch":"master","permissions":{"admin":false,"maintain":false,"push":false,"triage":false,"pull":true},"temp_clone_token":"","custom_properties":{},"organization":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"network_count":6,"subscribers_count":6}
\ No newline at end of file
+{"id":220672974,"node_id":"MDEwOlJlcG9zaXRvcnkyMjA2NzI5NzQ=","name":"test_repo","full_name":"go-gitea/test_repo","private":false,"owner":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/go-gitea/test_repo","description":"Test repository for testing migration from github to gitea","fork":false,"url":"https://api.github.com/repos/go-gitea/test_repo","forks_url":"https://api.github.com/repos/go-gitea/test_repo/forks","keys_url":"https://api.github.com/repos/go-gitea/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/go-gitea/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/go-gitea/test_repo/teams","hooks_url":"https://api.github.com/repos/go-gitea/test_repo/hooks","issue_events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/go-gitea/test_repo/events","assignees_url":"https://api.github.com/repos/go-gitea/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/go-gitea/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/go-gitea/test_repo/tags","blobs_url":"https://api.github.com/repos/go-gitea/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/go-gitea/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/go-gitea/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/go-gitea/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/go-gitea/test_repo/languages","stargazers_url":"https://api.github.com/repos/go-gitea/test_repo/stargazers","contributors_url":"https://api.github.com/repos/go-gitea/test_repo/contributors","subscribers_url":"https://api.github.com/repos/go-gitea/test_repo/subscribers","subscription_url":"https://api.github.com/repos/go-gitea/test_repo/subscription","commits_url":"https://api.github.com/repos/go-gitea/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/go-gitea/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/go-gitea/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/go-gitea/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/go-gitea/test_repo/merges","archive_url":"https://api.github.com/repos/go-gitea/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/go-gitea/test_repo/downloads","issues_url":"https://api.github.com/repos/go-gitea/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/go-gitea/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/go-gitea/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/go-gitea/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/go-gitea/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/go-gitea/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/go-gitea/test_repo/deployments","created_at":"2019-11-09T16:49:20Z","updated_at":"2023-03-02T14:02:26Z","pushed_at":"2019-11-12T21:54:19Z","git_url":"git://github.com/go-gitea/test_repo.git","ssh_url":"git@github.com:go-gitea/test_repo.git","clone_url":"https://github.com/go-gitea/test_repo.git","svn_url":"https://github.com/go-gitea/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":1,"stargazers_count":3,"watchers_count":3,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["gitea"],"visibility":"public","forks":6,"open_issues":2,"watchers":3,"default_branch":"master","permissions":{"admin":false,"maintain":false,"push":false,"triage":false,"pull":true},"temp_clone_token":"","custom_properties":{},"organization":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"network_count":6,"subscribers_count":6}
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%3Fdirection=asc&page=1&per_page=2&sort=created&state=all b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%3Fdirection=asc&page=1&per_page=2&sort=created&state=all
index ff05f4da0f..30883cc283 100644
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%3Fdirection=asc&page=1&per_page=2&sort=created&state=all
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%3Fdirection=asc&page=1&per_page=2&sort=created&state=all
@@ -21,4 +21,4 @@ Etag: W/"fed37ab8ce0b78e713030ff3e601f540b7f71243ab788b477f6885119bd691c5"
X-Accepted-Oauth-Scopes:
X-Content-Type-Options: nosniff
-[{"url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3","id":340118745,"node_id":"MDExOlB1bGxSZXF1ZXN0MzQwMTE4NzQ1","html_url":"https://github.com/go-gitea/test_repo/pull/3","diff_url":"https://github.com/go-gitea/test_repo/pull/3.diff","patch_url":"https://github.com/go-gitea/test_repo/pull/3.patch","issue_url":"https://api.github.com/repos/go-gitea/test_repo/issues/3","number":3,"state":"closed","locked":false,"title":"Update README.md","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"add warning to readme","created_at":"2019-11-12T21:21:43Z","updated_at":"2019-11-12T21:39:28Z","closed_at":"2019-11-12T21:39:27Z","merged_at":"2019-11-12T21:39:27Z","merge_commit_sha":"f32b0a9dfd09a60f616f29158f772cedd89942d2","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1667254254,"node_id":"MDU6TGFiZWwxNjY3MjU0MjU0","url":"https://api.github.com/repos/go-gitea/test_repo/labels/documentation","name":"documentation","color":"0075ca","default":true,"description":"Improvements or additions to documentation"}],"milestone":{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2","html_url":"https://github.com/go-gitea/test_repo/milestone/2","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2/labels","id":4839942,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0Mg==","number":2,"title":"1.1.0","description":"Milestone 1.1.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":0,"closed_issues":2,"state":"closed","created_at":"2019-11-12T19:37:25Z","updated_at":"2019-11-12T21:39:27Z","due_on":"2019-11-12T08:00:00Z","closed_at":"2019-11-12T19:45:46Z"},"draft":false,"commits_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/commits","review_comments_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/comments","review_comment_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/issues/3/comments","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/076160cf0b039f13e5eff19619932d181269414b","head":{"label":"mrsdizzie:master","ref":"master","sha":"076160cf0b039f13e5eff19619932d181269414b","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"repo":{"id":221313794,"node_id":"MDEwOlJlcG9zaXRvcnkyMjEzMTM3OTQ=","name":"test_repo","full_name":"mrsdizzie/test_repo","private":false,"owner":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"html_url":"https://github.com/mrsdizzie/test_repo","description":"Test repository for testing migration from github to gitea","fork":true,"url":"https://api.github.com/repos/mrsdizzie/test_repo","forks_url":"https://api.github.com/repos/mrsdizzie/test_repo/forks","keys_url":"https://api.github.com/repos/mrsdizzie/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mrsdizzie/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mrsdizzie/test_repo/teams","hooks_url":"https://api.github.com/repos/mrsdizzie/test_repo/hooks","issue_events_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/mrsdizzie/test_repo/events","assignees_url":"https://api.github.com/repos/mrsdizzie/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/mrsdizzie/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/tags","blobs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mrsdizzie/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/mrsdizzie/test_repo/languages","stargazers_url":"https://api.github.com/repos/mrsdizzie/test_repo/stargazers","contributors_url":"https://api.github.com/repos/mrsdizzie/test_repo/contributors","subscribers_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscribers","subscription_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscription","commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/mrsdizzie/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/mrsdizzie/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/mrsdizzie/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mrsdizzie/test_repo/merges","archive_url":"https://api.github.com/repos/mrsdizzie/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mrsdizzie/test_repo/downloads","issues_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/mrsdizzie/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/mrsdizzie/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/mrsdizzie/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mrsdizzie/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/mrsdizzie/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/mrsdizzie/test_repo/deployments","created_at":"2019-11-12T21:17:42Z","updated_at":"2019-11-12T21:18:46Z","pushed_at":"2019-11-12T21:53:39Z","git_url":"git://github.com/mrsdizzie/test_repo.git","ssh_url":"git@github.com:mrsdizzie/test_repo.git","clone_url":"https://github.com/mrsdizzie/test_repo.git","svn_url":"https://github.com/mrsdizzie/test_repo","homepage":null,"size":3,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":[],"visibility":"public","forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"go-gitea:master","ref":"master","sha":"72866af952e98d02a73003501836074b286a78f6","user":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":220672974,"node_id":"MDEwOlJlcG9zaXRvcnkyMjA2NzI5NzQ=","name":"test_repo","full_name":"go-gitea/test_repo","private":false,"owner":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/go-gitea/test_repo","description":"Test repository for testing migration from github to gitea","fork":false,"url":"https://api.github.com/repos/go-gitea/test_repo","forks_url":"https://api.github.com/repos/go-gitea/test_repo/forks","keys_url":"https://api.github.com/repos/go-gitea/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/go-gitea/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/go-gitea/test_repo/teams","hooks_url":"https://api.github.com/repos/go-gitea/test_repo/hooks","issue_events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/go-gitea/test_repo/events","assignees_url":"https://api.github.com/repos/go-gitea/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/go-gitea/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/go-gitea/test_repo/tags","blobs_url":"https://api.github.com/repos/go-gitea/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/go-gitea/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/go-gitea/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/go-gitea/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/go-gitea/test_repo/languages","stargazers_url":"https://api.github.com/repos/go-gitea/test_repo/stargazers","contributors_url":"https://api.github.com/repos/go-gitea/test_repo/contributors","subscribers_url":"https://api.github.com/repos/go-gitea/test_repo/subscribers","subscription_url":"https://api.github.com/repos/go-gitea/test_repo/subscription","commits_url":"https://api.github.com/repos/go-gitea/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/go-gitea/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/go-gitea/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/go-gitea/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/go-gitea/test_repo/merges","archive_url":"https://api.github.com/repos/go-gitea/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/go-gitea/test_repo/downloads","issues_url":"https://api.github.com/repos/go-gitea/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/go-gitea/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/go-gitea/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/go-gitea/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/go-gitea/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/go-gitea/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/go-gitea/test_repo/deployments","created_at":"2019-11-09T16:49:20Z","updated_at":"2023-03-02T14:02:26Z","pushed_at":"2019-11-12T21:54:19Z","git_url":"git://github.com/go-gitea/test_repo.git","ssh_url":"git@github.com:go-gitea/test_repo.git","clone_url":"https://github.com/go-gitea/test_repo.git","svn_url":"https://github.com/go-gitea/test_repo","homepage":null,"size":1,"stargazers_count":3,"watchers_count":3,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["gitea"],"visibility":"public","forks":6,"open_issues":2,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3"},"html":{"href":"https://github.com/go-gitea/test_repo/pull/3"},"issue":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/3"},"comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/3/comments"},"review_comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/comments"},"review_comment":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/commits"},"statuses":{"href":"https://api.github.com/repos/go-gitea/test_repo/statuses/076160cf0b039f13e5eff19619932d181269414b"}},"author_association":"MEMBER","auto_merge":null,"active_lock_reason":null},{"url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","id":340131577,"node_id":"MDExOlB1bGxSZXF1ZXN0MzQwMTMxNTc3","html_url":"https://github.com/go-gitea/test_repo/pull/4","diff_url":"https://github.com/go-gitea/test_repo/pull/4.diff","patch_url":"https://github.com/go-gitea/test_repo/pull/4.patch","issue_url":"https://api.github.com/repos/go-gitea/test_repo/issues/4","number":4,"state":"open","locked":false,"title":"Test branch","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"do not merge this PR","created_at":"2019-11-12T21:54:18Z","updated_at":"2020-01-04T11:30:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"565d1208f5fffdc1c5ae1a2436491eb9a5e4ebae","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1667254252,"node_id":"MDU6TGFiZWwxNjY3MjU0MjUy","url":"https://api.github.com/repos/go-gitea/test_repo/labels/bug","name":"bug","color":"d73a4a","default":true,"description":"Something isn't working"}],"milestone":{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1","html_url":"https://github.com/go-gitea/test_repo/milestone/1","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1/labels","id":4839941,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0MQ==","number":1,"title":"1.0.0","description":"Milestone 1.0.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":1,"state":"closed","created_at":"2019-11-12T19:37:08Z","updated_at":"2019-11-12T21:56:17Z","due_on":"2019-11-11T08:00:00Z","closed_at":"2019-11-12T19:45:49Z"},"draft":false,"commits_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/commits","review_comments_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/comments","review_comment_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/issues/4/comments","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/2be9101c543658591222acbee3eb799edfc3853d","head":{"label":"mrsdizzie:test-branch","ref":"test-branch","sha":"2be9101c543658591222acbee3eb799edfc3853d","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"repo":{"id":221313794,"node_id":"MDEwOlJlcG9zaXRvcnkyMjEzMTM3OTQ=","name":"test_repo","full_name":"mrsdizzie/test_repo","private":false,"owner":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"html_url":"https://github.com/mrsdizzie/test_repo","description":"Test repository for testing migration from github to gitea","fork":true,"url":"https://api.github.com/repos/mrsdizzie/test_repo","forks_url":"https://api.github.com/repos/mrsdizzie/test_repo/forks","keys_url":"https://api.github.com/repos/mrsdizzie/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mrsdizzie/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mrsdizzie/test_repo/teams","hooks_url":"https://api.github.com/repos/mrsdizzie/test_repo/hooks","issue_events_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/mrsdizzie/test_repo/events","assignees_url":"https://api.github.com/repos/mrsdizzie/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/mrsdizzie/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/tags","blobs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mrsdizzie/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/mrsdizzie/test_repo/languages","stargazers_url":"https://api.github.com/repos/mrsdizzie/test_repo/stargazers","contributors_url":"https://api.github.com/repos/mrsdizzie/test_repo/contributors","subscribers_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscribers","subscription_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscription","commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/mrsdizzie/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/mrsdizzie/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/mrsdizzie/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mrsdizzie/test_repo/merges","archive_url":"https://api.github.com/repos/mrsdizzie/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mrsdizzie/test_repo/downloads","issues_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/mrsdizzie/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/mrsdizzie/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/mrsdizzie/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mrsdizzie/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/mrsdizzie/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/mrsdizzie/test_repo/deployments","created_at":"2019-11-12T21:17:42Z","updated_at":"2019-11-12T21:18:46Z","pushed_at":"2019-11-12T21:53:39Z","git_url":"git://github.com/mrsdizzie/test_repo.git","ssh_url":"git@github.com:mrsdizzie/test_repo.git","clone_url":"https://github.com/mrsdizzie/test_repo.git","svn_url":"https://github.com/mrsdizzie/test_repo","homepage":null,"size":3,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":[],"visibility":"public","forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"go-gitea:master","ref":"master","sha":"f32b0a9dfd09a60f616f29158f772cedd89942d2","user":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":220672974,"node_id":"MDEwOlJlcG9zaXRvcnkyMjA2NzI5NzQ=","name":"test_repo","full_name":"go-gitea/test_repo","private":false,"owner":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/go-gitea/test_repo","description":"Test repository for testing migration from github to gitea","fork":false,"url":"https://api.github.com/repos/go-gitea/test_repo","forks_url":"https://api.github.com/repos/go-gitea/test_repo/forks","keys_url":"https://api.github.com/repos/go-gitea/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/go-gitea/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/go-gitea/test_repo/teams","hooks_url":"https://api.github.com/repos/go-gitea/test_repo/hooks","issue_events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/go-gitea/test_repo/events","assignees_url":"https://api.github.com/repos/go-gitea/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/go-gitea/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/go-gitea/test_repo/tags","blobs_url":"https://api.github.com/repos/go-gitea/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/go-gitea/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/go-gitea/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/go-gitea/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/go-gitea/test_repo/languages","stargazers_url":"https://api.github.com/repos/go-gitea/test_repo/stargazers","contributors_url":"https://api.github.com/repos/go-gitea/test_repo/contributors","subscribers_url":"https://api.github.com/repos/go-gitea/test_repo/subscribers","subscription_url":"https://api.github.com/repos/go-gitea/test_repo/subscription","commits_url":"https://api.github.com/repos/go-gitea/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/go-gitea/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/go-gitea/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/go-gitea/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/go-gitea/test_repo/merges","archive_url":"https://api.github.com/repos/go-gitea/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/go-gitea/test_repo/downloads","issues_url":"https://api.github.com/repos/go-gitea/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/go-gitea/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/go-gitea/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/go-gitea/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/go-gitea/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/go-gitea/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/go-gitea/test_repo/deployments","created_at":"2019-11-09T16:49:20Z","updated_at":"2023-03-02T14:02:26Z","pushed_at":"2019-11-12T21:54:19Z","git_url":"git://github.com/go-gitea/test_repo.git","ssh_url":"git@github.com:go-gitea/test_repo.git","clone_url":"https://github.com/go-gitea/test_repo.git","svn_url":"https://github.com/go-gitea/test_repo","homepage":null,"size":1,"stargazers_count":3,"watchers_count":3,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["gitea"],"visibility":"public","forks":6,"open_issues":2,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"},"html":{"href":"https://github.com/go-gitea/test_repo/pull/4"},"issue":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/4"},"comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/go-gitea/test_repo/statuses/2be9101c543658591222acbee3eb799edfc3853d"}},"author_association":"MEMBER","auto_merge":null,"active_lock_reason":null}]
\ No newline at end of file
+[{"url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3","id":340118745,"node_id":"MDExOlB1bGxSZXF1ZXN0MzQwMTE4NzQ1","html_url":"https://github.com/go-gitea/test_repo/pull/3","diff_url":"https://github.com/go-gitea/test_repo/pull/3.diff","patch_url":"https://github.com/go-gitea/test_repo/pull/3.patch","issue_url":"https://api.github.com/repos/go-gitea/test_repo/issues/3","number":3,"state":"closed","locked":false,"title":"Update README.md","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"add warning to readme","created_at":"2019-11-12T21:21:43Z","updated_at":"2019-11-12T21:39:28Z","closed_at":"2019-11-12T21:39:27Z","merged_at":"2019-11-12T21:39:27Z","merge_commit_sha":"f32b0a9dfd09a60f616f29158f772cedd89942d2","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1667254254,"node_id":"MDU6TGFiZWwxNjY3MjU0MjU0","url":"https://api.github.com/repos/go-gitea/test_repo/labels/documentation","name":"documentation","color":"0075ca","default":true,"description":"Improvements or additions to documentation"}],"milestone":{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2","html_url":"https://github.com/go-gitea/test_repo/milestone/2","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2/labels","id":4839942,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0Mg==","number":2,"title":"1.1.0","description":"Milestone 1.1.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":0,"closed_issues":2,"state":"closed","created_at":"2019-11-12T19:37:25Z","updated_at":"2019-11-12T21:39:27Z","due_on":"2019-11-12T08:00:00Z","closed_at":"2019-11-12T19:45:46Z"},"draft":false,"commits_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/commits","review_comments_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/comments","review_comment_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/issues/3/comments","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/076160cf0b039f13e5eff19619932d181269414b","head":{"label":"mrsdizzie:master","ref":"master","sha":"076160cf0b039f13e5eff19619932d181269414b","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"repo":{"id":221313794,"node_id":"MDEwOlJlcG9zaXRvcnkyMjEzMTM3OTQ=","name":"test_repo","full_name":"mrsdizzie/test_repo","private":false,"owner":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"html_url":"https://github.com/mrsdizzie/test_repo","description":"Test repository for testing migration from github to gitea","fork":true,"url":"https://api.github.com/repos/mrsdizzie/test_repo","forks_url":"https://api.github.com/repos/mrsdizzie/test_repo/forks","keys_url":"https://api.github.com/repos/mrsdizzie/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mrsdizzie/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mrsdizzie/test_repo/teams","hooks_url":"https://api.github.com/repos/mrsdizzie/test_repo/hooks","issue_events_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/mrsdizzie/test_repo/events","assignees_url":"https://api.github.com/repos/mrsdizzie/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/mrsdizzie/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/tags","blobs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mrsdizzie/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/mrsdizzie/test_repo/languages","stargazers_url":"https://api.github.com/repos/mrsdizzie/test_repo/stargazers","contributors_url":"https://api.github.com/repos/mrsdizzie/test_repo/contributors","subscribers_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscribers","subscription_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscription","commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/mrsdizzie/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/mrsdizzie/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/mrsdizzie/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mrsdizzie/test_repo/merges","archive_url":"https://api.github.com/repos/mrsdizzie/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mrsdizzie/test_repo/downloads","issues_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/mrsdizzie/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/mrsdizzie/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/mrsdizzie/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mrsdizzie/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/mrsdizzie/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/mrsdizzie/test_repo/deployments","created_at":"2019-11-12T21:17:42Z","updated_at":"2019-11-12T21:18:46Z","pushed_at":"2019-11-12T21:53:39Z","git_url":"git://github.com/mrsdizzie/test_repo.git","ssh_url":"git@github.com:mrsdizzie/test_repo.git","clone_url":"https://github.com/mrsdizzie/test_repo.git","svn_url":"https://github.com/mrsdizzie/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":3,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":[],"visibility":"public","forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"go-gitea:master","ref":"master","sha":"72866af952e98d02a73003501836074b286a78f6","user":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":220672974,"node_id":"MDEwOlJlcG9zaXRvcnkyMjA2NzI5NzQ=","name":"test_repo","full_name":"go-gitea/test_repo","private":false,"owner":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/go-gitea/test_repo","description":"Test repository for testing migration from github to gitea","fork":false,"url":"https://api.github.com/repos/go-gitea/test_repo","forks_url":"https://api.github.com/repos/go-gitea/test_repo/forks","keys_url":"https://api.github.com/repos/go-gitea/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/go-gitea/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/go-gitea/test_repo/teams","hooks_url":"https://api.github.com/repos/go-gitea/test_repo/hooks","issue_events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/go-gitea/test_repo/events","assignees_url":"https://api.github.com/repos/go-gitea/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/go-gitea/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/go-gitea/test_repo/tags","blobs_url":"https://api.github.com/repos/go-gitea/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/go-gitea/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/go-gitea/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/go-gitea/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/go-gitea/test_repo/languages","stargazers_url":"https://api.github.com/repos/go-gitea/test_repo/stargazers","contributors_url":"https://api.github.com/repos/go-gitea/test_repo/contributors","subscribers_url":"https://api.github.com/repos/go-gitea/test_repo/subscribers","subscription_url":"https://api.github.com/repos/go-gitea/test_repo/subscription","commits_url":"https://api.github.com/repos/go-gitea/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/go-gitea/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/go-gitea/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/go-gitea/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/go-gitea/test_repo/merges","archive_url":"https://api.github.com/repos/go-gitea/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/go-gitea/test_repo/downloads","issues_url":"https://api.github.com/repos/go-gitea/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/go-gitea/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/go-gitea/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/go-gitea/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/go-gitea/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/go-gitea/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/go-gitea/test_repo/deployments","created_at":"2019-11-09T16:49:20Z","updated_at":"2023-03-02T14:02:26Z","pushed_at":"2019-11-12T21:54:19Z","git_url":"git://github.com/go-gitea/test_repo.git","ssh_url":"git@github.com:go-gitea/test_repo.git","clone_url":"https://github.com/go-gitea/test_repo.git","svn_url":"https://github.com/go-gitea/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":1,"stargazers_count":3,"watchers_count":3,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["gitea"],"visibility":"public","forks":6,"open_issues":2,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3"},"html":{"href":"https://github.com/go-gitea/test_repo/pull/3"},"issue":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/3"},"comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/3/comments"},"review_comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/comments"},"review_comment":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/commits"},"statuses":{"href":"https://api.github.com/repos/go-gitea/test_repo/statuses/076160cf0b039f13e5eff19619932d181269414b"}},"author_association":"MEMBER","auto_merge":null,"active_lock_reason":null},{"url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","id":340131577,"node_id":"MDExOlB1bGxSZXF1ZXN0MzQwMTMxNTc3","html_url":"https://github.com/go-gitea/test_repo/pull/4","diff_url":"https://github.com/go-gitea/test_repo/pull/4.diff","patch_url":"https://github.com/go-gitea/test_repo/pull/4.patch","issue_url":"https://api.github.com/repos/go-gitea/test_repo/issues/4","number":4,"state":"open","locked":false,"title":"Test branch","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"do not merge this PR","created_at":"2019-11-12T21:54:18Z","updated_at":"2020-01-04T11:30:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"565d1208f5fffdc1c5ae1a2436491eb9a5e4ebae","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1667254252,"node_id":"MDU6TGFiZWwxNjY3MjU0MjUy","url":"https://api.github.com/repos/go-gitea/test_repo/labels/bug","name":"bug","color":"d73a4a","default":true,"description":"Something isn't working"}],"milestone":{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1","html_url":"https://github.com/go-gitea/test_repo/milestone/1","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1/labels","id":4839941,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0MQ==","number":1,"title":"1.0.0","description":"Milestone 1.0.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":1,"state":"closed","created_at":"2019-11-12T19:37:08Z","updated_at":"2019-11-12T21:56:17Z","due_on":"2019-11-11T08:00:00Z","closed_at":"2019-11-12T19:45:49Z"},"draft":false,"commits_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/commits","review_comments_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/comments","review_comment_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/issues/4/comments","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/2be9101c543658591222acbee3eb799edfc3853d","head":{"label":"mrsdizzie:test-branch","ref":"test-branch","sha":"2be9101c543658591222acbee3eb799edfc3853d","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"repo":{"id":221313794,"node_id":"MDEwOlJlcG9zaXRvcnkyMjEzMTM3OTQ=","name":"test_repo","full_name":"mrsdizzie/test_repo","private":false,"owner":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"html_url":"https://github.com/mrsdizzie/test_repo","description":"Test repository for testing migration from github to gitea","fork":true,"url":"https://api.github.com/repos/mrsdizzie/test_repo","forks_url":"https://api.github.com/repos/mrsdizzie/test_repo/forks","keys_url":"https://api.github.com/repos/mrsdizzie/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mrsdizzie/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mrsdizzie/test_repo/teams","hooks_url":"https://api.github.com/repos/mrsdizzie/test_repo/hooks","issue_events_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/mrsdizzie/test_repo/events","assignees_url":"https://api.github.com/repos/mrsdizzie/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/mrsdizzie/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/tags","blobs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mrsdizzie/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/mrsdizzie/test_repo/languages","stargazers_url":"https://api.github.com/repos/mrsdizzie/test_repo/stargazers","contributors_url":"https://api.github.com/repos/mrsdizzie/test_repo/contributors","subscribers_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscribers","subscription_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscription","commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/mrsdizzie/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/mrsdizzie/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/mrsdizzie/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mrsdizzie/test_repo/merges","archive_url":"https://api.github.com/repos/mrsdizzie/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mrsdizzie/test_repo/downloads","issues_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/mrsdizzie/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/mrsdizzie/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/mrsdizzie/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mrsdizzie/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/mrsdizzie/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/mrsdizzie/test_repo/deployments","created_at":"2019-11-12T21:17:42Z","updated_at":"2019-11-12T21:18:46Z","pushed_at":"2019-11-12T21:53:39Z","git_url":"git://github.com/mrsdizzie/test_repo.git","ssh_url":"git@github.com:mrsdizzie/test_repo.git","clone_url":"https://github.com/mrsdizzie/test_repo.git","svn_url":"https://github.com/mrsdizzie/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":3,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":[],"visibility":"public","forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"go-gitea:master","ref":"master","sha":"f32b0a9dfd09a60f616f29158f772cedd89942d2","user":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":220672974,"node_id":"MDEwOlJlcG9zaXRvcnkyMjA2NzI5NzQ=","name":"test_repo","full_name":"go-gitea/test_repo","private":false,"owner":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/go-gitea/test_repo","description":"Test repository for testing migration from github to gitea","fork":false,"url":"https://api.github.com/repos/go-gitea/test_repo","forks_url":"https://api.github.com/repos/go-gitea/test_repo/forks","keys_url":"https://api.github.com/repos/go-gitea/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/go-gitea/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/go-gitea/test_repo/teams","hooks_url":"https://api.github.com/repos/go-gitea/test_repo/hooks","issue_events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/go-gitea/test_repo/events","assignees_url":"https://api.github.com/repos/go-gitea/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/go-gitea/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/go-gitea/test_repo/tags","blobs_url":"https://api.github.com/repos/go-gitea/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/go-gitea/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/go-gitea/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/go-gitea/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/go-gitea/test_repo/languages","stargazers_url":"https://api.github.com/repos/go-gitea/test_repo/stargazers","contributors_url":"https://api.github.com/repos/go-gitea/test_repo/contributors","subscribers_url":"https://api.github.com/repos/go-gitea/test_repo/subscribers","subscription_url":"https://api.github.com/repos/go-gitea/test_repo/subscription","commits_url":"https://api.github.com/repos/go-gitea/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/go-gitea/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/go-gitea/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/go-gitea/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/go-gitea/test_repo/merges","archive_url":"https://api.github.com/repos/go-gitea/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/go-gitea/test_repo/downloads","issues_url":"https://api.github.com/repos/go-gitea/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/go-gitea/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/go-gitea/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/go-gitea/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/go-gitea/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/go-gitea/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/go-gitea/test_repo/deployments","created_at":"2019-11-09T16:49:20Z","updated_at":"2023-03-02T14:02:26Z","pushed_at":"2019-11-12T21:54:19Z","git_url":"git://github.com/go-gitea/test_repo.git","ssh_url":"git@github.com:go-gitea/test_repo.git","clone_url":"https://github.com/go-gitea/test_repo.git","svn_url":"https://github.com/go-gitea/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":1,"stargazers_count":3,"watchers_count":3,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["gitea"],"visibility":"public","forks":6,"open_issues":2,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"},"html":{"href":"https://github.com/go-gitea/test_repo/pull/4"},"issue":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/4"},"comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/go-gitea/test_repo/statuses/2be9101c543658591222acbee3eb799edfc3853d"}},"author_association":"MEMBER","auto_merge":null,"active_lock_reason":null}]
diff --git a/services/mirror/mirror_pull.go b/services/mirror/mirror_pull.go
index 2d128919f9..bce8386f54 100644
--- a/services/mirror/mirror_pull.go
+++ b/services/mirror/mirror_pull.go
@@ -40,7 +40,7 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error
repoPath := m.GetRepository(ctx).RepoPath()
// Remove old remote
_, _, err = git.NewCommand(ctx, "remote", "rm").AddDynamicArguments(remoteName).RunStdString(&git.RunOpts{Dir: repoPath})
- if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
+ if err != nil && !git.IsRemoteNotExistError(err) {
return err
}
@@ -51,7 +51,7 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error
cmd.SetDescription(fmt.Sprintf("remote add %s --mirror=fetch %s [repo_path: %s]", remoteName, addr, repoPath))
}
_, _, err = cmd.RunStdString(&git.RunOpts{Dir: repoPath})
- if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
+ if err != nil && !git.IsRemoteNotExistError(err) {
return err
}
@@ -60,7 +60,7 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error
wikiRemotePath := repo_module.WikiRemoteURL(ctx, addr)
// Remove old remote of wiki
_, _, err = git.NewCommand(ctx, "remote", "rm").AddDynamicArguments(remoteName).RunStdString(&git.RunOpts{Dir: wikiPath})
- if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
+ if err != nil && !git.IsRemoteNotExistError(err) {
return err
}
@@ -71,7 +71,7 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error
cmd.SetDescription(fmt.Sprintf("remote add %s --mirror=fetch %s [repo_path: %s]", remoteName, wikiRemotePath, wikiPath))
}
_, _, err = cmd.RunStdString(&git.RunOpts{Dir: wikiPath})
- if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
+ if err != nil && !git.IsRemoteNotExistError(err) {
return err
}
}
@@ -174,6 +174,7 @@ func parseRemoteUpdateOutput(output, remoteName string) []*mirrorSyncResult {
newCommitID: shas[1],
})
+ case strings.HasPrefix(lines[i], " * [new ref]"): // new reference - nothing to do
default:
log.Warn("parseRemoteUpdateOutput: unexpected update line %q", lines[i])
}
diff --git a/services/mirror/mirror_push.go b/services/mirror/mirror_push.go
index 3a9644c3a1..4b1d7718b6 100644
--- a/services/mirror/mirror_push.go
+++ b/services/mirror/mirror_push.go
@@ -172,7 +172,7 @@ func runPushSync(ctx context.Context, m *repo_model.PushMirror) error {
// OpenSSH isn't very intuitive when you want to specify a specific keypair.
// Therefore, we need to create a temporary file that stores the private key, so that OpenSSH can use it.
- // We delete the the temporary file afterwards.
+ // We delete the temporary file afterwards.
privateKeyPath := ""
if m.PublicKey != "" {
f, err := os.CreateTemp(os.TempDir(), m.RemoteName)
diff --git a/services/mirror/mirror_test.go b/services/mirror/mirror_test.go
index 8ad524b608..860470522e 100644
--- a/services/mirror/mirror_test.go
+++ b/services/mirror/mirror_test.go
@@ -17,7 +17,9 @@ func Test_parseRemoteUpdateOutput(t *testing.T) {
- [deleted] (none) -> tag1
+ f895a1e...957a993 test2 -> origin/test2 (forced update)
957a993..a87ba5f test3 -> origin/test3
-`
+ * [new ref] refs/pull/27/merge -> refs/pull/27/merge
+ * [new ref] refs/pull/516/head -> refs/pull/516/head
+ `
results := parseRemoteUpdateOutput(output, "origin")
assert.Len(t, results, 6)
assert.EqualValues(t, "refs/tags/v0.1.8", results[0].refName.String())
diff --git a/services/packages/alt/repository.go b/services/packages/alt/repository.go
new file mode 100644
index 0000000000..7b7951eebb
--- /dev/null
+++ b/services/packages/alt/repository.go
@@ -0,0 +1,937 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package alt
+
+import (
+ "bytes"
+ "context"
+ "crypto/sha256"
+ "encoding/binary"
+ "encoding/hex"
+ "fmt"
+ "io"
+ "path"
+ "time"
+
+ packages_model "code.gitea.io/gitea/models/packages"
+ alt_model "code.gitea.io/gitea/models/packages/alt"
+ user_model "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/container"
+ "code.gitea.io/gitea/modules/json"
+ packages_module "code.gitea.io/gitea/modules/packages"
+ rpm_module "code.gitea.io/gitea/modules/packages/rpm"
+ "code.gitea.io/gitea/modules/setting"
+ packages_service "code.gitea.io/gitea/services/packages"
+
+ "github.com/ulikunitz/xz"
+)
+
+// GetOrCreateRepositoryVersion gets or creates the internal repository package
+// The RPM registry needs multiple metadata files which are stored in this package.
+func GetOrCreateRepositoryVersion(ctx context.Context, ownerID int64) (*packages_model.PackageVersion, error) {
+ return packages_service.GetOrCreateInternalPackageVersion(ctx, ownerID, packages_model.TypeAlt, rpm_module.RepositoryPackage, rpm_module.RepositoryVersion)
+}
+
+// BuildAllRepositoryFiles (re)builds all repository files for every available group
+func BuildAllRepositoryFiles(ctx context.Context, ownerID int64) error {
+ pv, err := GetOrCreateRepositoryVersion(ctx, ownerID)
+ if err != nil {
+ return err
+ }
+
+ // 1. Delete all existing repository files
+ pfs, err := packages_model.GetFilesByVersionID(ctx, pv.ID)
+ if err != nil {
+ return err
+ }
+
+ for _, pf := range pfs {
+ if err := packages_service.DeletePackageFile(ctx, pf); err != nil {
+ return err
+ }
+ }
+
+ // 2. (Re)Build repository files for existing packages
+ groups, err := alt_model.GetGroups(ctx, ownerID)
+ if err != nil {
+ return err
+ }
+ for _, group := range groups {
+ if err := BuildSpecificRepositoryFiles(ctx, ownerID, group); err != nil {
+ return fmt.Errorf("failed to build repository files [%s]: %w", group, err)
+ }
+ }
+
+ return nil
+}
+
+type repoChecksum struct {
+ Value string `xml:",chardata"`
+ Type string `xml:"type,attr"`
+}
+
+type repoLocation struct {
+ Href string `xml:"href,attr"`
+}
+
+type repoData struct {
+ Type string `xml:"type,attr"`
+ Checksum repoChecksum `xml:"checksum"`
+ MD5Checksum repoChecksum `xml:"md5checksum"`
+ Blake2bHash repoChecksum `xml:"blake2bHash"`
+ OpenChecksum repoChecksum `xml:"open-checksum"`
+ Location repoLocation `xml:"location"`
+ Timestamp int64 `xml:"timestamp"`
+ Size int64 `xml:"size"`
+ OpenSize int64 `xml:"open-size"`
+}
+
+type packageData struct {
+ Package *packages_model.Package
+ Version *packages_model.PackageVersion
+ Blob *packages_model.PackageBlob
+ VersionMetadata *rpm_module.VersionMetadata
+ FileMetadata *rpm_module.FileMetadata
+}
+
+type packageCache = map[*packages_model.PackageFile]*packageData
+
+// BuildSpecificRepositoryFiles builds metadata files for the repository
+func BuildSpecificRepositoryFiles(ctx context.Context, ownerID int64, group string) error {
+ pv, err := GetOrCreateRepositoryVersion(ctx, ownerID)
+ if err != nil {
+ return err
+ }
+
+ pfs, _, err := packages_model.SearchFiles(ctx, &packages_model.PackageFileSearchOptions{
+ OwnerID: ownerID,
+ PackageType: packages_model.TypeAlt,
+ Query: "%.rpm",
+ CompositeKey: group,
+ })
+ if err != nil {
+ return err
+ }
+
+ // Delete the repository files if there are no packages
+ if len(pfs) == 0 {
+ pfs, err := packages_model.GetFilesByVersionID(ctx, pv.ID)
+ if err != nil {
+ return err
+ }
+ for _, pf := range pfs {
+ if err := packages_service.DeletePackageFile(ctx, pf); err != nil {
+ return err
+ }
+ }
+
+ return nil
+ }
+
+ // Cache data needed for all repository files
+ cache := make(packageCache)
+ for _, pf := range pfs {
+ pv, err := packages_model.GetVersionByID(ctx, pf.VersionID)
+ if err != nil {
+ return err
+ }
+ p, err := packages_model.GetPackageByID(ctx, pv.PackageID)
+ if err != nil {
+ return err
+ }
+ pb, err := packages_model.GetBlobByID(ctx, pf.BlobID)
+ if err != nil {
+ return err
+ }
+ pps, err := packages_model.GetPropertiesByName(ctx, packages_model.PropertyTypeFile, pf.ID, rpm_module.PropertyMetadata)
+ if err != nil {
+ return err
+ }
+
+ pd := &packageData{
+ Package: p,
+ Version: pv,
+ Blob: pb,
+ }
+
+ if err := json.Unmarshal([]byte(pv.MetadataJSON), &pd.VersionMetadata); err != nil {
+ return err
+ }
+ if len(pps) > 0 {
+ if err := json.Unmarshal([]byte(pps[0].Value), &pd.FileMetadata); err != nil {
+ return err
+ }
+ }
+
+ cache[pf] = pd
+ }
+
+ pkglist, err := buildPackageLists(ctx, pv, pfs, cache, group)
+ if err != nil {
+ return err
+ }
+
+ err = buildRelease(ctx, pv, pfs, cache, group, pkglist)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+type RPMHeader struct {
+ Magic [4]byte
+ Reserved [4]byte
+ NIndex uint32
+ HSize uint32
+}
+
+type RPMHdrIndex struct {
+ Tag uint32
+ Type uint32
+ Offset uint32
+ Count uint32
+}
+
+type indexWithData struct {
+ index *RPMHdrIndex
+ data []any
+}
+
+type headerWithIndexes struct {
+ header *RPMHeader
+ indexes []indexWithData
+}
+
+// https://refspecs.linuxbase.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/pkgformat.html
+func buildPackageLists(ctx context.Context, pv *packages_model.PackageVersion, pfs []*packages_model.PackageFile, c packageCache, group string) (map[string][]*repoData, error) {
+ packagesByArch := map[string][]*packages_model.PackageFile{}
+
+ for _, pf := range pfs {
+ pd := c[pf]
+
+ packageArch := pd.FileMetadata.Architecture
+ if packages, ok := packagesByArch[packageArch]; ok {
+ packagesByArch[packageArch] = append(packages, pf)
+ } else {
+ packagesByArch[packageArch] = []*packages_model.PackageFile{pf}
+ }
+ }
+
+ repoDataListByArch := make(map[string][]*repoData)
+
+ for architecture, pfs := range packagesByArch {
+ repoDataList := []*repoData{}
+ orderedHeaders := []headerWithIndexes{}
+
+ for _, pf := range pfs {
+ pd := c[pf]
+
+ var requireNames []any
+ var requireVersions []any
+ var requireFlags []any
+ requireNamesSize := 0
+ requireVersionsSize := 0
+ requireFlagsSize := 0
+
+ for _, entry := range pd.FileMetadata.Requires {
+ if entry != nil {
+ requireNames = append(requireNames, entry.Name)
+ requireVersions = append(requireVersions, entry.Version)
+ requireFlags = append(requireFlags, entry.AltFlags)
+ requireNamesSize += len(entry.Name) + 1
+ requireVersionsSize += len(entry.Version) + 1
+ requireFlagsSize += 4
+ }
+ }
+
+ var conflictNames []any
+ var conflictVersions []any
+ var conflictFlags []any
+ conflictNamesSize := 0
+ conflictVersionsSize := 0
+ conflictFlagsSize := 0
+
+ for _, entry := range pd.FileMetadata.Conflicts {
+ if entry != nil {
+ conflictNames = append(conflictNames, entry.Name)
+ conflictVersions = append(conflictVersions, entry.Version)
+ conflictFlags = append(conflictFlags, entry.AltFlags)
+ conflictNamesSize += len(entry.Name) + 1
+ conflictVersionsSize += len(entry.Version) + 1
+ conflictFlagsSize += 4
+ }
+ }
+
+ var baseNames []any
+ var dirNames []any
+ baseNamesSize := 0
+ dirNamesSize := 0
+
+ for _, entry := range pd.FileMetadata.Files {
+ if entry != nil {
+ dir, file := path.Split(entry.Path)
+
+ baseNames = append(baseNames, file)
+ dirNames = append(dirNames, dir)
+ baseNamesSize += len(file) + 1
+ dirNamesSize += len(dir) + 1
+ }
+ }
+
+ var provideNames []any
+ var provideVersions []any
+ var provideFlags []any
+ provideNamesSize := 0
+ provideVersionsSize := 0
+ provideFlagsSize := 0
+
+ for _, entry := range pd.FileMetadata.Provides {
+ if entry != nil {
+ provideNames = append(provideNames, entry.Name)
+ provideVersions = append(provideVersions, entry.Version)
+ provideFlags = append(provideFlags, entry.AltFlags)
+ provideNamesSize += len(entry.Name) + 1
+ provideVersionsSize += len(entry.Version) + 1
+ provideFlagsSize += 4
+ }
+ }
+
+ var obsoleteNames []any
+ var obsoleteVersions []any
+ var obsoleteFlags []any
+ obsoleteNamesSize := 0
+ obsoleteVersionsSize := 0
+ obsoleteFlagsSize := 0
+
+ for _, entry := range pd.FileMetadata.Obsoletes {
+ if entry != nil {
+ obsoleteNames = append(obsoleteNames, entry.Name)
+ obsoleteVersions = append(obsoleteVersions, entry.Version)
+ obsoleteFlags = append(obsoleteFlags, entry.AltFlags)
+ obsoleteNamesSize += len(entry.Name) + 1
+ obsoleteVersionsSize += len(entry.Version) + 1
+ obsoleteFlagsSize += 4
+ }
+ }
+
+ var changeLogTimes []any
+ var changeLogNames []any
+ var changeLogTexts []any
+ changeLogTimesSize := 0
+ changeLogNamesSize := 0
+ changeLogTextsSize := 0
+
+ for _, entry := range pd.FileMetadata.Changelogs {
+ if entry != nil {
+ changeLogNames = append(changeLogNames, entry.Author)
+ changeLogTexts = append(changeLogTexts, entry.Text)
+ changeLogTimes = append(changeLogTimes, uint32(int64(entry.Date)))
+ changeLogNamesSize += len(entry.Author) + 1
+ changeLogTextsSize += len(entry.Text) + 1
+ changeLogTimesSize += 4
+ }
+ }
+
+ /*Header*/
+ hdr := &RPMHeader{
+ Magic: [4]byte{0x8E, 0xAD, 0xE8, 0x01},
+ Reserved: [4]byte{0, 0, 0, 0},
+ NIndex: binary.BigEndian.Uint32([]byte{0, 0, 0, 0}),
+ HSize: binary.BigEndian.Uint32([]byte{0, 0, 0, 0}),
+ }
+ orderedHeader := headerWithIndexes{hdr, []indexWithData{}}
+
+ /*Tags: */
+ nameInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 232}),
+ Type: 6,
+ Offset: 0,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &nameInd,
+ data: []any{pd.Package.Name},
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(len(pd.Package.Name) + 1)
+
+ // Индекс для версии пакета
+ versionInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 233}),
+ Type: 6,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &versionInd,
+ data: []any{pd.FileMetadata.Version},
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(len(pd.FileMetadata.Version) + 1)
+
+ summaryInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 236}),
+ Type: 9,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &summaryInd,
+ data: []any{pd.VersionMetadata.Summary},
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(len(pd.VersionMetadata.Summary) + 1)
+
+ descriptionInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 237}),
+ Type: 9,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &descriptionInd,
+ data: []any{pd.VersionMetadata.Description},
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(len(pd.VersionMetadata.Description) + 1)
+
+ releaseInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 234}),
+ Type: 6,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &releaseInd,
+ data: []any{pd.FileMetadata.Release},
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(len(pd.FileMetadata.Release) + 1)
+
+ alignPadding(hdr, orderedHeader.indexes)
+
+ sizeInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 241}),
+ Type: 4,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &sizeInd,
+ data: []any{int32(pd.FileMetadata.InstalledSize)},
+ })
+ hdr.NIndex++
+ hdr.HSize += 4
+
+ buildTimeInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 238}),
+ Type: 4,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &buildTimeInd,
+ data: []any{int32(pd.FileMetadata.BuildTime)},
+ })
+ hdr.NIndex++
+ hdr.HSize += 4
+
+ licenseInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 246}),
+ Type: 6,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &licenseInd,
+ data: []any{pd.VersionMetadata.License},
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(len(pd.VersionMetadata.License) + 1)
+
+ packagerInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 247}),
+ Type: 6,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &packagerInd,
+ data: []any{pd.FileMetadata.Packager},
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(len(pd.FileMetadata.Packager) + 1)
+
+ groupInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 248}),
+ Type: 6,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &groupInd,
+ data: []any{pd.FileMetadata.Group},
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(len(pd.FileMetadata.Group) + 1)
+
+ urlInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 252}),
+ Type: 6,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &urlInd,
+ data: []any{pd.VersionMetadata.ProjectURL},
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(len(pd.VersionMetadata.ProjectURL) + 1)
+
+ if len(changeLogNames) != 0 && len(changeLogTexts) != 0 && len(changeLogTimes) != 0 {
+ alignPadding(hdr, orderedHeader.indexes)
+
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x38}, 4, changeLogTimes, changeLogTimesSize)
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x39}, 8, changeLogNames, changeLogNamesSize)
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x3A}, 8, changeLogTexts, changeLogTextsSize)
+ }
+
+ archInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 254}),
+ Type: 6,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &archInd,
+ data: []any{pd.FileMetadata.Architecture},
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(len(pd.FileMetadata.Architecture) + 1)
+
+ if len(provideNames) != 0 && len(provideVersions) != 0 && len(provideFlags) != 0 {
+ alignPadding(hdr, orderedHeader.indexes)
+
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x58}, 4, provideFlags, provideFlagsSize)
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x17}, 8, provideNames, provideNamesSize)
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x59}, 8, provideVersions, provideVersionsSize)
+ }
+
+ sourceRpmInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0x00, 0x00, 0x04, 0x14}),
+ Type: 6,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &sourceRpmInd,
+ data: []any{pd.FileMetadata.SourceRpm},
+ })
+ hdr.NIndex++
+ hdr.HSize += binary.BigEndian.Uint32([]byte{0, 0, 0, uint8(len(pd.FileMetadata.SourceRpm) + 1)})
+
+ if len(requireNames) != 0 && len(requireVersions) != 0 && len(requireFlags) != 0 {
+ alignPadding(hdr, orderedHeader.indexes)
+
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x18}, 4, requireFlags, requireFlagsSize)
+ addRPMHdrIndex(&orderedHeader, []byte{0, 0, 4, 25}, 8, requireNames, requireNamesSize)
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x1A}, 8, requireVersions, requireVersionsSize)
+ }
+
+ if len(baseNames) != 0 {
+ baseNamesInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0x00, 0x00, 0x04, 0x5D}),
+ Type: 8,
+ Offset: hdr.HSize,
+ Count: uint32(len(baseNames)),
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &baseNamesInd,
+ data: baseNames,
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(baseNamesSize)
+ }
+
+ if len(dirNames) != 0 {
+ dirnamesInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0x00, 0x00, 0x04, 0x5E}),
+ Type: 8,
+ Offset: hdr.HSize,
+ Count: uint32(len(dirNames)),
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &dirnamesInd,
+ data: dirNames,
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(dirNamesSize)
+ }
+
+ filenameInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0x00, 0x0F, 0x42, 0x40}),
+ Type: 6,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &filenameInd,
+ data: []any{pf.Name},
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(len(pf.Name) + 1)
+
+ alignPadding(hdr, orderedHeader.indexes)
+
+ filesizeInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0x00, 0x0F, 0x42, 0x41}),
+ Type: 4,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &filesizeInd,
+ data: []any{int32(pd.Blob.Size)},
+ })
+ hdr.NIndex++
+ hdr.HSize += 4
+
+ md5Ind := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0x00, 0x0F, 0x42, 0x45}),
+ Type: 6,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &md5Ind,
+ data: []any{pd.Blob.HashMD5},
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(len(pd.Blob.HashMD5) + 1)
+
+ blake2bInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0x00, 0x0F, 0x42, 0x49}),
+ Type: 6,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &blake2bInd,
+ data: []any{pd.Blob.HashBlake2b},
+ })
+ hdr.NIndex++
+ hdr.HSize += uint32(len(pd.Blob.HashBlake2b) + 1)
+
+ if len(conflictNames) != 0 && len(conflictVersions) != 0 && len(conflictFlags) != 0 {
+ alignPadding(hdr, orderedHeader.indexes)
+
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x1D}, 4, conflictFlags, conflictFlagsSize)
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x1E}, 8, conflictNames, conflictNamesSize)
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x1F}, 8, conflictVersions, conflictVersionsSize)
+ }
+
+ directoryInd := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32([]byte{0x00, 0x0F, 0x42, 0x4A}),
+ Type: 6,
+ Offset: hdr.HSize,
+ Count: 1,
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &directoryInd,
+ data: []any{"RPMS.classic"},
+ })
+ hdr.NIndex++
+ hdr.HSize += binary.BigEndian.Uint32([]byte{0, 0, 0, uint8(len("RPMS.classic") + 1)})
+
+ if len(obsoleteNames) != 0 && len(obsoleteVersions) != 0 && len(obsoleteFlags) != 0 {
+ alignPadding(hdr, orderedHeader.indexes)
+
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x5A}, 4, obsoleteFlags, obsoleteFlagsSize)
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x42}, 8, obsoleteNames, obsoleteNamesSize)
+ addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x5B}, 8, obsoleteVersions, obsoleteVersionsSize)
+ }
+
+ orderedHeaders = append(orderedHeaders, orderedHeader)
+ }
+
+ files := []string{"pkglist.classic", "pkglist.classic.xz"}
+ for file := range files {
+ fileInfo, err := addPkglistAsFileToRepo(ctx, pv, files[file], orderedHeaders, group, architecture)
+ if err != nil {
+ return nil, err
+ }
+ repoDataList = append(repoDataList, fileInfo)
+ }
+ repoDataListByArch[architecture] = repoDataList
+ }
+ return repoDataListByArch, nil
+}
+
+func alignPadding(hdr *RPMHeader, indexes []indexWithData) {
+ /* Align to 4-bytes to add a 4-byte element. */
+ padding := (4 - (hdr.HSize % 4)) % 4
+ if padding == 4 {
+ padding = 0
+ }
+ hdr.HSize += binary.BigEndian.Uint32([]byte{0, 0, 0, uint8(padding)})
+
+ lastIndex := len(indexes) - 1
+ for i := uint32(0); i < padding; i++ {
+ for _, elem := range indexes[lastIndex].data {
+ if str, ok := elem.(string); ok {
+ indexes[lastIndex].data[len(indexes[lastIndex].data)-1] = str + "\x00"
+ }
+ }
+ }
+}
+
+func addRPMHdrIndex(orderedHeader *headerWithIndexes, tag []byte, typeVal uint32, data []any, dataSize int) {
+ index := RPMHdrIndex{
+ Tag: binary.BigEndian.Uint32(tag),
+ Type: typeVal,
+ Offset: orderedHeader.header.HSize,
+ Count: uint32(len(data)),
+ }
+ orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{
+ index: &index,
+ data: data,
+ })
+ orderedHeader.header.NIndex++
+ orderedHeader.header.HSize += uint32(dataSize)
+}
+
+// https://www.altlinux.org/APT_в_ALT_Linux/CreateRepository
+func buildRelease(ctx context.Context, pv *packages_model.PackageVersion, pfs []*packages_model.PackageFile, c packageCache, group string, pkglist map[string][]*repoData) error {
+ architectures := make(container.Set[string])
+
+ for _, pf := range pfs {
+ pd := c[pf]
+ architectures.Add(pd.FileMetadata.Architecture)
+ }
+
+ for architecture := range architectures {
+ version := time.Now().Unix()
+ label := setting.AppName
+ data := fmt.Sprintf(`Archive: Alt Linux Team
+Component: classic
+Version: %d
+Origin: Alt Linux Team
+Label: %s
+Architecture: %s
+NotAutomatic: false
+`,
+ version, label, architecture)
+ fileInfo, err := addReleaseAsFileToRepo(ctx, pv, "release.classic", data, group, architecture)
+ if err != nil {
+ return err
+ }
+
+ origin := setting.AppName
+ codename := time.Now().Unix()
+ date := time.Now().UTC().Format(time.RFC1123)
+
+ var md5Sum string
+ var blake2b string
+
+ for _, pkglistByArch := range pkglist[architecture] {
+ md5Sum += fmt.Sprintf(" %s %d %s\n", pkglistByArch.MD5Checksum.Value, pkglistByArch.Size, "base/"+pkglistByArch.Type)
+ blake2b += fmt.Sprintf(" %s %d %s\n", pkglistByArch.Blake2bHash.Value, pkglistByArch.Size, "base/"+pkglistByArch.Type)
+ }
+ md5Sum += fmt.Sprintf(" %s %d %s\n", fileInfo.MD5Checksum.Value, fileInfo.Size, "base/"+fileInfo.Type)
+ blake2b += fmt.Sprintf(" %s %d %s\n", fileInfo.Blake2bHash.Value, fileInfo.Size, "base/"+fileInfo.Type)
+
+ data = fmt.Sprintf(`Origin: %s
+Label: %s
+Suite: Sisyphus
+Codename: %d
+Date: %s
+Architectures: %s
+MD5Sum:
+%sBLAKE2b:
+%s
+
+`,
+ origin, label, codename, date, architecture, md5Sum, blake2b)
+ _, err = addReleaseAsFileToRepo(ctx, pv, "release", data, group, architecture)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func addReleaseAsFileToRepo(ctx context.Context, pv *packages_model.PackageVersion, filename, obj, group, arch string) (*repoData, error) {
+ content, _ := packages_module.NewHashedBuffer()
+ defer content.Close()
+
+ h := sha256.New()
+
+ w := io.MultiWriter(content, h)
+ if _, err := w.Write([]byte(obj)); err != nil {
+ return nil, err
+ }
+
+ _, err := packages_service.AddFileToPackageVersionInternal(
+ ctx,
+ pv,
+ &packages_service.PackageFileCreationInfo{
+ PackageFileInfo: packages_service.PackageFileInfo{
+ Filename: filename,
+ CompositeKey: arch + "__" + group,
+ },
+ Creator: user_model.NewGhostUser(),
+ Data: content,
+ IsLead: false,
+ OverwriteExisting: true,
+ },
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ hashMD5, _, hashSHA256, _, hashBlake2b := content.Sums()
+
+ if group == "" {
+ group = "alt"
+ }
+
+ return &repoData{
+ Type: filename,
+ Checksum: repoChecksum{
+ Type: "sha256",
+ Value: hex.EncodeToString(hashSHA256),
+ },
+ MD5Checksum: repoChecksum{
+ Type: "md5",
+ Value: hex.EncodeToString(hashMD5),
+ },
+ OpenChecksum: repoChecksum{
+ Type: "sha256",
+ Value: hex.EncodeToString(h.Sum(nil)),
+ },
+ Blake2bHash: repoChecksum{
+ Type: "blake2b",
+ Value: hex.EncodeToString(hashBlake2b),
+ },
+ Location: repoLocation{
+ Href: group + ".repo/" + arch + "/base/" + filename,
+ },
+ Size: content.Size(),
+ }, nil
+}
+
+func addPkglistAsFileToRepo(ctx context.Context, pv *packages_model.PackageVersion, filename string, orderedHeaders []headerWithIndexes, group, arch string) (*repoData, error) {
+ content, _ := packages_module.NewHashedBuffer()
+ defer content.Close()
+
+ h := sha256.New()
+ w := io.MultiWriter(content, h)
+ buf := &bytes.Buffer{}
+
+ for _, hdr := range orderedHeaders {
+ if err := binary.Write(buf, binary.BigEndian, *hdr.header); err != nil {
+ return nil, err
+ }
+
+ for _, index := range hdr.indexes {
+ if err := binary.Write(buf, binary.BigEndian, *index.index); err != nil {
+ return nil, err
+ }
+ }
+
+ for _, index := range hdr.indexes {
+ for _, indexValue := range index.data {
+ switch v := indexValue.(type) {
+ case string:
+ if _, err := buf.WriteString(v + "\x00"); err != nil {
+ return nil, err
+ }
+ case int, int32, int64, uint32:
+ if err := binary.Write(buf, binary.BigEndian, v); err != nil {
+ return nil, err
+ }
+ }
+ }
+ }
+ }
+
+ if path.Ext(filename) == ".xz" {
+ xzContent, err := compressXZ(buf.Bytes())
+ if err != nil {
+ return nil, err
+ }
+ if _, err := w.Write(xzContent); err != nil {
+ return nil, err
+ }
+ } else {
+ if _, err := w.Write(buf.Bytes()); err != nil {
+ return nil, err
+ }
+ }
+
+ _, err := packages_service.AddFileToPackageVersionInternal(
+ ctx,
+ pv,
+ &packages_service.PackageFileCreationInfo{
+ PackageFileInfo: packages_service.PackageFileInfo{
+ Filename: filename,
+ CompositeKey: arch + "__" + group,
+ },
+ Creator: user_model.NewGhostUser(),
+ Data: content,
+ IsLead: false,
+ OverwriteExisting: true,
+ },
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ hashMD5, _, hashSHA256, _, hashBlake2b := content.Sums()
+
+ if group == "" {
+ group = "alt"
+ }
+
+ return &repoData{
+ Type: filename,
+ Checksum: repoChecksum{
+ Type: "sha256",
+ Value: hex.EncodeToString(hashSHA256),
+ },
+ MD5Checksum: repoChecksum{
+ Type: "md5",
+ Value: hex.EncodeToString(hashMD5),
+ },
+ OpenChecksum: repoChecksum{
+ Type: "sha256",
+ Value: hex.EncodeToString(h.Sum(nil)),
+ },
+ Blake2bHash: repoChecksum{
+ Type: "blake2b",
+ Value: hex.EncodeToString(hashBlake2b),
+ },
+ Location: repoLocation{
+ Href: group + ".repo/" + arch + "/base/" + filename,
+ },
+ Size: content.Size(),
+ }, nil
+}
+
+func compressXZ(data []byte) ([]byte, error) {
+ var xzContent bytes.Buffer
+ xzWriter, err := xz.NewWriter(&xzContent)
+ if err != nil {
+ return nil, err
+ }
+
+ _, err = xzWriter.Write(data)
+ xzWriter.Close()
+ if err != nil {
+ return nil, err
+ }
+
+ return xzContent.Bytes(), nil
+}
diff --git a/services/packages/cleanup/cleanup.go b/services/packages/cleanup/cleanup.go
index ab419a9a5a..d84bdf1b03 100644
--- a/services/packages/cleanup/cleanup.go
+++ b/services/packages/cleanup/cleanup.go
@@ -16,6 +16,7 @@ import (
packages_module "code.gitea.io/gitea/modules/packages"
packages_service "code.gitea.io/gitea/services/packages"
alpine_service "code.gitea.io/gitea/services/packages/alpine"
+ alt_service "code.gitea.io/gitea/services/packages/alt"
arch_service "code.gitea.io/gitea/services/packages/arch"
cargo_service "code.gitea.io/gitea/services/packages/cargo"
container_service "code.gitea.io/gitea/services/packages/container"
@@ -137,6 +138,10 @@ func ExecuteCleanupRules(outerCtx context.Context) error {
if err := arch_service.BuildAllRepositoryFiles(ctx, pcr.OwnerID); err != nil {
return fmt.Errorf("CleanupRule [%d]: arch.BuildAllRepositoryFiles failed: %w", pcr.ID, err)
}
+ } else if pcr.Type == packages_model.TypeAlt {
+ if err := alt_service.BuildAllRepositoryFiles(ctx, pcr.OwnerID); err != nil {
+ return fmt.Errorf("CleanupRule [%d]: alt.BuildAllRepositoryFiles failed: %w", pcr.ID, err)
+ }
}
}
return nil
diff --git a/services/packages/packages.go b/services/packages/packages.go
index 72ab19ee27..bf89b6ad35 100644
--- a/services/packages/packages.go
+++ b/services/packages/packages.go
@@ -244,14 +244,15 @@ func addFileToPackageWrapper(ctx context.Context, fn func(ctx context.Context) (
// NewPackageBlob creates a package blob instance
func NewPackageBlob(hsr packages_module.HashedSizeReader) *packages_model.PackageBlob {
- hashMD5, hashSHA1, hashSHA256, hashSHA512 := hsr.Sums()
+ hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b := hsr.Sums()
return &packages_model.PackageBlob{
- Size: hsr.Size(),
- HashMD5: hex.EncodeToString(hashMD5),
- HashSHA1: hex.EncodeToString(hashSHA1),
- HashSHA256: hex.EncodeToString(hashSHA256),
- HashSHA512: hex.EncodeToString(hashSHA512),
+ Size: hsr.Size(),
+ HashMD5: hex.EncodeToString(hashMD5),
+ HashSHA1: hex.EncodeToString(hashSHA1),
+ HashSHA256: hex.EncodeToString(hashSHA256),
+ HashSHA512: hex.EncodeToString(hashSHA512),
+ HashBlake2b: hex.EncodeToString(hashBlake2b),
}
}
@@ -395,6 +396,8 @@ func CheckSizeQuotaExceeded(ctx context.Context, doer, owner *user_model.User, p
typeSpecificSize = setting.Packages.LimitSizePyPI
case packages_model.TypeRpm:
typeSpecificSize = setting.Packages.LimitSizeRpm
+ case packages_model.TypeAlt:
+ typeSpecificSize = setting.Packages.LimitSizeAlt
case packages_model.TypeRubyGems:
typeSpecificSize = setting.Packages.LimitSizeRubyGems
case packages_model.TypeSwift:
diff --git a/services/packages/rpm/repository.go b/services/packages/rpm/repository.go
index 2cea04212a..705876e5c0 100644
--- a/services/packages/rpm/repository.go
+++ b/services/packages/rpm/repository.go
@@ -622,7 +622,7 @@ func addDataAsFileToRepo(ctx context.Context, pv *packages_model.PackageVersion,
return nil, err
}
- _, _, hashSHA256, _ := content.Sums()
+ _, _, hashSHA256, _, _ := content.Sums()
return &repoData{
Type: filetype,
diff --git a/services/pull/merge_squash.go b/services/pull/merge_squash.go
index 197d8102dd..6dda46eaec 100644
--- a/services/pull/merge_squash.go
+++ b/services/pull/merge_squash.go
@@ -5,6 +5,7 @@ package pull
import (
"fmt"
+ "strings"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
@@ -66,7 +67,10 @@ func doMergeStyleSquash(ctx *mergeContext, message string) error {
if setting.Repository.PullRequest.AddCoCommitterTrailers && ctx.committer.String() != sig.String() {
// add trailer
- message += fmt.Sprintf("\nCo-authored-by: %s\nCo-committed-by: %s\n", sig.String(), sig.String())
+ if !strings.Contains(message, fmt.Sprintf("Co-authored-by: %s", sig.String())) {
+ message += fmt.Sprintf("\nCo-authored-by: %s", sig.String())
+ }
+ message += fmt.Sprintf("\nCo-committed-by: %s\n", sig.String())
}
cmdCommit := git.NewCommand(ctx, "commit").
AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email).
diff --git a/services/repository/create.go b/services/repository/create.go
index d092d02a1f..8a1118cc2b 100644
--- a/services/repository/create.go
+++ b/services/repository/create.go
@@ -45,6 +45,7 @@ type CreateRepoOptions struct {
TrustModel repo_model.TrustModelType
MirrorInterval string
ObjectFormatName string
+ Website string
}
func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir, repoPath string, opts CreateRepoOptions) error {
@@ -238,6 +239,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
DefaultBranch: opts.DefaultBranch,
WikiBranch: setting.Repository.DefaultBranch,
ObjectFormatName: opts.ObjectFormatName,
+ Website: opts.Website,
}
var rollbackRepo *repo_model.Repository
diff --git a/services/repository/migrate.go b/services/repository/migrate.go
index 39ced04ae3..b5735ac5b2 100644
--- a/services/repository/migrate.go
+++ b/services/repository/migrate.go
@@ -8,7 +8,6 @@ import (
"errors"
"fmt"
"net/http"
- "strings"
"time"
"code.gitea.io/gitea/models/db"
@@ -253,10 +252,10 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User,
func cleanUpMigrateGitConfig(ctx context.Context, repoPath string) error {
cmd := git.NewCommand(ctx, "remote", "rm", "origin")
// if the origin does not exist
- _, stderr, err := cmd.RunStdString(&git.RunOpts{
+ _, _, err := cmd.RunStdString(&git.RunOpts{
Dir: repoPath,
})
- if err != nil && !strings.HasPrefix(stderr, "fatal: No such remote") {
+ if err != nil && !git.IsRemoteNotExistError(err) {
return err
}
return nil
@@ -275,7 +274,7 @@ func CleanUpMigrateInfo(ctx context.Context, repo *repo_model.Repository) (*repo
}
_, _, err := git.NewCommand(ctx, "remote", "rm", "origin").RunStdString(&git.RunOpts{Dir: repoPath})
- if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
+ if err != nil && !git.IsRemoteNotExistError(err) {
return repo, fmt.Errorf("CleanUpMigrateInfo: %w", err)
}
diff --git a/services/user/user.go b/services/user/user.go
index 7610a3fbdd..62fe44ca27 100644
--- a/services/user/user.go
+++ b/services/user/user.go
@@ -33,6 +33,15 @@ import (
// RenameUser renames a user
func RenameUser(ctx context.Context, u *user_model.User, newUserName string) error {
+ return renameUser(ctx, u, newUserName, false)
+}
+
+// RenameUser renames a user as an admin.
+func AdminRenameUser(ctx context.Context, u *user_model.User, newUserName string) error {
+ return renameUser(ctx, u, newUserName, true)
+}
+
+func renameUser(ctx context.Context, u *user_model.User, newUserName string, doerIsAdmin bool) error {
if newUserName == u.Name {
return nil
}
@@ -49,6 +58,17 @@ func RenameUser(ctx context.Context, u *user_model.User, newUserName string) err
return err
}
+ // Check if the new username can be claimed.
+ if !doerIsAdmin {
+ if ok, expireTime, err := user_model.CanClaimUsername(ctx, newUserName, u.ID); err != nil {
+ return err
+ } else if !ok {
+ return user_model.ErrCooldownPeriod{
+ ExpireTime: expireTime,
+ }
+ }
+ }
+
onlyCapitalization := strings.EqualFold(newUserName, u.Name)
oldUserName := u.Name
@@ -85,6 +105,12 @@ func RenameUser(ctx context.Context, u *user_model.User, newUserName string) err
return err
}
+ if setting.Service.MaxUserRedirects > 0 {
+ if err := user_model.LimitUserRedirects(ctx, u.ID, setting.Service.MaxUserRedirects); err != nil {
+ return err
+ }
+ }
+
if err := agit.UserNameChanged(ctx, u, newUserName); err != nil {
return err
}
diff --git a/services/user/user_test.go b/services/user/user_test.go
index 719c9d733c..058ff7b6ed 100644
--- a/services/user/user_test.go
+++ b/services/user/user_test.go
@@ -199,6 +199,29 @@ func TestRenameUser(t *testing.T) {
unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, OwnerName: user.Name})
})
+
+ t.Run("Keep N redirects", func(t *testing.T) {
+ defer test.MockProtect(&setting.Service.MaxUserRedirects)()
+ // Start clean
+ unittest.AssertSuccessfulDelete(t, &user_model.Redirect{RedirectUserID: user.ID})
+
+ setting.Service.MaxUserRedirects = 1
+
+ require.NoError(t, RenameUser(db.DefaultContext, user, "redirect-1"))
+ unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "user_rename"})
+
+ // The granularity of created_unix is a second.
+ time.Sleep(time.Second)
+ require.NoError(t, RenameUser(db.DefaultContext, user, "redirect-2"))
+ unittest.AssertExistsIf(t, false, &user_model.Redirect{LowerName: "user_rename"})
+ unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "redirect-1"})
+
+ setting.Service.MaxUserRedirects = 2
+ time.Sleep(time.Second)
+ require.NoError(t, RenameUser(db.DefaultContext, user, "redirect-3"))
+ unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "redirect-1"})
+ unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "redirect-2"})
+ })
}
func TestCreateUser_Issue5882(t *testing.T) {
diff --git a/services/webhook/sourcehut/builds.go b/services/webhook/sourcehut/builds.go
index 5a34503a7d..346ccd3c0b 100644
--- a/services/webhook/sourcehut/builds.go
+++ b/services/webhook/sourcehut/builds.go
@@ -8,6 +8,7 @@ import (
"context"
"fmt"
"html/template"
+ "io"
"io/fs"
"net/http"
"strings"
@@ -189,11 +190,11 @@ func (pc sourcehutConvertor) Package(_ *api.PackagePayload) (graphqlPayload[buil
return graphqlPayload[buildsVariables]{}, shared.ErrPayloadTypeNotSupported
}
-// mustBuildManifest adjusts the manifest to submit to the builds service
+// newPayload opens and adjusts the manifest to submit to the builds service
//
// in case of an error the Error field will be set, to be visible by the end-user under recent deliveries
func (pc sourcehutConvertor) newPayload(repo *api.Repository, commitID, ref, note string, trusted bool) (graphqlPayload[buildsVariables], error) {
- manifest, err := pc.buildManifest(repo, commitID, ref)
+ manifest, err := pc.constructManifest(repo, commitID, ref)
if err != nil {
if len(manifest) == 0 {
return graphqlPayload[buildsVariables]{}, err
@@ -238,9 +239,9 @@ func (pc sourcehutConvertor) newPayload(repo *api.Repository, commitID, ref, not
}, nil
}
-// buildManifest adjusts the manifest to submit to the builds service
+// constructManifest opens and adjusts the manifest to submit to the builds service
// in case of an error the []byte might contain an error that can be displayed to the user
-func (pc sourcehutConvertor) buildManifest(repo *api.Repository, commitID, gitRef string) ([]byte, error) {
+func (pc sourcehutConvertor) constructManifest(repo *api.Repository, commitID, gitRef string) ([]byte, error) {
gitRepo, err := gitrepo.OpenRepository(pc.ctx, repo)
if err != nil {
msg := "could not open repository"
@@ -265,6 +266,10 @@ func (pc sourcehutConvertor) buildManifest(repo *api.Repository, commitID, gitRe
}
defer r.Close()
+ return adjustManifest(repo, commitID, gitRef, r, pc.meta.ManifestPath)
+}
+
+func adjustManifest(repo *api.Repository, commitID, gitRef string, r io.Reader, path string) ([]byte, error) {
// reference: https://man.sr.ht/builds.sr.ht/manifest.md
var manifest struct {
Sources []string `yaml:"sources"`
@@ -273,7 +278,7 @@ func (pc sourcehutConvertor) buildManifest(repo *api.Repository, commitID, gitRe
Rest map[string]yaml.Node `yaml:",inline"`
}
if err := yaml.NewDecoder(r).Decode(&manifest); err != nil {
- msg := fmt.Sprintf("could not decode manifest %q", pc.meta.ManifestPath)
+ msg := fmt.Sprintf("could not decode manifest %q", path)
return []byte(msg), fmt.Errorf(msg+": %w", err)
}
@@ -284,16 +289,21 @@ func (pc sourcehutConvertor) buildManifest(repo *api.Repository, commitID, gitRe
manifest.Environment["BUILD_SUBMITTER_URL"] = setting.AppURL
manifest.Environment["GIT_REF"] = gitRef
- source := repo.CloneURL + "#" + commitID
found := false
for i, s := range manifest.Sources {
- if s == repo.CloneURL {
- manifest.Sources[i] = source
+ if s == repo.CloneURL || s == repo.SSHURL {
+ manifest.Sources[i] = s + "#" + commitID
found = true
break
}
}
if !found {
+ source := repo.CloneURL
+ if repo.Private || setting.Repository.DisableHTTPGit {
+ // default to ssh for private repos or when git clone is disabled over http
+ source = repo.SSHURL
+ }
+ source += "#" + commitID
manifest.Sources = append(manifest.Sources, source)
}
diff --git a/services/webhook/sourcehut/builds_test.go b/services/webhook/sourcehut/builds_test.go
index 1a37279c99..5b16f08c09 100644
--- a/services/webhook/sourcehut/builds_test.go
+++ b/services/webhook/sourcehut/builds_test.go
@@ -5,6 +5,7 @@ package sourcehut
import (
"context"
+ "strings"
"testing"
webhook_model "code.gitea.io/gitea/models/webhook"
@@ -384,3 +385,134 @@ func TestSourcehutJSONPayload(t *testing.T) {
require.NoError(t, err)
assert.Equal(t, "json test", body.Variables.Note)
}
+
+func TestSourcehutAdjustManifest(t *testing.T) {
+ defer test.MockVariableValue(&setting.AppURL, "https://example.forgejo.org/")()
+ t.Run("without sources", func(t *testing.T) {
+ repo := &api.Repository{
+ CloneURL: "http://localhost:3000/testdata/repo.git",
+ }
+
+ manifest, err := adjustManifest(repo, "58771003157b81abc6bf41df0c5db4147a3e3c83", "refs/heads/main", strings.NewReader(`image: alpine/edge
+tasks:
+ - say-hello: |
+ echo hello
+ - say-world: echo world`), ".build.yml")
+
+ require.NoError(t, err)
+ assert.Equal(t, `sources:
+ - http://localhost:3000/testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83
+environment:
+ BUILD_SUBMITTER: forgejo
+ BUILD_SUBMITTER_URL: https://example.forgejo.org/
+ GIT_REF: refs/heads/main
+image: alpine/edge
+tasks:
+ - say-hello: |
+ echo hello
+ - say-world: echo world
+`, string(manifest))
+ })
+
+ t.Run("with other sources", func(t *testing.T) {
+ repo := &api.Repository{
+ CloneURL: "http://localhost:3000/testdata/repo.git",
+ }
+
+ manifest, err := adjustManifest(repo, "58771003157b81abc6bf41df0c5db4147a3e3c83", "refs/heads/main", strings.NewReader(`image: alpine/edge
+sources:
+- http://other.example.conm/repo.git
+tasks:
+ - hello: echo world`), ".build.yml")
+
+ require.NoError(t, err)
+ assert.Equal(t, `sources:
+ - http://other.example.conm/repo.git
+ - http://localhost:3000/testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83
+environment:
+ BUILD_SUBMITTER: forgejo
+ BUILD_SUBMITTER_URL: https://example.forgejo.org/
+ GIT_REF: refs/heads/main
+image: alpine/edge
+tasks:
+ - hello: echo world
+`, string(manifest))
+ })
+
+ t.Run("with same source", func(t *testing.T) {
+ repo := &api.Repository{
+ CloneURL: "http://localhost:3000/testdata/repo.git",
+ }
+
+ manifest, err := adjustManifest(repo, "58771003157b81abc6bf41df0c5db4147a3e3c83", "refs/heads/main", strings.NewReader(`image: alpine/edge
+sources:
+- http://localhost:3000/testdata/repo.git
+- http://other.example.conm/repo.git
+tasks:
+ - hello: echo world`), ".build.yml")
+
+ require.NoError(t, err)
+ assert.Equal(t, `sources:
+ - http://localhost:3000/testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83
+ - http://other.example.conm/repo.git
+environment:
+ BUILD_SUBMITTER: forgejo
+ BUILD_SUBMITTER_URL: https://example.forgejo.org/
+ GIT_REF: refs/heads/main
+image: alpine/edge
+tasks:
+ - hello: echo world
+`, string(manifest))
+ })
+
+ t.Run("with ssh source", func(t *testing.T) {
+ repo := &api.Repository{
+ CloneURL: "http://localhost:3000/testdata/repo.git",
+ SSHURL: "git@localhost:testdata/repo.git",
+ }
+
+ manifest, err := adjustManifest(repo, "58771003157b81abc6bf41df0c5db4147a3e3c83", "refs/heads/main", strings.NewReader(`image: alpine/edge
+sources:
+- git@localhost:testdata/repo.git
+- http://other.example.conm/repo.git
+tasks:
+ - hello: echo world`), ".build.yml")
+
+ require.NoError(t, err)
+ assert.Equal(t, `sources:
+ - git@localhost:testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83
+ - http://other.example.conm/repo.git
+environment:
+ BUILD_SUBMITTER: forgejo
+ BUILD_SUBMITTER_URL: https://example.forgejo.org/
+ GIT_REF: refs/heads/main
+image: alpine/edge
+tasks:
+ - hello: echo world
+`, string(manifest))
+ })
+
+ t.Run("private without source", func(t *testing.T) {
+ repo := &api.Repository{
+ CloneURL: "http://localhost:3000/testdata/repo.git",
+ SSHURL: "git@localhost:testdata/repo.git",
+ Private: true,
+ }
+
+ manifest, err := adjustManifest(repo, "58771003157b81abc6bf41df0c5db4147a3e3c83", "refs/heads/main", strings.NewReader(`image: alpine/edge
+tasks:
+ - hello: echo world`), ".build.yml")
+
+ require.NoError(t, err)
+ assert.Equal(t, `sources:
+ - git@localhost:testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83
+environment:
+ BUILD_SUBMITTER: forgejo
+ BUILD_SUBMITTER_URL: https://example.forgejo.org/
+ GIT_REF: refs/heads/main
+image: alpine/edge
+tasks:
+ - hello: echo world
+`, string(manifest))
+ })
+}
diff --git a/services/webhook/webhook_test.go b/services/webhook/webhook_test.go
index 816940a2b5..2ebbbe4a51 100644
--- a/services/webhook/webhook_test.go
+++ b/services/webhook/webhook_test.go
@@ -10,9 +10,12 @@ import (
"code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
+ user_model "code.gitea.io/gitea/models/user"
webhook_model "code.gitea.io/gitea/models/webhook"
+ "code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
webhook_module "code.gitea.io/gitea/modules/webhook"
+ "code.gitea.io/gitea/services/convert"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@@ -98,3 +101,11 @@ func TestPrepareWebhooksBranchFilterNoMatch(t *testing.T) {
})
}
}
+
+func TestWebhookUserMail(t *testing.T) {
+ require.NoError(t, unittest.PrepareTestDatabase())
+ setting.Service.NoReplyAddress = "no-reply.com"
+ user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
+ assert.Equal(t, user.GetPlaceholderEmail(), convert.ToUser(db.DefaultContext, user, nil).Email)
+ assert.Equal(t, user.Email, convert.ToUser(db.DefaultContext, user, user).Email)
+}
diff --git a/templates/admin/auth/edit.tmpl b/templates/admin/auth/edit.tmpl
index 8a8bd61148..34d52ed224 100644
--- a/templates/admin/auth/edit.tmpl
+++ b/templates/admin/auth/edit.tmpl
@@ -326,19 +326,28 @@
- {{range .OAuth2Providers}}{{if .CustomURLSettings}}
-
-
-
-
-
-
- {{end}}{{end}}
+ {{range .OAuth2Providers}}
+ {{if .CustomURLSettings}}
+
+
+
+
+
+
+ {{end}}
+ {{if .CanProvideSSHKeys}}
+
+ {{end}}
+ {{end}}
{{ctx.Locale.Tr "admin.auths.oauth2_scopes"}}
+
+ {{ctx.Locale.Tr "admin.auths.attribute_ssh_public_key"}}
+
+
{{ctx.Locale.Tr "admin.auths.oauth2_required_claim_name"}}
diff --git a/templates/admin/auth/source/oauth.tmpl b/templates/admin/auth/source/oauth.tmpl
index 0560cc8256..7d0a64d269 100644
--- a/templates/admin/auth/source/oauth.tmpl
+++ b/templates/admin/auth/source/oauth.tmpl
@@ -63,19 +63,27 @@
- {{range .OAuth2Providers}}{{if .CustomURLSettings}}
-
-
-
-
-
-
- {{end}}{{end}}
-
+ {{range .OAuth2Providers}}
+ {{if .CustomURLSettings}}
+
+
+
+
+
+
+ {{end}}
+ {{if .CanProvideSSHKeys}}
+
+ {{end}}
+ {{end}}
{{ctx.Locale.Tr "admin.auths.oauth2_scopes"}}
+
+ {{ctx.Locale.Tr "admin.auths.attribute_ssh_public_key"}}
+
+
-
diff --git a/templates/base/footer_content.tmpl b/templates/base/footer_content.tmpl
index 5db7464480..133ebac33a 100644
--- a/templates/base/footer_content.tmpl
+++ b/templates/base/footer_content.tmpl
@@ -8,7 +8,7 @@
{{if .IsAdmin}}
{{AppVer}}
{{else}}
- {{AppVer}}
+ {{AppVerNoMetadata}}
{{end}}
{{end}}
{{if and .TemplateLoadTimes ShowFooterTemplateLoadTime}}
diff --git a/templates/base/head_opengraph.tmpl b/templates/base/head_opengraph.tmpl
index be9829bf97..7f6eae3f49 100644
--- a/templates/base/head_opengraph.tmpl
+++ b/templates/base/head_opengraph.tmpl
@@ -1,59 +1,37 @@
-{{- /* og:description - a one to two sentence description of your object, maybe it only needs at most 300 bytes */ -}}
-{{if .PageIsUserProfile}}
-
-
-
-
- {{if .ContextUser.Description}}
-
- {{end}}
-{{else if .Repository}}
- {{if .Issue}}
-
-
- {{if .Issue.Content}}
-
- {{end}}
-
-
-
-
- {{else if or .PageIsDiff .IsViewFile}}
-
-
- {{if and .PageIsDiff .Commit}}
- {{- $commitMessageParts := StringUtils.Cut .Commit.Message "\n" -}}
- {{- $commitMessageBody := index $commitMessageParts 1 -}}
- {{- if $commitMessageBody -}}
-
- {{- end -}}
- {{end}}
- {{else if .Pages}}
-
-
- {{if .Repository.Description}}
-
- {{end}}
- {{else}}
-
-
- {{if .Repository.Description}}
-
- {{end}}
- {{end}}
-
- {{if not .Issue}}
- {{if (.Repository.AvatarLink ctx)}}
-
- {{else}}
-
- {{end}}
- {{end}}
+{{- /* See https://ogp.me for specification */ -}}
+{{if .OpenGraphTitle}}
+
+{{else if .Title}}
+
{{else}}
+{{end}}
+{{- /* og:description - a one to two sentence description of your object, maybe it only needs at most 300 bytes */ -}}
+{{if and .OpenGraphDescription (not .OpenGraphNoDescription)}}
+
+{{end}}
+{{if .OpenGraphURL}}
+
+{{else}}
+
+{{end}}
+{{if .OpenGraphType}}
+
+{{else}}
-
-
-
+{{end}}
+{{if .OpenGraphImageURL}}
+
+ {{if .OpenGraphImageWidth}}
+
+ {{end}}
+ {{if .OpenGraphImageHeight}}
+
+ {{end}}
+ {{if .OpenGraphImageAltText}}
+
+ {{end}}
+{{else}}
+
{{end}}
diff --git a/templates/org/settings/options.tmpl b/templates/org/settings/options.tmpl
index 62debfc0ae..2ef7031aef 100644
--- a/templates/org/settings/options.tmpl
+++ b/templates/org/settings/options.tmpl
@@ -6,14 +6,18 @@