Merge remote-tracking branch 'upstream/forgejo' into feat/add-oidc-ssh-keys

This commit is contained in:
Maxim Slipenko 2024-12-19 10:45:59 +00:00
commit bbcd7d6fae
147 changed files with 2879 additions and 2901 deletions

View file

@ -28,7 +28,7 @@ jobs:
- uses: actions/checkout@v4
- id: forgejo
uses: https://code.forgejo.org/actions/setup-forgejo@v1
uses: https://code.forgejo.org/actions/setup-forgejo@v2.0.4
with:
user: root
password: admin1234

View file

@ -158,7 +158,7 @@ jobs:
- name: build container & release
if: ${{ secrets.TOKEN != '' }}
uses: https://code.forgejo.org/forgejo/forgejo-build-publish/build@v5.1.1
uses: https://code.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1
with:
forgejo: "${{ env.GITHUB_SERVER_URL }}"
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
@ -177,7 +177,7 @@ jobs:
- name: build rootless container
if: ${{ secrets.TOKEN != '' }}
uses: https://code.forgejo.org/forgejo/forgejo-build-publish/build@v5.1.1
uses: https://code.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1
with:
forgejo: "${{ env.GITHUB_SERVER_URL }}"
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
@ -195,7 +195,7 @@ jobs:
- name: end-to-end tests
if: ${{ secrets.TOKEN != '' && vars.ROLE == 'forgejo-integration' && vars.SKIP_END_TO_END != 'true' }}
uses: https://code.forgejo.org/actions/cascading-pr@v2
uses: https://code.forgejo.org/actions/cascading-pr@v2.2.0
with:
origin-url: ${{ env.GITHUB_SERVER_URL }}
origin-repo: ${{ github.repository }}

View file

@ -41,7 +41,7 @@ jobs:
with:
fetch-depth: '0'
show-progress: 'false'
- uses: actions/cascading-pr@v2
- uses: https://code.forgejo.org/actions/cascading-pr@v2.2.0
with:
origin-url: ${{ env.GITHUB_SERVER_URL }}
origin-repo: ${{ github.repository }}

View file

@ -42,14 +42,14 @@ jobs:
- uses: actions/checkout@v4
- name: copy & sign
uses: https://code.forgejo.org/forgejo/forgejo-build-publish/publish@v5
uses: https://code.forgejo.org/forgejo/forgejo-build-publish/publish@v5.2.1
with:
from-forgejo: ${{ vars.FORGEJO }}
to-forgejo: ${{ vars.FORGEJO }}
from-owner: ${{ vars.FROM_OWNER }}
to-owner: ${{ vars.TO_OWNER }}
repo: ${{ vars.REPO }}
release-notes: "See https://codeberg.org/forgejo/forgejo/src/branch/forgejo/RELEASE-NOTES.md#{ANCHOR}"
release-notes: "See https://codeberg.org/forgejo/forgejo/src/branch/forgejo/release-notes-published/{VERSION}.md"
ref-name: ${{ github.ref_name }}
sha: ${{ github.sha }}
from-token: ${{ secrets.TOKEN }}

View file

@ -25,7 +25,7 @@ jobs:
runs-on: docker
container:
image: code.forgejo.org/forgejo-contrib/renovate:39.57.4
image: code.forgejo.org/forgejo-contrib/renovate:39.69.2
steps:
- name: Load renovate repo cache

View file

@ -39,7 +39,7 @@ 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
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.7.0 # renovate: datasource=go
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.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
MISSPELL_PACKAGE ?= github.com/golangci/misspell/cmd/misspell@v0.6.0 # renovate: datasource=go
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 # renovate: datasource=go
@ -48,8 +48,8 @@ GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.6.0 # renovate: datasour
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
GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.4.0 # renovate: datasource=go
GOPLS_PACKAGE ?= golang.org/x/tools/gopls@v0.16.2 # renovate: datasource=go
RENOVATE_NPM_PACKAGE ?= renovate@39.57.4 # renovate: datasource=docker packageName=code.forgejo.org/forgejo-contrib/renovate
GOPLS_PACKAGE ?= golang.org/x/tools/gopls@v0.17.0 # renovate: datasource=go
RENOVATE_NPM_PACKAGE ?= renovate@39.69.2 # renovate: datasource=docker packageName=code.forgejo.org/forgejo-contrib/renovate
# https://github.com/disposable-email-domains/disposable-email-domains/commits/main/
DISPOSABLE_EMAILS_SHA ?= 0c27e671231d27cf66370034d7f6818037416989 # renovate: ...

View file

@ -4,31 +4,31 @@ A minor or major Forgejo release is published every [three months](https://forge
A [patch or minor release](https://semver.org/spec/v2.0.0.html) (e.g. upgrading from v7.0.0 to v7.0.1 or v7.1.0) does not require manual intervention. But [major releases](https://semver.org/spec/v2.0.0.html#spec-item-8) where the first version number changes (e.g. upgrading from v1.21 to v7.0) contain breaking changes and the release notes explain how to deal with them.
The release notes of each release [are available in the corresponding milestone](https://codeberg.org/forgejo/forgejo/milestones), starting with [Forgejo 7.0.7](https://codeberg.org/forgejo/forgejo/milestone/7683) and [Forgejo 8.0.1](https://codeberg.org/forgejo/forgejo/milestone/7682).
The release notes of each release [are available in the release-notes-published directory of this repository](release-notes-published), starting with [Forgejo 7.0.7](release-notes-published/7.0.7.md) and [Forgejo 8.0.1](release-notes-published/8.0.1.md).
## 9.0.2
The Forgejo v9.0.2 release notes are [available in the v9.0.2 milestone](https://codeberg.org/forgejo/forgejo/milestone/8610).
See the [Forgejo 9.0.2 release notes](release-notes-published/9.0.2.md).
## 9.0.1
The Forgejo v9.0.1 release notes are [available in the v9.0.1 milestone](https://codeberg.org/forgejo/forgejo/milestone/8544).
See the [Forgejo 9.0.1 release notes](release-notes-published/9.0.1.md).
## 9.0.0
The Forgejo v9.0.0 release notes are [available in the v9.0.0 milestone](https://codeberg.org/forgejo/forgejo/milestone/7235).
See the [Forgejo 9.0.0 release notes](release-notes-published/9.0.0.md).
## 8.0.3
The Forgejo v8.0.3 release notes are [available in the v8.0.3 milestone](https://codeberg.org/forgejo/forgejo/milestone/8231).
See the [Forgejo 8.0.3 release notes](release-notes-published/8.0.3.md).
## 8.0.2
The Forgejo v8.0.2 release notes are [available in the v8.0.2 milestone](https://codeberg.org/forgejo/forgejo/milestone/7728).
See the [Forgejo 8.0.2 release notes](release-notes-published/8.0.2.md).
## 8.0.1
The Forgejo v8.0.1 release notes are [available in the v8.0.1 milestone](https://codeberg.org/forgejo/forgejo/milestone/7682).
See the [Forgejo 8.0.1 release notes](release-notes-published/8.0.1.md).
## 8.0.0
@ -169,23 +169,23 @@ A [companion blog post](https://forgejo.org/2024-07-release-v8-0/) provides addi
## 7.0.11
The Forgejo v7.0.11 release notes are [available in the v7.0.11 milestone](https://codeberg.org/forgejo/forgejo/milestone/8609).
See the [Forgejo 7.0.11 release notes](release-notes-published/7.0.11.md).
## 7.0.10
The Forgejo v7.0.10 release notes are [available in the v7.0.10 milestone](https://codeberg.org/forgejo/forgejo/milestone/8286).
See the [Forgejo 7.0.10 release notes](release-notes-published/7.0.10.md).
## 7.0.9
The Forgejo v7.0.9 release notes are [available in the v7.0.9 milestone](https://codeberg.org/forgejo/forgejo/milestone/8232).
See the [Forgejo 7.0.9 release notes](release-notes-published/7.0.9.md).
## 7.0.8
The Forgejo v7.0.8 release notes are [available in the v7.0.8 milestone](https://codeberg.org/forgejo/forgejo/milestone/7729).
See the [Forgejo 7.0.8 release notes](release-notes-published/7.0.8.md).
## 7.0.7
The Forgejo v7.0.7 release notes are [available in the v7.0.7 milestone](https://codeberg.org/forgejo/forgejo/milestone/7683).
See the [Forgejo 7.0.7 release notes](release-notes-published/7.0.7.md).
## 7.0.6

View file

@ -62,7 +62,6 @@ func initRemoveTags() {
"user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker",
"server", "servidor", "kiszolgáló", "serveris",
"label", "etichetta", "etiķete", "rótulo", "Label", "utilizador",
"filename", "bestandsnaam", "dosyaadi", "fails", "nome do arquivo", "datnes nosaukums",
} {
oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG")
}

20
go.mod
View file

@ -25,7 +25,7 @@ require (
github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2
github.com/alecthomas/chroma/v2 v2.14.0
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb
github.com/blevesearch/bleve/v2 v2.4.3
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/chi-middleware/proxy v1.1.1
@ -37,10 +37,10 @@ require (
github.com/emersion/go-imap v1.2.1
github.com/felixge/fgprof v0.9.5
github.com/fsnotify/fsnotify v1.8.0
github.com/gliderlabs/ssh v0.3.7
github.com/gliderlabs/ssh v0.3.8
github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9
github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73
github.com/go-chi/chi/v5 v5.1.0
github.com/go-chi/chi/v5 v5.2.0
github.com/go-chi/cors v1.2.1
github.com/go-co-op/gocron v1.37.0
github.com/go-enry/go-enry/v2 v2.9.1
@ -104,16 +104,16 @@ require (
github.com/yuin/goldmark v1.7.8
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc
go.uber.org/mock v0.4.0
golang.org/x/crypto v0.30.0
golang.org/x/crypto v0.31.0
golang.org/x/image v0.23.0
golang.org/x/net v0.32.0
golang.org/x/net v0.33.0
golang.org/x/oauth2 v0.23.0
golang.org/x/sync v0.10.0
golang.org/x/sys v0.28.0
golang.org/x/text v0.21.0
golang.org/x/tools v0.28.0
google.golang.org/grpc v1.68.0
google.golang.org/protobuf v1.35.1
google.golang.org/protobuf v1.36.0
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/ini.v1 v1.67.0
gopkg.in/yaml.v3 v3.0.1
@ -144,7 +144,7 @@ require (
github.com/bits-and-blooms/bitset v1.13.0 // indirect
github.com/blevesearch/bleve_index_api v1.1.12 // indirect
github.com/blevesearch/geo v0.1.20 // indirect
github.com/blevesearch/go-faiss v1.0.23 // indirect
github.com/blevesearch/go-faiss v1.0.24 // indirect
github.com/blevesearch/go-porterstemmer v1.0.3 // indirect
github.com/blevesearch/gtreap v0.1.1 // indirect
github.com/blevesearch/mmap-go v1.0.4 // indirect
@ -158,7 +158,7 @@ require (
github.com/blevesearch/zapx/v13 v13.3.10 // indirect
github.com/blevesearch/zapx/v14 v14.3.10 // indirect
github.com/blevesearch/zapx/v15 v15.3.16 // indirect
github.com/blevesearch/zapx/v16 v16.1.8 // indirect
github.com/blevesearch/zapx/v16 v16.1.9-0.20241217210638-a0519e7caf3b // indirect
github.com/boombuler/barcode v1.0.1 // indirect
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect
github.com/caddyserver/zerossl v0.1.3 // indirect
@ -300,4 +300,6 @@ replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.22.0
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-20241115232854-f14426c40ff2
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

36
go.sum
View file

@ -10,6 +10,8 @@ code.forgejo.org/forgejo/archiver/v3 v3.5.1 h1:UmmbA7D5550uf71SQjarmrn6yKwOGxtEj
code.forgejo.org/forgejo/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4=
code.forgejo.org/forgejo/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCdgFuQ=
code.forgejo.org/forgejo/reply v1.0.2/go.mod h1:RyZUfzQLc+fuLIGjTSQWDAJWPiL4WtKXB/FifT5fM7U=
code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616 h1:kEZL84+02jY9RxXM4zHBWZ3Fml0B09cmP1LGkDsCfIA=
code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8=
code.forgejo.org/go-chi/binding v1.0.0 h1:EIDJtk9brK7WsT7rvS/D4cxX8XlnhY3LMy8ex1jeHu0=
code.forgejo.org/go-chi/binding v1.0.0/go.mod h1:fWwqaHj0H1/KeCpBqdvKunflq8pYfciEHI5v3UUeE2E=
code.forgejo.org/go-chi/cache v1.0.0 h1:akLfGxNlHcacmtutovNtYFSTMsbdcp5MGjAEsP4pxnE=
@ -98,14 +100,14 @@ github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJR
github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb h1:m935MPodAbYS46DG4pJSv7WO+VECIWUQ7OJYSoTrMh4=
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI=
github.com/blevesearch/bleve/v2 v2.4.3 h1:XDYj+1prgX84L2Cf+V3ojrOPqXxy0qxyd2uLMmeuD+4=
github.com/blevesearch/bleve/v2 v2.4.3/go.mod h1:hEPDPrbYw3vyrm5VOa36GyS4bHWuIf4Fflp7460QQXY=
github.com/blevesearch/bleve/v2 v2.4.4 h1:RwwLGjUm54SwyyykbrZs4vc1qjzYic4ZnAnY9TwNl60=
github.com/blevesearch/bleve/v2 v2.4.4/go.mod h1:fa2Eo6DP7JR+dMFpQe+WiZXINKSunh7WBtlDGbolKXk=
github.com/blevesearch/bleve_index_api v1.1.12 h1:P4bw9/G/5rulOF7SJ9l4FsDoo7UFJ+5kexNy1RXfegY=
github.com/blevesearch/bleve_index_api v1.1.12/go.mod h1:PbcwjIcRmjhGbkS/lJCpfgVSMROV6TRubGGAODaK1W8=
github.com/blevesearch/geo v0.1.20 h1:paaSpu2Ewh/tn5DKn/FB5SzvH0EWupxHEIwbCk/QPqM=
github.com/blevesearch/geo v0.1.20/go.mod h1:DVG2QjwHNMFmjo+ZgzrIq2sfCh6rIHzy9d9d0B59I6w=
github.com/blevesearch/go-faiss v1.0.23 h1:Wmc5AFwDLKGl2L6mjLX1Da3vCL0EKa2uHHSorcIS1Uc=
github.com/blevesearch/go-faiss v1.0.23/go.mod h1:OMGQwOaRRYxrmeNdMrXJPvVx8gBnvE5RYrr0BahNnkk=
github.com/blevesearch/go-faiss v1.0.24 h1:K79IvKjoKHdi7FdiXEsAhxpMuns0x4fM0BO93bW5jLI=
github.com/blevesearch/go-faiss v1.0.24/go.mod h1:OMGQwOaRRYxrmeNdMrXJPvVx8gBnvE5RYrr0BahNnkk=
github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo=
github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M=
github.com/blevesearch/gtreap v0.1.1 h1:2JWigFrzDMR+42WGIN/V2p0cUvn4UP3C4Q5nmaZGW8Y=
@ -132,8 +134,8 @@ github.com/blevesearch/zapx/v14 v14.3.10 h1:SG6xlsL+W6YjhX5N3aEiL/2tcWh3DO75Bnz7
github.com/blevesearch/zapx/v14 v14.3.10/go.mod h1:qqyuR0u230jN1yMmE4FIAuCxmahRQEOehF78m6oTgns=
github.com/blevesearch/zapx/v15 v15.3.16 h1:Ct3rv7FUJPfPk99TI/OofdC+Kpb4IdyfdMH48sb+FmE=
github.com/blevesearch/zapx/v15 v15.3.16/go.mod h1:Turk/TNRKj9es7ZpKK95PS7f6D44Y7fAFy8F4LXQtGg=
github.com/blevesearch/zapx/v16 v16.1.8 h1:Bxzpw6YQpFs7UjoCV1+RvDw6fmAT2GZxldwX8b3wVBM=
github.com/blevesearch/zapx/v16 v16.1.8/go.mod h1:JqQlOqlRVaYDkpLIl3JnKql8u4zKTNlVEa3nLsi0Gn8=
github.com/blevesearch/zapx/v16 v16.1.9-0.20241217210638-a0519e7caf3b h1:ju9Az5YgrzCeK3M1QwvZIpxYhChkXp7/L0RhDYsxXoE=
github.com/blevesearch/zapx/v16 v16.1.9-0.20241217210638-a0519e7caf3b/go.mod h1:BlrYNpOu4BvVRslmIG+rLtKhmjIaRhIbG8sb9scGTwI=
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs=
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
@ -225,8 +227,6 @@ github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/
github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE=
github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8=
github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9 h1:j2TrkUG/NATGi/EQS+MvEoF79CxiRUmT16ErFroNcKI=
github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9/go.mod h1:cJ9Ye0ZNSMN7RzZDBRY3E+8M3Bpf/R1JX22Ir9yX6WI=
github.com/go-ap/errors v0.0.0-20231003111023-183eef4b31b7 h1:I2nuhyVI/48VXoRCCZR2hYBgnSXa+EuDJf/VyX06TC0=
@ -236,8 +236,8 @@ github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73/go.mod h1:jyveZeGw5La
github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA=
github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
github.com/go-chi/chi/v5 v5.0.1/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw=
github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
github.com/go-chi/chi/v5 v5.2.0 h1:Aj1EtB0qR2Rdo2dG4O94RIU35w2lvQSj6BRA4+qwFL0=
github.com/go-chi/chi/v5 v5.2.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4=
github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58=
github.com/go-co-op/gocron v1.37.0 h1:ZYDJGtQ4OMhTLKOKMIch+/CY70Brbb1dGdooLEhh7b0=
@ -383,8 +383,8 @@ 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-20241115232854-f14426c40ff2 h1:8xGrYqQ1GM4aaMk7pNDfecBdL/VGhEbpvvGBoqO6BIY=
github.com/grafana/go-json v0.0.0-20241115232854-f14426c40ff2/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
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/h2non/gock v1.2.0 h1:K6ol8rfrRkUOefooBC8elXoaNGYkpp7y2qcxGG6BzUE=
github.com/h2non/gock v1.2.0/go.mod h1:tNhoxHYW2W42cYkYb1WqzdbYIieALC99kpYr7rH/BQk=
github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw=
@ -735,8 +735,8 @@ golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2Uz
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.30.0 h1:RwoQn3GkWiMkzlX562cLB7OxWvjH1L8xutO2WoJcRoY=
golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA=
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
golang.org/x/image v0.23.0 h1:HseQ7c2OpPKTPVzNjG5fwJsOTCiiwS4QdsYi5XU6H68=
@ -762,8 +762,8 @@ 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.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -857,8 +857,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ=
google.golang.org/protobuf v1.36.0/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=

View file

@ -37,6 +37,7 @@ type ActionRun struct {
TriggerUser *user_model.User `xorm:"-"`
ScheduleID int64
Ref string `xorm:"index"` // the commit/tag/… that caused the run
IsRefDeleted bool `xorm:"-"`
CommitSHA string
IsForkPullRequest bool // If this is triggered by a PR from a forked repository or an untrusted user, we need to check if it is approved and limit permissions when running the workflow.
NeedApproval bool // may need approval if it's a fork pull request

View file

@ -137,7 +137,7 @@ func UpdateRunJob(ctx context.Context, job *ActionRunJob, cond builder.Cond, col
if err != nil {
return 0, err
}
run.Status = aggregateJobStatus(jobs)
run.Status = AggregateJobStatus(jobs)
if run.Started.IsZero() && run.Status.IsRunning() {
run.Started = timeutil.TimeStampNow()
}
@ -152,7 +152,7 @@ func UpdateRunJob(ctx context.Context, job *ActionRunJob, cond builder.Cond, col
return affected, nil
}
func aggregateJobStatus(jobs []*ActionRunJob) Status {
func AggregateJobStatus(jobs []*ActionRunJob) Status {
allDone := true
allWaiting := true
hasFailure := false

View file

@ -216,7 +216,7 @@ func CreateSource(ctx context.Context, source *Source) error {
return ErrSourceAlreadyExist{source.Name}
}
// Synchronization is only available with LDAP for now
if !source.IsLDAP() && !source.IsOAuth2() {
if !source.IsLDAP() {
source.IsSyncEnabled = false
}

View file

@ -4,7 +4,7 @@
package db // it's not db_test, because this file is for testing the private type halfCommitter
import (
"fmt"
"errors"
"testing"
"github.com/stretchr/testify/assert"
@ -80,7 +80,7 @@ func Test_halfCommitter(t *testing.T) {
testWithCommitter(mockCommitter, func(committer Committer) error {
defer committer.Close()
if true {
return fmt.Errorf("error")
return errors.New("error")
}
return committer.Commit()
})
@ -94,7 +94,7 @@ func Test_halfCommitter(t *testing.T) {
testWithCommitter(mockCommitter, func(committer Committer) error {
committer.Close()
committer.Commit()
return fmt.Errorf("error")
return errors.New("error")
})
mockCommitter.Assert(t)

View file

@ -413,6 +413,25 @@
},
"total_commits": 0
}
-
id: 793
title: "job output"
repo_id: 4
owner_id: 1
workflow_id: "test.yaml"
index: 189
trigger_user_id: 1
ref: "refs/heads/master"
commit_sha: "c2d72f548424103f01ee1dc02889c1e2bff816b0"
event: "push"
is_fork_pull_request: 0
status: 1
started: 1683636528
stopped: 1683636626
created: 1683636108
updated: 1683636626
need_approval: 0
approved_by: 0
-
id: 891
title: "update actions"

View file

@ -26,6 +26,49 @@
status: 1
started: 1683636528
stopped: 1683636626
-
id: 194
run_id: 793
repo_id: 4
owner_id: 1
commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0
is_fork_pull_request: 0
name: job1 (1)
attempt: 1
job_id: job1
task_id: 49
status: 1
started: 1683636528
stopped: 1683636626
-
id: 195
run_id: 793
repo_id: 4
owner_id: 1
commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0
is_fork_pull_request: 0
name: job1 (2)
attempt: 1
job_id: job1
task_id: 50
status: 1
started: 1683636528
stopped: 1683636626
-
id: 196
run_id: 793
repo_id: 4
owner_id: 1
commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0
is_fork_pull_request: 0
name: job2
attempt: 1
job_id: job2
needs: [job1]
task_id: 51
status: 5
started: 1683636528
stopped: 1683636626
-
id: 292
run_id: 891

View file

@ -57,3 +57,63 @@
log_length: 707
log_size: 90179
log_expired: 0
-
id: 49
job_id: 194
attempt: 1
runner_id: 1
status: 1 # success
started: 1683636528
stopped: 1683636626
repo_id: 4
owner_id: 1
commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0
is_fork_pull_request: 0
token_hash: b8d3962425466b6709b9ac51446f93260c54afe8e7b6d3686e34f991fb8a8953822b0deed86fe41a103f34bc48dbc4784220
token_salt: ffffffffff
token_last_eight: ffffffff
log_filename: artifact-test2/2f/47.log
log_in_storage: 1
log_length: 707
log_size: 90179
log_expired: 0
-
id: 50
job_id: 195
attempt: 1
runner_id: 1
status: 1 # success
started: 1683636528
stopped: 1683636626
repo_id: 4
owner_id: 1
commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0
is_fork_pull_request: 0
token_hash: b8d3962425466b6709b9ac51446f93260c54afe8e7b6d3686e34f991fb8a8953822b0deed86fe41a103f34bc48dbc4784221
token_salt: ffffffffff
token_last_eight: ffffffff
log_filename: artifact-test2/2f/47.log
log_in_storage: 1
log_length: 707
log_size: 90179
log_expired: 0
-
id: 51
job_id: 196
attempt: 1
runner_id: 1
status: 6 # running
started: 1683636528
stopped: 1683636626
repo_id: 4
owner_id: 1
commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0
is_fork_pull_request: 0
token_hash: b8d3962425466b6709b9ac51446f93260c54afe8e7b6d3686e34f991fb8a8953822b0deed86fe41a103f34bc48dbc4784222
token_salt: ffffffffff
token_last_eight: ffffffff
log_filename: artifact-test2/2f/47.log
log_in_storage: 1
log_length: 707
log_size: 90179
log_expired: 0

View file

@ -0,0 +1,20 @@
-
id: 1
task_id: 49
output_key: output_a
output_value: abc
-
id: 2
task_id: 49
output_key: output_b
output_value: ''
-
id: 3
task_id: 50
output_key: output_a
output_value: ''
-
id: 4
task_id: 50
output_key: output_b
output_value: bbb

View file

@ -36,6 +36,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578000
-
id: 2
@ -74,6 +75,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578010
-
id: 3
@ -111,6 +113,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578020
-
id: 4
@ -148,6 +151,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578030
-
id: 5
@ -185,6 +189,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578040
-
id: 6
@ -222,6 +227,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578050
-
id: 7
@ -259,6 +265,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578060
-
id: 8
@ -296,6 +303,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578070
-
id: 9
@ -333,7 +341,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1730468968
created_unix: 1672578080
-
id: 10
@ -371,6 +379,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578090
-
id: 11
@ -408,6 +417,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578100
-
id: 12
@ -445,6 +455,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578110
-
id: 13
@ -482,6 +493,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578120
-
id: 14
@ -519,6 +531,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578130
-
id: 15
@ -556,6 +569,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578140
-
id: 16
@ -593,6 +607,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578150
-
id: 17
@ -630,6 +645,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578160
-
id: 18
@ -667,6 +683,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578170
-
id: 19
@ -704,6 +721,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578180
-
id: 20
@ -741,6 +759,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578190
-
id: 21
@ -778,6 +797,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578200
-
id: 22
@ -815,6 +835,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578210
-
id: 23
@ -852,6 +873,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578220
-
id: 24
@ -889,6 +911,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578230
-
id: 25
@ -926,6 +949,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578240
-
id: 26
@ -963,6 +987,7 @@
repo_admin_change_team_access: true
theme: ""
keep_activity_private: false
created_unix: 1672578250
-
id: 27
@ -1000,6 +1025,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578260
-
id: 28
@ -1037,6 +1063,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578270
-
id: 29
@ -1074,6 +1101,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578280
-
id: 30
@ -1111,6 +1139,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578290
-
id: 31
@ -1148,6 +1177,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578300
-
id: 32
@ -1185,6 +1215,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578310
-
id: 33
@ -1222,6 +1253,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578320
-
id: 34
@ -1260,6 +1292,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578330
-
id: 35
@ -1297,6 +1330,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578340
-
id: 36
@ -1334,6 +1368,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578350
-
id: 37
@ -1371,6 +1406,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578360
-
id: 38
@ -1408,6 +1444,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578370
-
id: 39
@ -1445,6 +1482,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578380
-
id: 40
@ -1482,6 +1520,7 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578390
-
id: 41
@ -1519,3 +1558,4 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1672578400

View file

@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/container"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/timeutil"
@ -162,9 +163,22 @@ func GetBranch(ctx context.Context, repoID int64, branchName string) (*Branch, e
return &branch, nil
}
func GetBranches(ctx context.Context, repoID int64, branchNames []string) ([]*Branch, error) {
func GetBranches(ctx context.Context, repoID int64, branchNames []string, includeDeleted bool) ([]*Branch, error) {
branches := make([]*Branch, 0, len(branchNames))
return branches, db.GetEngine(ctx).Where("repo_id=?", repoID).In("name", branchNames).Find(&branches)
sess := db.GetEngine(ctx).Where("repo_id=?", repoID).In("name", branchNames)
if !includeDeleted {
sess.And("is_deleted=?", false)
}
return branches, sess.Find(&branches)
}
func BranchesToNamesSet(branches []*Branch) container.Set[string] {
names := make(container.Set[string], len(branches))
for _, branch := range branches {
names.Add(branch.Name)
}
return names
}
func AddBranches(ctx context.Context, branches []*Branch) error {
@ -417,15 +431,18 @@ func FindRecentlyPushedNewBranches(ctx context.Context, repoID, userID int64, ex
branches := make(BranchList, 0, 2)
subQuery := builder.Select("head_branch").From("pull_request").
InnerJoin("issue", "issue.id = pull_request.issue_id").
Where(builder.Eq{
"pull_request.head_repo_id": repoID,
"issue.is_closed": false,
})
Where(builder.And(
builder.Eq{"pull_request.head_repo_id": repoID},
builder.Or(
builder.Eq{"pull_request.has_merged": true},
builder.Eq{"issue.is_closed": false},
),
))
err := db.GetEngine(ctx).
Where("pusher_id=? AND is_deleted=?", userID, false).
And("name <> ?", excludeBranchName).
And("repo_id = ?", repoID).
And("commit_time >= ?", time.Now().Add(-time.Hour*6).Unix()).
And("commit_time >= ?", time.Now().Add(-time.Minute*30).Unix()).
NotIn("name", subQuery).
OrderBy("branch.commit_time DESC").
Limit(2).

View file

@ -160,34 +160,12 @@ func UpdateExternalUserByExternalID(ctx context.Context, external *ExternalLogin
return err
}
// EnsureLinkExternalToUser link the external user to the user
func EnsureLinkExternalToUser(ctx context.Context, external *ExternalLoginUser) error {
has, err := db.Exist[ExternalLoginUser](ctx, builder.Eq{
"external_id": external.ExternalID,
"login_source_id": external.LoginSourceID,
})
if err != nil {
return err
}
if has {
_, err = db.GetEngine(ctx).Where("external_id=? AND login_source_id=?", external.ExternalID, external.LoginSourceID).AllCols().Update(external)
return err
}
_, err = db.GetEngine(ctx).Insert(external)
return err
}
// FindExternalUserOptions represents an options to find external users
type FindExternalUserOptions struct {
db.ListOptions
Provider string
UserID int64
LoginSourceID int64
HasRefreshToken bool
Expired bool
OrderBy string
Provider string
UserID int64
OrderBy string
}
func (opts FindExternalUserOptions) ToConds() builder.Cond {
@ -198,22 +176,9 @@ func (opts FindExternalUserOptions) ToConds() builder.Cond {
if opts.UserID > 0 {
cond = cond.And(builder.Eq{"user_id": opts.UserID})
}
if opts.Expired {
cond = cond.And(builder.Lt{"expires_at": time.Now()})
}
if opts.HasRefreshToken {
cond = cond.And(builder.Neq{"refresh_token": ""})
}
if opts.LoginSourceID != 0 {
cond = cond.And(builder.Eq{"login_source_id": opts.LoginSourceID})
}
return cond
}
func (opts FindExternalUserOptions) ToOrders() string {
return opts.OrderBy
}
func IterateExternalLogin(ctx context.Context, opts FindExternalUserOptions, f func(ctx context.Context, u *ExternalLoginUser) error) error {
return db.Iterate(ctx, opts.ToConds(), f)
}

View file

@ -24,8 +24,8 @@ type SearchUserOptions struct {
Keyword string
Type UserType
UID int64
LoginName string // this option should be used only for admin user
SourceID int64 // this option should be used only for admin user
LoginName string // this option should be used only for admin user
SourceID optional.Option[int64] // this option should be used only for admin user
OrderBy db.SearchOrderBy
Visible []structs.VisibleType
Actor *User // The user doing the search
@ -98,8 +98,8 @@ func (opts *SearchUserOptions) toSearchQueryBase(ctx context.Context) *xorm.Sess
cond = cond.And(builder.Eq{"id": opts.UID})
}
if opts.SourceID > 0 {
cond = cond.And(builder.Eq{"login_source": opts.SourceID})
if opts.SourceID.Has() {
cond = cond.And(builder.Eq{"login_source": opts.SourceID.Value()})
}
if opts.LoginName != "" {
cond = cond.And(builder.Eq{"login_name": opts.LoginName})

View file

@ -771,11 +771,11 @@ func TestGetInactiveUsers(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
// all inactive users
// user1's createdunix is 1730468968
// user1's createdunix is 1672578000
users, err := user_model.GetInactiveUsers(db.DefaultContext, 0)
require.NoError(t, err)
assert.Len(t, users, 1)
interval := time.Now().Unix() - 1730468968 + 3600*24
interval := time.Now().Unix() - 1672578000 + 3600*24
users, err = user_model.GetInactiveUsers(db.DefaultContext, time.Duration(interval*int64(time.Second)))
require.NoError(t, err)
require.Empty(t, users)

View file

@ -72,7 +72,10 @@ func (c *HTTPClient) batch(ctx context.Context, operation string, objects []Poin
url := fmt.Sprintf("%s/objects/batch", c.endpoint)
request := &BatchRequest{operation, c.transferNames(), nil, objects}
// `ref` is an "optional object describing the server ref that the objects belong to"
// but some (incorrect) lfs servers require it, so maybe adding an empty ref here doesn't break the correct ones.
// https://github.com/git-lfs/git-lfs/blob/a32a02b44bf8a511aa14f047627c49e1a7fd5021/docs/api/batch.md?plain=1#L37
request := &BatchRequest{operation, c.transferNames(), &Reference{}, objects}
payload := new(bytes.Buffer)
err := json.NewEncoder(payload).Encode(request)
if err != nil {
@ -236,6 +239,7 @@ func createRequest(ctx context.Context, method, url string, headers map[string]s
req.Header.Set(key, value)
}
req.Header.Set("Accept", AcceptHeader)
req.Header.Set("User-Agent", UserAgentHeader)
return req, nil
}

View file

@ -14,8 +14,12 @@ import (
const (
// MediaType contains the media type for LFS server requests
MediaType = "application/vnd.git-lfs+json"
// Some LFS servers offer content with other types, so fallback to '*/*' if application/vnd.git-lfs+json cannot be served
// AcceptHeader Some LFS servers offer content with other types, so fallback to '*/*' if application/vnd.git-lfs+json cannot be served
AcceptHeader = "application/vnd.git-lfs+json;q=0.9, */*;q=0.8"
// UserAgentHeader Add User-Agent for gitea's self-implemented lfs client,
// and the version is consistent with the latest version of git lfs can be avoided incompatibilities.
// Some lfs servers will check this
UserAgentHeader = "git-lfs/3.6.0 (Forgejo)"
)
// BatchRequest contains multiple requests processed in one batch operation.

View file

@ -1,3 +1,5 @@
//go:build !go1.24
// Copyright 2022 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

View file

@ -0,0 +1,38 @@
//go:build go1.24
// Copyright 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package log
import "unsafe"
//go:linkname runtime_getProfLabel runtime/pprof.runtime_getProfLabel
func runtime_getProfLabel() unsafe.Pointer //nolint
// Struct definitions copied from: https://github.com/golang/go/blob/ca63101df47a4467bc80faa654fc19d68e583952/src/runtime/pprof/label.go
type label struct {
key string
value string
}
type LabelSet struct {
list []label
}
type labelMap struct {
LabelSet
}
func getGoroutineLabels() map[string]string {
l := (*labelMap)(runtime_getProfLabel())
if l == nil {
return nil
}
m := make(map[string]string, len(l.list))
for _, label := range l.list {
m[label.key] = label.value
}
return m
}

View file

@ -11,7 +11,6 @@ import (
"crypto/x509"
"encoding/pem"
"errors"
"fmt"
"io"
"net"
"os"
@ -33,10 +32,6 @@ import (
gossh "golang.org/x/crypto/ssh"
)
type contextKey string
const giteaKeyID = contextKey("gitea-key-id")
func getExitStatusFromError(err error) int {
if err == nil {
return 0
@ -62,7 +57,7 @@ func getExitStatusFromError(err error) int {
}
func sessionHandler(session ssh.Session) {
keyID := fmt.Sprintf("%d", session.Context().Value(giteaKeyID).(int64))
keyID := session.ConnPermissions().Extensions["forgejo-key-id"]
command := session.RawCommand()
@ -238,7 +233,10 @@ func publicKeyHandler(ctx ssh.Context, key ssh.PublicKey) bool {
if log.IsDebug() { // <- FingerprintSHA256 is kinda expensive so only calculate it if necessary
log.Debug("Successfully authenticated: %s Certificate Fingerprint: %s Principal: %s", ctx.RemoteAddr(), gossh.FingerprintSHA256(key), principal)
}
ctx.SetValue(giteaKeyID, pkey.ID)
if ctx.Permissions().Extensions == nil {
ctx.Permissions().Extensions = map[string]string{}
}
ctx.Permissions().Extensions["forgejo-key-id"] = strconv.FormatInt(pkey.ID, 10)
return true
}
@ -266,7 +264,10 @@ func publicKeyHandler(ctx ssh.Context, key ssh.PublicKey) bool {
if log.IsDebug() { // <- FingerprintSHA256 is kinda expensive so only calculate it if necessary
log.Debug("Successfully authenticated: %s Public Key Fingerprint: %s", ctx.RemoteAddr(), gossh.FingerprintSHA256(key))
}
ctx.SetValue(giteaKeyID, pkey.ID)
if ctx.Permissions().Extensions == nil {
ctx.Permissions().Extensions = map[string]string{}
}
ctx.Permissions().Extensions["forgejo-key-id"] = strconv.FormatInt(pkey.ID, 10)
return true
}

View file

@ -290,6 +290,16 @@ type CreateBranchRepoOption struct {
OldRefName string `json:"old_ref_name" binding:"GitRefName;MaxSize(100)"`
}
// UpdateBranchRepoOption options when updating a branch in a repository
// swagger:model
type UpdateBranchRepoOption struct {
// New branch name
//
// required: true
// unique: true
Name string `json:"name" binding:"Required;GitRefName;MaxSize(100)"`
}
// TransferRepoOption options when transfer a repository's ownership
// swagger:model
type TransferRepoOption struct {

View file

@ -1017,7 +1017,7 @@ commit.revert-header = إرجاع: %s
editor.file_already_exists = يوجد فعلا في هذا المستودع ملف باسم "%s".
settings.web_hook_name_matrix = متركس
editor.filename_cannot_be_empty = لا يمكن ترك اسم الملف فارغا.
editor.add_tmpl = أضف '<filename>'
editor.add_tmpl = أضف '<%s>'
editor.new_branch_name_desc = اسم الفرع الجديد…
release = إصدار
editor.delete_this_file = احذف الملف
@ -1990,4 +1990,4 @@ branch_kind = البحث ضمن الفروع...
no_results = لا توجد نتائج مطابقة.
issue_kind = البحث ضمن الأعطال...
pull_kind = البحث ضمن طلبات السحب...
keyword_search_unavailable = البحث من خلال الكلمات المفتاحية ليس متوفر حالياً. رجاءاً تواصل مع مشرف الموقع.
keyword_search_unavailable = البحث من خلال الكلمات المفتاحية ليس متوفر حالياً. رجاءاً تواصل مع مشرف الموقع.

View file

@ -831,7 +831,8 @@ file_too_large = Файлът е твърде голям, за да бъде п
commits = Подавания
commit = Подаване
editor.commit_changes = Подаване на промените
editor.add_tmpl = Добавяне на "<име на файла>"
editor.add_tmpl = Добавяне на "<%s>"
editor.add_tmpl.filename = име на файла
editor.add = Добавяне на %s
editor.delete = Изтриване на %s
editor.update = Обновяване на %s
@ -1729,4 +1730,4 @@ eib = ЕиБ
[translation_meta]
test = окей
test = окей

View file

@ -165,6 +165,7 @@ new_org.title = Nová organizace
new_repo.link = Nový repozitář
new_migrate.link = Nová migrace
new_org.link = Nová organizace
copy_path = Kopírovat cestu
[aria]
navbar=Navigační lišta
@ -1351,7 +1352,7 @@ editor.or=nebo
editor.cancel_lower=Zrušit
editor.commit_signed_changes=Odeslat podepsané změny
editor.commit_changes=Odeslat změny
editor.add_tmpl=Přidán „<filename>“
editor.add_tmpl=Přidán „<%s>“
editor.add=Přidat %s
editor.update=Aktualizovat %s
editor.delete=Odstranit %s
@ -4002,4 +4003,4 @@ actions.write = <b>Zapisovat:</b> Ručně spouštět, restartovat, rušit nebo s
ext_wiki = Přístup k odkazu v externí wiki. Oprávnění jsou spravována externě.
code.read = <b>Číst:</b> Přístup a klonování kódu v repozitáři.
issues.read = <b>Číst:</b> Číst a vytvářet problémy a komentáře.
ext_issues = Přístup k odkazu v externím sledovacím systému problémů. Oprávnění jsou spravována externě.
ext_issues = Přístup k odkazu v externím sledovacím systému problémů. Oprávnění jsou spravována externě.

View file

@ -166,6 +166,7 @@ new_org.title = Neue Organisation
new_repo.link = Neues Repository
new_migrate.link = Neue Migration
new_org.link = Neue Organisation
copy_path = Pfad kopieren
[aria]
navbar=Navigationsleiste
@ -1349,7 +1350,7 @@ editor.or=oder
editor.cancel_lower=Abbrechen
editor.commit_signed_changes=Committe signierte Änderungen
editor.commit_changes=Änderungen committen
editor.add_tmpl=„<filename>“ hinzufügen
editor.add_tmpl=„<%s>“ hinzufügen
editor.add=%s hinzugefügt
editor.update=%s aktualisiert
editor.delete=%s gelöscht
@ -4006,4 +4007,4 @@ actions.read = <b>Lesen:</b> Integrierte CI/CD-Pipelines und ihre Logs betrachte
actions.write = <b>Schreiben:</b> Ausstehende CI/CD-Pipelines manuell auslösen, neustarten, abbrechen oder genehmigen.
ext_issues = Zugriff auf den Link zu einem externen Issue-Tracker. Die Berechtigungen werden extern verwaltet.
ext_wiki = Zugriff auf den Link zu einem externen Wiki. Die Berechtigungen werden extern verwaltet.
pulls.write = <b>Schreiben:</b> Pull-Requests schließen und Metadaten wie Labels, Meilensteine, Zuweisungen, Fälligkeitsdaten und Abhängigkeiten verwalten.
pulls.write = <b>Schreiben:</b> Pull-Requests schließen und Metadaten wie Labels, Meilensteine, Zuweisungen, Fälligkeitsdaten und Abhängigkeiten verwalten.

View file

@ -1340,7 +1340,7 @@ editor.or=ή
editor.cancel_lower=Ακύρωση
editor.commit_signed_changes=Υποβολή υπογεγραμμένων αλλαγών
editor.commit_changes=Υποβολή αλλαγών
editor.add_tmpl=Προσθήκη «<filename
editor.add_tmpl=Προσθήκη «<%s
editor.add=Προσθήκη %s
editor.update=Ενημέρωση %s
editor.delete=Διαγραφή %s
@ -3945,4 +3945,4 @@ filepreview.lines = Γραμμές %[1]d έως %[2]d στο αρχείο %[3]s
filepreview.truncated = Η προεπισκόπηση έχει περικοπεί
[translation_meta]
test = ok
test = ok

View file

@ -823,7 +823,7 @@ manage_emails = Manage email addresses
manage_themes = Default theme
manage_openid = OpenID addresses
email_desc = Your primary email address will be used for notifications, password recovery and, provided that it is not hidden, web-based Git operations.
theme_desc = This will be your default theme across the site.
theme_desc = This theme will be used for the web interface when you are logged in.
primary = Primary
activated = Activated
requires_activation = Requires activation
@ -1052,7 +1052,7 @@ admin.update_flags = Update flags
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? <a href="%s">Migrate repository.</a>
new_repo_helper = A repository contains all project files, including revision history. Already hosting one elsewhere? <a href="%s">Migrate repository</a>.
owner = Owner
owner_helper = Some organizations may not show up in the dropdown due to a maximum repository count limit.
repo_name = Repository name
@ -1093,7 +1093,7 @@ issue_labels = Labels
issue_labels_helper = Select a label set
license = License
license_helper = Select a license file
license_helper_desc = A license governs what others can and can't do with your code. Not sure which one is right for your project? See <a target="_blank" rel="noopener noreferrer" href="%s">Choose a license.</a>
license_helper_desc = A license governs what others can and can't do with your code. Not sure which one is right for your project? See <a target="_blank" rel="noopener noreferrer" href="%s">Choose a license</a>.
object_format = Object format
object_format_helper = Object format of the repository. Cannot be changed later. SHA1 is the most compatible.
readme = README
@ -1370,7 +1370,8 @@ editor.or = or
editor.cancel_lower = Cancel
editor.commit_signed_changes = Commit signed changes
editor.commit_changes = Commit changes
editor.add_tmpl = Add "<filename>"
editor.add_tmpl = Add "<%s>"
editor.add_tmpl.filename = filename
editor.add = Add %s
editor.update = Update %s
editor.delete = Delete %s
@ -2582,12 +2583,12 @@ settings.archive.text = Archiving the repo will make it entirely read-only. It w
settings.archive.success = The repo was successfully archived.
settings.archive.error = An error occurred while trying to archive the repo. See the log for more details.
settings.archive.error_ismirror = You cannot archive a mirrored repo.
settings.archive.branchsettings_unavailable = Branch settings are not available if the repo is archived.
settings.archive.tagsettings_unavailable = Tag settings are not available if the repo is archived.
settings.archive.mirrors_unavailable = Mirrors are not available if the repo is archived.
settings.archive.branchsettings_unavailable = Branch settings are not available in archived repos.
settings.archive.tagsettings_unavailable = Tag settings are not available in archived repos.
settings.archive.mirrors_unavailable = Mirrors are not available in archived repos.
settings.unarchive.button = Unarchive repo
settings.unarchive.header = Unarchive this repo
settings.unarchive.text = Unarchiving the repo will restore its ability to receive commits and pushes, as well as new issues and pull-requests.
settings.unarchive.text = Unarchiving the repo will restore its ability to receive commits and pushes, as well as new issues and pull requests.
settings.unarchive.success = The repo was successfully unarchived.
settings.unarchive.error = An error occurred while trying to unarchive the repo. See the log for more details.
settings.update_avatar_success = The repository avatar has been updated.
@ -3494,7 +3495,7 @@ self_check.no_problem_found = No problem found yet.
self_check.database_collation_mismatch = Expect database to use collation: %s
self_check.database_collation_case_insensitive = Database is using a collation %s, which is an insensitive collation. Although Forgejo could work with it, there might be some rare cases which don't work as expected.
self_check.database_inconsistent_collation_columns = Database is using collation %s, but these columns are using mismatched collations. It might cause some unexpected problems.
self_check.database_fix_mysql = For MySQL/MariaDB users, you could use the "gitea doctor convert" command to fix the collation problems, or you could also fix the problem by "ALTER ... COLLATE ..." SQLs manually.
self_check.database_fix_mysql = For MySQL/MariaDB users, you could use the "forgejo doctor convert" command to fix the collation problems, or you could also fix the problem by "ALTER ... COLLATE ..." SQLs manually.
[action]
create_repo = created repository <a href="%s">%s</a>
@ -3628,7 +3629,7 @@ alpine.registry = Setup this registry by adding the url in your <code>/etc/apk/r
alpine.registry.key = Download the registry public RSA key into the <code>/etc/apk/keys/</code> folder to verify the index signature:
alpine.registry.info = Choose $branch and $repository from the list below.
alpine.install = To install the package, run the following command:
alpine.repository = Repository Info
alpine.repository = Repository info
alpine.repository.branches = Branches
alpine.repository.repositories = Repositories
alpine.repository.architectures = Architectures
@ -3637,7 +3638,7 @@ arch.pacman.repo.multi = %s has the same version in different distributions.
arch.pacman.repo.multi.item = Configuration for %s
arch.pacman.conf = Add server with related distribution and architecture to <code>/etc/pacman.conf</code> :
arch.pacman.sync = Sync package with pacman:
arch.version.properties = Version Properties
arch.version.properties = Version properties
arch.version.description = Description
arch.version.provides = Provides
arch.version.groups = Group
@ -3655,18 +3656,19 @@ chef.install = To install the package, run the following command:
composer.registry = Setup this registry in your <code>~/.composer/config.json</code> file:
composer.install = To install the package using Composer, run the following command:
composer.dependencies = Dependencies
composer.dependencies.development = Development Dependencies
composer.dependencies.development = Development dependencies
conan.details.repository = Repository
conan.registry = Setup this registry from the command line:
conan.install = To install the package using Conan, run the following command:
conda.registry = Setup this registry as a Conda repository in your <code>.condarc</code> file:
conda.install = To install the package using Conda, run the following command:
container.details.type = Image Type
container.images.title = Images
container.details.type = Image type
container.details.platform = Platform
container.pull = Pull the image from the command line:
container.digest = Digest:
container.digest = Digest
container.multi_arch = OS / Arch
container.layers = Image Layers
container.layers = Image layers
container.labels = Labels
container.labels.key = Key
container.labels.value = Value
@ -3694,10 +3696,10 @@ npm.registry = Setup this registry in your project <code>.npmrc</code> file:
npm.install = To install the package using npm, run the following command:
npm.install2 = or add it to the package.json file:
npm.dependencies = Dependencies
npm.dependencies.development = Development Dependencies
npm.dependencies.bundle = Bundled Dependencies
npm.dependencies.peer = Peer Dependencies
npm.dependencies.optional = Optional Dependencies
npm.dependencies.development = Development dependencies
npm.dependencies.bundle = Bundled dependencies
npm.dependencies.peer = Peer dependencies
npm.dependencies.optional = Optional dependencies
npm.details.tag = Tag
pub.install = To install the package using Dart, run the following command:
pypi.requires = Requires Python
@ -3711,8 +3713,8 @@ rpm.repository.architectures = Architectures
rpm.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
rubygems.dependencies.development = Development Dependencies
rubygems.dependencies.runtime = Runtime dependencies
rubygems.dependencies.development = Development dependencies
rubygems.required.ruby = Requires Ruby version
rubygems.required.rubygems = Requires RubyGem version
swift.registry = Setup this registry from the command line:
@ -3903,3 +3905,5 @@ 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 :)

View file

@ -166,6 +166,7 @@ new_org.title = Nueva organización
new_repo.link = Nuevo repositorio
new_migrate.link = Nueva migración
new_org.link = Nueva organización
copy_path = Copiar ruta
[aria]
navbar=Barra de navegación
@ -1346,7 +1347,7 @@ editor.or=o
editor.cancel_lower=Cancelar
editor.commit_signed_changes=Crear commit firmado de los cambios
editor.commit_changes=Crear commit de los cambios
editor.add_tmpl=Añadir "<filename>"
editor.add_tmpl=Añadir "<%s>"
editor.add=Añadir %s
editor.update=Actualizar %s
editor.delete=Eliminar %s
@ -2319,23 +2320,23 @@ settings.event_issues_desc=Incidencia abierta, cerrada, reabierta o editada.
settings.event_issue_assign=Asignación
settings.event_issue_assign_desc=Incidencia asignada o no asignada.
settings.event_issue_label=Etiquetas
settings.event_issue_label_desc=Etiqueta de incidencia actualizada o borrada.
settings.event_issue_milestone=Hito asignado a incidencia
settings.event_issue_milestone_desc=Hito de incidencia establecido o desestablecido.
settings.event_issue_comment=Comentario de incidencia
settings.event_issue_label_desc=Etiqueta de incidencia añadida o borrada.
settings.event_issue_milestone=Hitos
settings.event_issue_milestone_desc=Hito añadido, borrado o modificado.
settings.event_issue_comment=Comentarios
settings.event_issue_comment_desc=Comentario de incidencias creado, editado o borrado.
settings.event_header_pull_request=Eventos de pull requests
settings.event_pull_request=Pull request
settings.event_pull_request=Modificación
settings.event_pull_request_desc=Pull request abierto, cerrado, reabierto o editado.
settings.event_pull_request_assign=Pull request asignado
settings.event_pull_request_assign=Asignación
settings.event_pull_request_assign_desc=Pull Request asignado o no asignado.
settings.event_pull_request_label=Pull request etiquetado
settings.event_pull_request_label=Etiquetas
settings.event_pull_request_label_desc=Etiqueta de pull request actualizada o borrada.
settings.event_pull_request_milestone=Hito asignado a pull request
settings.event_pull_request_milestone=Hitos
settings.event_pull_request_milestone_desc=Hitos añadidos, eliminados o modificados.
settings.event_pull_request_comment=Comentarios
settings.event_pull_request_comment_desc=Comentario de pull request creado, editado o borrado.
settings.event_pull_request_review=Pull request revisado
settings.event_pull_request_review=Revisiones
settings.event_pull_request_review_desc=Pull request aprobada, rechazada o comentarios de revisión añadidos.
settings.event_pull_request_sync=Sincronizado
settings.event_pull_request_sync_desc=Pull request sincronizado.
@ -2471,17 +2472,17 @@ settings.tags.protection.pattern=Patrón de etiquetas
settings.tags.protection.allowed=Permitido
settings.tags.protection.allowed.users=Usuarios permitidos
settings.tags.protection.allowed.teams=Equipos permitidos
settings.tags.protection.allowed.noone=Ningún
settings.tags.protection.create=Proteger Etiqueta
settings.tags.protection.allowed.noone=Ningúno
settings.tags.protection.create=Añadir regla
settings.tags.protection.none=No hay etiquetas protegidas.
settings.tags.protection.pattern.description=Puede usar un solo nombre, un patrón de glob o expresión regular para que coincida con varias etiquetas. Lea más en la guía <a target="_blank" rel="noopener" href="%s">de etiquetas protegidas</a>.
settings.bot_token=Token del Bot
settings.bot_token=Token del bot
settings.chat_id=ID Chat
settings.thread_id=ID del hilo
settings.matrix.homeserver_url=URL de Homeserver
settings.matrix.room_id=ID de sala
settings.matrix.message_type=Tipo de mensaje
settings.archive.button=Archivar Repositorio
settings.archive.button=Archivar repositorio
settings.archive.header=Archivar este repositorio
settings.archive.text=Archivar el repositorio lo hará de sólo lectura. Se ocultará del tablero. Nadie (¡ni siquiera tú!) será capaz de hacer nuevos commits, o abrir nuevas incidencias o pull requests.
settings.archive.success=El repositorio ha sido archivado exitosamente.
@ -2502,7 +2503,7 @@ settings.lfs_findcommits=Encontrar consignas
settings.lfs_lfs_file_no_commits=No se encontraron commits para este archivo LFS
settings.lfs_noattribute=Esta ruta no tiene el atributo bloqueable en la rama por defecto
settings.lfs_delete=Eliminar archivo LFS con el OID %s
settings.lfs_delete_warning=Eliminar un archivo LFS puede causar errores de 'objeto no existe' en la compra. ¿Está seguro?
settings.lfs_delete_warning=Eliminar un archivo LFS puede causar errores de 'objeto no existe' durante un checkout. ¿Está seguro?
settings.lfs_findpointerfiles=Buscar de punteros LFS
settings.lfs_locks=Bloqueos
settings.lfs_invalid_locking_path=Ruta no válida: %s
@ -2514,7 +2515,7 @@ settings.lfs_locks_no_locks=Sin bloqueos
settings.lfs_lock_file_no_exist=El archivo bloqueado no existe en la rama por defecto
settings.lfs_force_unlock=Forzar desbloqueo
settings.lfs_pointers.found=Encontrados %d punteros - %d asociados, %d no asociados (%d falta en el almacén)
settings.lfs_pointers.sha=Blob SHA
settings.lfs_pointers.sha=Blob hash
settings.lfs_pointers.oid=OID
settings.lfs_pointers.inRepo=En repositorio
settings.lfs_pointers.exists=Existe en almacén
@ -2527,17 +2528,17 @@ settings.rename_branch_from=nombre de la rama vieja
settings.rename_branch_to=nombre de la rama nueva
settings.rename_branch=Renombrar rama
diff.browse_source=Explorar el Código
diff.browse_source=Explorar el código
diff.parent=padre
diff.commit=commit
diff.git-notes=Notas
diff.data_not_available=El contenido del Diff no está disponible
diff.options_button=Opciones de diferencias
diff.data_not_available=El contenido del diff no está disponible
diff.options_button=Opciones de diff
diff.show_diff_stats=Mostrar estadísticas
diff.download_patch=Descargar archivo de parche
diff.download_diff=Descargar archivo de diferencias
diff.download_diff=Descargar archivo de diff
diff.show_split_view=Dividir vista
diff.show_unified_view=Unificar vista
diff.show_unified_view=Vista unificada
diff.whitespace_button=Espacio blanco
diff.whitespace_show_everything=Mostrar todos los cambios
diff.whitespace_ignore_all_whitespace=Ignorar espacio en blanco al comparar líneas
@ -2547,7 +2548,7 @@ diff.stats_desc=Se han <strong>modificado %d ficheros</strong> con <strong>%d ad
diff.stats_desc_file=%d cambios: %d adiciones y %d eliminaciones
diff.bin=BIN
diff.bin_not_shown=Archivo binario no mostrado.
diff.view_file=Ver fichero
diff.view_file=Ver archivo
diff.file_before=Antes
diff.file_after=Después
diff.file_image_width=Anchura
@ -2556,8 +2557,8 @@ diff.file_byte_size=Tamaño
diff.file_suppressed=La diferencia del archivo ha sido suprimido porque es demasiado grande
diff.file_suppressed_line_too_long=Las diferiencias del archivo han sido suprimidas porque una o mas lineas son muy largas
diff.too_many_files=Algunos archivos no se mostraron porque demasiados archivos han cambiado en esta diferencia
diff.show_more=Ver más
diff.load=Cargar Diff
diff.show_more=Mostrar más
diff.load=Cargar diff
diff.generated=generado
diff.vendored=vendido
diff.comment.add_line_comment=Añadir comentario en línea
@ -2567,7 +2568,7 @@ diff.comment.add_single_comment=Añadir solo comentario
diff.comment.add_review_comment=Añadir comentario
diff.comment.start_review=Comenzar revisión
diff.comment.reply=Responder
diff.review=Revisión
diff.review=Finalizar revisión
diff.review.header=Enviar revisión
diff.review.placeholder=Comentario de revisión
diff.review.comment=Comentario
@ -2593,11 +2594,11 @@ release.draft=Borrador
release.prerelease=Pre-lanzamiento
release.stable=Estable
release.compare=Comparar
release.edit=editar
release.edit=Editar
release.ahead.commits=<strong>%d</strong> commits
release.ahead.target=a %s desde esta versión
tag.ahead.target=a %s desde esta etiqueta
release.source_code=Código Fuente
release.source_code=Código fuente
release.new_subheader=Los lanzamientos organizan las versiones de proyectos.
release.edit_subheader=Los lanzamientos organizan las versiones de proyectos.
release.tag_name=Nombre de la etiqueta
@ -2608,15 +2609,15 @@ release.tag_helper_existing=Etiqueta actual.
release.title=Título de lanzamiento
release.title_empty=El título no puede estar vacío.
release.message=Describe esta versión
release.prerelease_desc=Marcar como Pre-Lanzamiento
release.prerelease_desc=Marcar como pre-lanzamiento
release.prerelease_helper=Marcar este lanzamiento como no es adecuada para usar en producción.
release.cancel=Cancelar
release.publish=Publicar lanzamiento
release.save_draft=Guardar borrador
release.edit_release=Actualizar Lanzamiento
release.delete_release=Eliminar Lanzamiento
release.delete_tag=Eliminar Etiqueta
release.deletion=Eliminar Lanzamiento
release.delete_tag=Eliminar tag
release.deletion=Eliminar lanzamiento
release.deletion_desc=Eliminar un lanzamiento sólo lo elimina de Forgejo. No afectará la etiqueta Git, el contenido de su repositorio o su historial. ¿Continuar?
release.deletion_success=El lanzamiento ha sido eliminado.
release.deletion_tag_desc=Eliminará esta etiqueta del repositorio. El contenido del repositorio y el historial permanecerán sin cambios. ¿Continuar?
@ -2628,14 +2629,14 @@ release.tag_already_exist=Este nombre de etiqueta ya existe.
release.downloads=Descargas
release.download_count=Descargas: %s
release.add_tag_msg=Utilice el título y el contenido de la liberación como mensaje de etiqueta.
release.add_tag=Crear solo etiqueta
release.add_tag=Crear tag
release.releases_for=Lanzamientos para %s
release.tags_for=Etiquetas para %s
branch.name=Nombre de la rama
branch.already_exists=Una rama llamada "%s" ya existe.
branch.delete_head=Eliminar
branch.delete=`Eliminar rama "%s "`
branch.delete=Eliminar rama "%s "
branch.delete_html=Eliminar rama
branch.delete_desc=Eliminar una rama es permanente. Aunque la rama eliminada puede continuar existiendo durante un corto tiempo antes de que sea eliminada, en la mayoría de los casos NO PUEDE deshacerse. ¿Continuar?
branch.deletion_success=La rama "%s" ha sido eliminada.
@ -2652,9 +2653,9 @@ branch.restore_success=La rama "%s" ha sido restaurada.
branch.restore_failed=Error al restaurar la rama "%s".
branch.protected_deletion_failed=La rama "%s" está protegida. No se puede eliminar.
branch.default_deletion_failed=La rama "%s" es la rama por defecto. No se puede eliminar.
branch.restore=`Restaurar rama "%s"`
branch.download=`Descargar rama "%s"`
branch.rename=`Renombrar rama "%s"`
branch.restore=Restaurar rama "%s"
branch.download=Descargar rama "%s"
branch.rename=Renombrar rama "%s"
branch.search=Buscar rama
branch.included_desc=Esta rama forma parte de la predeterminada
branch.included=Incluida
@ -2678,9 +2679,9 @@ tag.create_success=La etiqueta "%s" ha sido creada.
topic.manage_topics=Administrar temas
topic.done=Hecho
topic.count_prompt=No puede seleccionar más de 25 temas
topic.format_prompt=Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y puntos ('. ), puede tener hasta 35 caracteres de largo. Las letras deben estar en minúsculas.
topic.format_prompt=Los temas deben comenzar con una letra o número, pueden incluir guiones ("-") y puntos ("."), puede tener hasta 35 caracteres de largo. Las letras deben estar en minúsculas.
find_file.go_to_file=Ir al archivo
find_file.go_to_file=Buscar un archivo
find_file.no_matching=No se encontró ningún archivo que coincidiese
error.csv.too_large=No se puede renderizar este archivo porque es demasiado grande.
@ -2795,19 +2796,37 @@ settings.confirmation_string = Cadena de confirmación
issues.filter_sort.relevance = Relevancia
settings.transfer_quota_exceeded = El nuevo propietario (%s) ha sobrepasado la cuota. El repositorio no ha sido transferido.
settings.web_hook_name_sourcehut_builds = Builds de SourceHut
settings.wiki_rename_branch_main_notices_2 =
settings.wiki_rename_branch_main_notices_2 =
settings.wiki_rename_branch_main = Normalizar el nombre de la rama de la wiki
settings.wiki_rename_branch_main_desc = Renombrar la rama interna usada por la wiki a "%s". Este cambio es permanente y no se puede deshacer.
settings.confirm_wiki_branch_rename = Renombrar la rama de la wiki
settings.graphql_url = URL de GraphQL
settings.sourcehut_builds.manifest_path = Ruta del manifiesto de compilación
settings.sourcehut_builds.secrets = Secretos
release.system_generated = Este archivo adjunto se genera automaticamente.
release.asset_external_url = URL externa
release.hide_archive_links = Ocultar archivos generados automaticamente
settings.mirror_settings.pushed_repository = Repositorio pusheado
settings.rename_branch_failed_protected = No se puede renombrar la rama %a porque es un rama protegida.
release.invalid_external_url = URL externa inválida: %s
release.download_count_one = %s descarga
diff.git-notes.add = Añadir nota
diff.git-notes.remove-header = Eliminar nota
release.download_count_few = %s descargas
diff.git-notes.remove-body = Esta nota se eliminará.
[graphs]
component_loading = Cargando %s...
component_loading_failed = No se pudo cargar %s
contributors.what = contribuciones
recent_commits.what = commits recientes
code_frequency.what = frecuencia de código
[org]
org_name_holder=Nombre de la organización
org_full_name_holder=Nombre completo de la organización
org_name_helper=Los nombres de organización deben ser cortos y destacados.
create_org=Crear Organización
create_org=Crear organización
repo_updated=Actualizado %s
members=Miembros
teams=Equipos
@ -2926,6 +2945,7 @@ teams.all_repositories_admin_permission_desc=Este equipo concede a <strong>Admin
teams.invite.title=Has sido invitado a unirte al equipo <strong>%s</strong> en la organización <strong>%s</strong>.
teams.invite.by=Invitado por %s
teams.invite.description=Por favor, haga clic en el botón de abajo para unirse al equipo.
follow_blocked_user = No puedes seguir a esta organización porque esta organización te ha bloqueado.
[admin]
dashboard=Panel de control
@ -3842,4 +3862,22 @@ regexp_tooltip = Interpretar los términos de búsqueda como una expresión regu
[markup]
filepreview.lines = Líneas %[1]d a %[2]d en %[3]s
filepreview.line = Línea %[1]d en %[2]s
filepreview.line = Línea %[1]d en %[2]s
[repo.permissions]
pulls.read = <b>Lectura:</b> Leer y crear pull requests.
releases.write = <b>Write:</b> Publicar, editar y eliminar lanzamientos y sus archivos.
packages.read = <b>Lectura:</b> Ver y descargar paquetes asignados al repositorio.
wiki.read = <b>Lectura:</b> Leer la wiki integrada y su historial.
issues.read = <b>Lectura:</b> Leer y crear incidencias y comentarios.
pulls.write = <b>Escritura:</b> Cerrar pull requests y gestionar metadatos como etiquetas, hitos, asignaciones, fechas de vencimiento y dependencias.
releases.read = <b>Lectura:</b> Ver y descagar lanzamientos.
wiki.write = <b>Escritura:</b> Crear, actualizar y eliminar páginas en la wiki integrada.
projects.read = <b>Lectura:</b> Acceso a las tablas de proyecto del repositorio.
projects.write = <b>Escritura:</b> Crear proyectos y columnas y editarlos.
ext_issues = Acceder al enlace del getsor de incidencias externo. Los permisos se gestionan de forma externa.
code.read = <b>Lectura:</b> Acceso y clonar el codigo del repositorio.
ext_wiki = Acceder al enlace de la wiki externa. Los permisos se gestionan de forma externa.
code.write = <b>Escritura:</b> Push al repositorio, crear ramas y tags.
issues.write = <b>Escritura:</b> Cerrar incidencias y gestion de metadatos como etiquetas, hitos, asignaciones, fechas de vencimiento y dependencias.
packages.write = <b>Escritura:</b> Publicar y eliminar paquetes asignados al repositorio.

View file

@ -981,7 +981,7 @@ editor.or=یا
editor.cancel_lower=انصراف
editor.commit_signed_changes=اعمال تغییرات امضا شده
editor.commit_changes=تغییرات کامیت
editor.add_tmpl=افزودن '<filename>'
editor.add_tmpl=افزودن '<%s>'
editor.commit_message_desc=توضیحی تخصصی به دلخواه اضافه نمایید…
editor.signoff_desc=یک تریلر Signed-off-by توسط committer در انتهای پیام گزارش commit اضافه کنید.
editor.commit_directly_to_this_branch=ثبت کامیت به صورت مستقیم در انشعاب <strong class="%[2]s">%[1]s</strong>.
@ -2668,4 +2668,4 @@ symbolic_link=پیوند نمادین
executable_file = فایل اجرایی
normal_file = فایل معمولی
changed_filemode = %[1] ها ← %[2] ها
directory = پوشه
directory = پوشه

View file

@ -175,7 +175,7 @@ footer = Alatunniste
[heatmap]
less = Vähemmän
more = Enemmän
number_of_contributions_in_the_last_12_months = %s kontribuutiota viimeisimmän vuoden aikana
number_of_contributions_in_the_last_12_months = %s kontribuutiota viimeisen vuoden aikana
contributions_zero = Ei kontribuutioita
contributions_one = kontribuutio
contributions_few = kontribuutiota
@ -972,7 +972,7 @@ editor.or=tai
editor.cancel_lower=Peru
editor.commit_signed_changes=Commitoi vahvistetut muutokset
editor.commit_changes=Kommitoi muutokset
editor.add_tmpl=Lisää "<filename>"
editor.add_tmpl=Lisää "<%s>"
editor.commit_directly_to_this_branch=Commitoi suoraan <strong class="%[2]s">%[1]s</strong> haaraan.
editor.create_new_branch=Luo <strong>uusi haara</strong> tälle commitille ja aloita vetopyyntö.
editor.create_new_branch_np=Luo <strong>uusi haara</strong> tälle commitille.
@ -2592,4 +2592,4 @@ milestone_kind = Etsi merkkipaaluja...
pull_kind = Etsi pull-vetoja...
commit_kind = Etsi kommitteja...
fuzzy = Sumea
runner_kind = Etsi ajajia...
runner_kind = Etsi ajajia...

View file

@ -146,6 +146,7 @@ new_repo.link = Bagong repositoryo
new_migrate.link = Bagong paglipat
new_org.link = Bagong organisasyon
new_org.title = Bagong organisasyon
copy_path = Kopyahin ang path
[home]
search_repos = Maghanap ng Repository…
@ -1120,7 +1121,7 @@ editor.preview_changes = I-preview ang mga pagbago
editor.edit_this_file = Baguhin ang file
commits.author = May-akda
commits.older = Mas luma
editor.add_tmpl = Idagdag ang "<filename>"
editor.add_tmpl = Idagdag ang "<%s>"
delete_preexisting = Burahin ang mga dating umiiral na file
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
@ -1476,7 +1477,7 @@ wiki.page_title = Pamagat ng pahina
issues.lock_confirm = Kandaduhin
issues.stop_tracking_history = `itinigil ang trabaho %s`
issues.label_delete = Burahin
milestones.closed = Isinara %s
milestones.closed = Isinara ang %s
issues.unlock_confirm = I-unlock
milestones.open = Buksan
issues.content_history.delete_from_history = Burahin mula sa kasaysayan
@ -1498,14 +1499,14 @@ editor.directory_is_a_file = Ang pangalan ng direktoryo "%s" ay ginagamit na bil
pulls.merged_by =ni/ng <a href="%[2]s">%[3]s</a> ay naisama %[1]s
commitstatus.pending = Nakabinbin
issues.review.pending = Nakabinbin
pulls.status_checking = Nakabinbin ang ilang mga [pagsusuri]
pulls.status_checking = Nakabinbin ang ilang mga pagsusuri
editor.file_changed_while_editing = Ang nilalaman ng file ay nagbago mula noong nagsimula kang mag-edit. <a target="_blank" rel="noopener noreferrer" href="%s">Mag-click dito</a> upang makita ang mga pagbabago o <strong>Mag-commit ng mga pagbabago muli</strong> para i-overwrite sila.
editor.file_already_exists = Umiiral na ang file na may pangalang "%s" sa repositoryong ito.
issues.review.review = Suriin
activity.git_stats_push_to_branch = sa %s at
activity.git_stats_and_deletions = at
issues.new.no_projects = Walang mga proyekto
pulls.auto_merge_button_when_succeed = (Kung nagtagumpay ang mga [check])
pulls.auto_merge_button_when_succeed = (Kung magtagumpay ang mga pagsusuri)
activity.git_stats_on_default_branch = Sa %s,
activity.period.quarterly = 3 buwan
issues.review.left_comment = nagiwan ang komento
@ -1532,9 +1533,9 @@ settings.transfer_owner = Bagong may-ari
pulls.tab_conversation = Pag-uusap
pulls.tab_files = Mga nabagong file
settings.new_owner_blocked_doer = Hinarang ka ng bagong may-ari.
settings.transfer.rejected = Tinanggihan ang paglipat ng [repository].
settings.transfer.success = Matagumpay na inilipat ang [repository].
settings.transfer.modal.title = Ilipat ang [ownership]
settings.transfer.rejected = Tinanggihan ang paglipat ng repositoryo.
settings.transfer.success = Matagumpay na inilipat ang repositoryo.
settings.transfer.modal.title = Ilipat ang pagmamay-ari
diff.view_file = Tingnan ang file
diff.parent =magulang
diff.stats_desc = <strong>%d nabagong mga file</strong> na may <strong> %d mga pagdagdag</strong> at <strong> %d mga pagtanggal</strong>
@ -1612,8 +1613,8 @@ diff.review.reject = Hilingin ang mga pagbago
diff.whitespace_show_everything = Ipakita lahat ng pagbago
issues.review.approve = inaprubahan ang mga pagbabagong ito %s
diff.review.approve = Aprubahin
settings.event_pull_request_review_desc = Inapruba, tinatanggihan o [komento ng pagsuri] ang [pull request].
settings.event_pull_request_review = Sinusuri na ang [pull request]
settings.event_pull_request_review_desc = Inapruba, tinatanggihan o gumawa ng komento sa pagsuri sa hiling sa paghila.
settings.event_pull_request_review = Mga pagsusuri
diff.whitespace_button = Puting espasyo
diff.review.self_reject = Hindi makakahiling ng nga pagbago ang mga may-akda ng [pull request] sa kanilang sariling [pull request]
diff.review.self_approve = Hindi maka-apruba ang mga may-akda ng [pull request] sa kanilang sariling [pull request]
@ -1706,7 +1707,7 @@ issues.filter_milestone_all = Lahat ng mga milestone
issues.filter_sort.mostforks = Pinakamaraming fork
issues.action_assignee = Mangangasiwa
issues.change_ref_at = `binago ang sangguni mula <b><strike>%s</strike></b> sa <b>%s</b> %s`
pulls.cmd_instruction_merge_desc = Isama ang mga pagbago at [update] sa Forgejo.
pulls.cmd_instruction_merge_desc = Isama ang mga pagbago at i-update sa Forgejo.
issues.dependency.issue_close_blocks = Hinarangan ng isyung ito mula sa pagsara ng mga sumusunod na isyu
issues.dependency.issue_closing_blockedby = Hinarangan mula sa pagsara ng isyung ito ng mga sumusunod na isyu
pulls.status_checks_requested = Kinakailangan
@ -1778,7 +1779,7 @@ issues.sign_in_require_desc = <a href="%s">Mag-sign in</a> upang sumali sa usapa
issues.num_comments = %d mga komento
issues.role.contributor_helper = Nakaraang nag-commit ang user na ito sa repositoryo na ito.
issues.comment_pull_merged_at = isinama ang commit %[1]s sa %[2]s %[3]s
pulls.commit_ref_at = ` isinangguni ang [pull request] mula sa isang [commit]<a id="%[1]s" href="#%[1]s">%[2]s</a>`
pulls.commit_ref_at = `isinangguni ang hiling sa paghila mula sa isang commit <a id="%[1]s" href="#%[1]s">%[2]s</a>`
wiki.last_commit_info = Binago ni %s ang pahinang ito %s
issues.content_history.edited = binago
issues.ref_pull_from = `<a href="%[3]s">isinangguni ang hiling sa paghila na ito %[4]s </a><a id="%[1]s" href="#%[1]s">%[2]s</a>`
@ -1789,11 +1790,11 @@ settings.federation_following_repos = Mga URL ng Mga Sinusundang Repositoryo. Hi
diff.comment.reply = Tumugon
pulls.create = Gumawa ng hiling sa paghila
issues.dependency.pr_close_blocked = Kailangan mong isara ang lahat ng mga isyu na humaharang sa hiling sa paghila na ito bago mo ito isama.
pulls.delete.title = Burahin ang [pull request] na ito?
pulls.delete.title = Burahin ang hiling sa paghila na ito?
issues.dependency.pr_closing_blockedby = Hinarang ng mga sumusunod na isyu mula sa pagsara ng hiling sa paghila na ito
pulls.closed_at = `isinara ang [pull request] na ito<a id="%[1]s" href="#%[1]s">%[2]s</a>`
pulls.close = Isara ang [pull request]
pulls.cmd_instruction_hint = `Tingnan ang mga panuto para sa linya ng utos.`
pulls.closed_at = `isinara ang hiling sa paghila na <a id="%[1]s" href="#%[1]s">%[2]s</a>`
pulls.close = Isara ang hiling sa paghila
pulls.cmd_instruction_hint = Tingnan ang mga panuto para sa command line
project = Mga proyekto
issues.content_history.deleted = binura
pulls.no_results = Walang mga nahanap na resulta.
@ -1810,7 +1811,7 @@ pulls.merged_title_desc_one = isinali ang %[1]d commit mula<code>%[2]s</code> pa
pull.deleted_branch = (binura):%s
issues.dependency.pr_close_blocks = Hinarang ng hiling sa paghila na ito mula sa pagsara ng mga sumusunod na isyu
issues.reference_issue.body = Katawan
pulls.recently_pushed_new_branches = Itinulak mo sa [branch]<a href="%[3]s"> <strong>%[1]s</strong></a>%[2]s
pulls.recently_pushed_new_branches = Nagtulak sa branch na <a href="%[3]s"> <strong>%[1]s</strong></a> %[2]s
issues.add_time_minutes = Minuto
issues.del_time = Burahin ang log ng oras na ito
issues.stop_tracking = Itigil ang orasan
@ -1847,7 +1848,7 @@ subscribe.pull.guest.tooltip = Mag-sign in para mag-subscribe sa hiling sa paghi
issues.edit.already_changed = Hindi maimbak ang mga pagbabago sa isyu. Mukhang nabago na ng ibang tagagamit ang nilalaman. Mangyaring i-refresh ang pahina at subukang baguhin muli upang maiwasang ma-overwrite ang kanilang pagbago
signing.wont_sign.not_signed_in = Hindi ka naka-sign in.
activity.new_issues_count_n = Bagong mga isyu
activity.git_stats_files_changed_n = mga nabago
activity.git_stats_files_changed_n = ay nabago
activity.git_stats_files_changed_1 = ang nabago
issues.dependency.remove = Tanggalin
pulls.edit.already_changed = Hindi maimbak ang mga pagbabago sa hiling sa paghila. Mukhang nabago na ng ibang tagagamit ang nilalaman. Mangyaring i-refresh ang pahina at subukang baguhin muli upang maiwasang ma-overwrite ang kanilang pagbago
@ -1870,11 +1871,11 @@ activity.git_stats_deletion_1 = %d pagbura
activity.git_stats_deletion_n = %d mga pagbura
activity.navbar.code_frequency = Dalas ng code
pulls.switch_head_and_base = Ilipat ang ulo at base
activity.git_stats_push_to_all_branches = sa lahat ng mga [branch].
activity.git_stats_push_to_all_branches = sa lahat ng mga branch.
activity.git_stats_pushed_n = itinulak ang
issues.reference_link = Pagsangguni: %s
activity.git_stats_pushed_1 = ang itinulak
activity.git_stats_commit_n = %d mga [commit]
activity.git_stats_commit_n = %d mga commit
issues.dependency.add = Magdagdag ng dependency…
issues.dependency.cancel = Kanselahin
issues.dependency.no_permission.can_remove = Wala kang pahintulot na basahin ang dependency na ito ngunit matatanggal ang dependency
@ -1900,7 +1901,7 @@ activity.title.issues_n = % mga isyu
settings.mirror_settings.direction.pull = Paghila
settings.mirror_settings.direction.push = Pagtulak
settings.push_mirror_sync_in_progress = Itinulak ang mga pagbabago patungo sa [malayuang] %s sa ngayon.
milestones.filter_sort.least_issues = [Pinakamaliit] na mga isyu
milestones.filter_sort.least_issues = Pinakakaunting mga isyu
pulls.showing_specified_commit_range = Ipinapakita lamang ang mga pagbabago sa pagitan ng %[1]s..%[2]s
wiki.pages = Mga pahina
activity.unresolved_conv_label = Nakabukas
@ -2016,7 +2017,7 @@ settings.mirror_settings.docs.disabled_push_mirror.instructions = I-set up ang i
settings.mirror_settings.docs.disabled_pull_mirror.instructions = I-set up ang iyong proyekto na awtomatikong magtulak ng mga commit, tag at branch sa isa pang repositoryo. Na-disable ng iyong tagapangasiwa ng site ang mga pull mirror.
activity.overview = Pangkalahatang Ideya
mirror_public_key = Pampublikong susi ng SSH
milestones.cancel =
milestones.cancel =Kanselahin
issues.all_title = Lahat
mirror_denied_combination = Hindi maaaring gumamit ng pampublikong key at password-based na authentication nang magkakasama.
issues.filter_sort.relevance = Kaugnayan
@ -2060,6 +2061,386 @@ pulls.rebase_merge_pull_request = I-rebase at i-fast-forward
pulls.rebase_merge_commit_pull_request = I-rebase at gumawa ng merge commit
pulls.no_merge_not_ready = Hindi pa handang isama ang hiling sa paghila na ito, suriin ang estado ng pagsusuri at mga status check.
pulls.unrelated_histories = Nabigo ang pagsasama: Ang merge head at base ay hindi nagbabahagi ng isang karaniwang kasaysayan. Pahiwatig: Sumubok ng ibang paraan
settings.trust_model.collaborator.long = Tagatulong: Pagkatiwalaan ang mga signature mula sa mga katulong
settings.enable_timetracker = I-enable ang pagsubaybay ng oras
settings.add_collaborator_owner = Hindi madadagdag ang may-ari bilang katulong.
pulls.status_checks_success = Matagumpay ang lahat ng mga pagsusuri
settings.webhook.test_delivery_desc_disabled = Para subukan ang webhook gamit ng isang pekeng event, i-activate ito.
settings.slack_username = Username
pulls.auto_merge_when_succeed = Awtomatikong isama kapag magtagumpay ang lahat ng mga pagsusuri
settings.allow_only_contributors_to_track_time = Payagan lamang ang mga kontribyutor na subaybayan ang oras
settings.packages_desc = I-enable ang package registry ng repositoryo
settings.actions_desc = I-enable ang mga kasamang CI/CD pipeline gamit ang Forgejo Actions
settings.admin_indexer_commit_sha = Huling na-index na commit
settings.admin_indexer_unindexed = Hindi naka-index
settings.transfer_notices_3 = - Kung pribado ang repositoryo at ilipat sa isang indibidwal na user, ang aksyon na ito ay sinisigurado na ang user ay may pahintulot na basahin (at palitan ang mga pahintulot kung kailangan).
settings.convert_desc = Maari mong i-convert ang repositoryo na ito sa regular na repositoryo. Hindi ito mababawi.
settings.transfer.button = Ilipat ang pagmamay-ari
settings.signing_settings = Mga setting sa pagpapatunay ng pag-sign
settings.admin_enable_close_issues_via_commit_in_any_branch = Isara ang isyu sa pamamagitan ng commit na ginawa sa hindi default na branch
settings.reindex_button = Idagdag sa reindex queue
settings.packagist_username = Username sa Packagist
settings.event_pull_request_assign = Pag-assign
settings.event_pull_request_approvals = Mga pagapruba sa hiling sa paghila
settings.web_hook_name_matrix = Matrix
settings.event_pull_request = Pagbago
settings.event_issue_comment = Mga komento
settings.mirror_settings.push_mirror.none = Walang mga na-configure na push mirror
settings.transfer_started = Namarkahan na ang repositoryo para sa paglipat at naghihintay ng kumpirmasyon mula kay/sa "%s"
settings.wiki_globally_editable = Payagan ang sinuman na baguhin ang wiki
settings.external_wiki_url_error = Hindi wastong URL ang panlabas na wiki na URL.
settings.event_pull_request_enforcement = Pagpapatupad
settings.title = Pamagat
settings.pulls.ignore_whitespace = Huwag pansinin ang whitespace para sa mga salungatan
pulls.delete.text = Gusto mo ba talagang burahin ang hiling sa paghila na ito? (Permanente nitong buburahin ang lahat ng nilalaman. Isaalang-alang na isara ito sa halip, kung balak mo na panatilihin ito naka-archive)
milestones.new = Bagong milestone
wiki.page_name_desc = Maglagay ng pangalan para sa pahina ng Wiki na ito. Ang ilang mga espesyal na pangalan ay: "Home", "_Sidebar" at "_Footer".
settings.transfer.title = Ilipat ang pagmamay-ari
settings.content_type = Uri ng nilalaman ng POST (content type)
settings.deploy_key_deletion = Tanggalin ang deploy key
settings.protect_enable_push = I-enable ang pagtulak
settings.discord_icon_url.exceeds_max_length = Kailangang bababa o equal sa 2048 characters ang URL ng icon
settings.protected_branch.save_rule = I-save ang rule
settings.mirror_settings.docs.can_still_use = Bagama't na hindi ka makakabago ng mga umiiral na mirror o gumawa ng bago, maari mo pa rin gamitin ang iyong umiiral na mirror.
settings.slack_color = Kulay
settings.discord_icon_url = URL ng icon
settings.convert_fork_confirm = I-convert ang repositoryo
settings.add_webhook = Magdagdag ng webhook
settings.event_repository_desc = Ginawa o binura ang repositoryo.
milestones.no_due_date = Walang takdang petsa
milestones.edit_success = Na-update na ang milestone na "%s".
activity.title.unresolved_conv_n = %d mga hindi naresolbang paguusap
settings.units.units = Mga Yunit
settings.event_pull_request_label = Mga label
settings.trust_model.collaborator = Tagatulong
pulls.made_using_agit = AGit
settings.protect_disable_push = I-disable ang pagtulak
signing.wont_sign.pubkey = Hindi isa-sign ang commit na ito dahil wala kang pampublikong key na nauugnay sa iyong account.
settings.transfer_in_progress = May ginagawang paglipat. Mangyaring kanselahin iyan kung gusto mong ilipat ang repositoryo na ito sa isa pang user.
settings.wiki_branch_rename_failure = Nabigong i-normalize ang pangalan ng branch ng wiki ng repositoryo.
settings.event_send_everything = Lahat ng mga event
settings.event_choose = Mga custom na event…
settings.add_webhook_desc = Magpapadala ang Forgejo ng <code>POST</code> request ba may tinakdang Content-Type sa target URL. Magbasa pa sa <a target="_blank" rel="noopener noreferrer" href="%s">guide ng mga webhook</a>.
settings.event_create = Gumawa
settings.event_wiki_desc = Ginawa, binago ang pangalan, o binura ang pahina ng wiki.
settings.event_push = Pagtulak
settings.event_wiki = Wiki
settings.event_pull_request_assign_desc = Na-assign o unassign ang hiling aa paghila.
settings.event_issues = Pagbago
settings.event_issue_assign = Pag-assign
settings.event_pull_request_milestone = Mga milestone
settings.event_pull_request_milestone_desc = Dinagdag, tinanggal o binago ang milestone.
settings.event_pull_request_comment = Mga komento
settings.event_pull_request_review_request_desc = Nahiling o tinanggal ang pagsuri sa hiling sa paghila.
settings.web_hook_name_forgejo = Forgejo
settings.web_hook_name_gitea = Gitea
settings.deploy_key_desc = Ang mga deploy key ay may read-onlt na access sa repositoryo.
settings.is_writable_info = Payagan ang deploy key na ito na <strong>magtulak</strong> sa repositoryo.
settings.protect_whitelist_committers_desc = Ang mga naka-whitelist na user o koponan lamang ang makakatulak sa branch na ito (pero hindi ang pinwersang pagtulak).
settings.protect_whitelist_deploy_keys = I-whitelist ang mga deploy key na may write access para sa pagtulak.
settings.protect_whitelist_users = I-whitelist ang mga user para sa pagtulak
signing.wont_sign.never = Hindi masa-sign ang mga commit kailanman.
signing.wont_sign.basesigned = Hindi isa-sign ang pag-sama na ito dahil hindi naka-sign ang base commit.
settings.event_fork = Pag-fork
settings.protect_whitelist_teams = I-whitelist ang mga koponan para sa pagtulak
settings.delete_collaborator = Tanggalin
settings.remove_collaborator_success = Tinanggal na ang tagatulong.
settings.collaborator_deletion_desc = Tatanggihan ang pag-access sa repositoryo na ito ang pagtanggal ng tagatulong. Magpatuloy?
settings.delete_team_tip = May access sa lahat ng mga repositoryo ang koponan na ito at hindi matatanggal
settings.authorization_header_desc = Isasama bilang authorization header para sa mga request kung present. Mga halimbawa: %s.
settings.sourcehut_builds.secrets = Mga sikreto
settings.is_writable = Paganahin ang write access
milestones.deletion = Burahin ang milestone
milestones.deletion_desc = Ang pagbura ng milestone ay tinatanggal ito sa lahat ng mga kaugnay na isyu. Magpatuloy?
settings.discord_username = Username
wiki.original_git_entry_tooltip = Itignan ang orihinal na Git file sa halip ng isang friendly na link.
settings.add_team_duplicate = Nasa koponan na ang repositoryo
settings.add_team = Magdagdag ng koponan
settings.add_hook_success = Naidagdag na ang webhook.
settings.use_external_wiki = Gumamit ng panlabas na wiki
settings.external_wiki_url = URL ng panlabas na wiki
settings.use_internal_wiki = Gamitin ang kasamang wiki
settings.transfer_notices_1 = - Mawawalan ka ng access sa repsositoryo kung ilipat ito sa isang indibidwal na user.
settings.event_issue_assign_desc = Na-assign o unassign ang isyu.
settings.event_issue_label = Mga label
settings.event_issue_label_desc = Nadagdag o tinanggal ang mga label ng isyu.
settings.event_issue_milestone = Mga milestone
settings.event_issue_milestone_desc = Dinagdag, tinanggal o binago ang milestone.
activity.title.releases_published_by = %s nailabas ni/ng %s
settings.projects_desc = I-enable ang mga proyekto sa repositoryo
activity.published_release_label = Paglabas
activity.no_git_activity = Walang anumang commit na aktibidad na nakatuon sa panahong ito.
pulls.status_checks_warning = May mga ilang pagsusuri na nag-ulat ng mga babala
pulls.status_checks_error = May ilang mga pagsusuri na nag-ulat ng mga error
pulls.update_branch_rebase = I-update ang branch sa pamamagitan ng pag-rebase
pulls.update_not_allowed = Hindi ka pinapayagang i-update ang branch
pulls.clear_merge_message = I-clear ang mensahe ng pagsasama
pulls.clear_merge_message_hint = Tinatanggal lamang ng pag-clear ng mensahe ng pagsasama ang nilalaman ng mensahe ng commit at pinapanatili ang mga na-generate na git trailer tulad ng "Co-Authored-By …".
pulls.auto_merge_newly_scheduled = Nakaiskedyul ang hiling sa paghila na ito na maisama kapag magtagumpay ang lahat ng mga pagsusuri.
pulls.auto_merge_canceled_schedule_comment = `kinansela ang awtomatikong pagsama ng hiling sa paghila na ito kapag magtagumpay ang lahat ng mga pagsusuri %[1]s`
pulls.delete_after_merge.head_branch.insufficient_branch = Wala kang pahintulot para burahin ang head branch.
milestones.new_subheader = Tinutulungan ka ng mga milestone na ayusin ang mga isyu at subaybayan ang kanilang pag-unlad.
milestones.create = Gumawa ng milestone
milestones.due_date = Takdang petsa (opsyonal)
milestones.create_success = Ginawa na ang milestone na "%s".
milestones.edit = Baguhin ang milestone
milestones.edit_subheader = Ang mga milestone ay nag-aayos ng mga isyu at sumusubaybay sa pag-unlad.
milestones.modify = I-update ang milestone
milestones.filter_sort.earliest_due_data = Pinakamalapit na takdang petsa
milestones.filter_sort.least_complete = Hindi bababa sa kumpleto
signing.will_sign = Isa-sign ang commit gamit ang key na "%s".
signing.wont_sign.error = May error na naganap habang sinusuri kung masa-sign ang commit.
signing.wont_sign.always = Palaging naka-sign ang mga commit.
signing.wont_sign.twofa = Kailangang naka-enable ang authentikasyong two factor para naka-sign ang mga commit.
wiki.delete_page_notice_1 = Ang pagtanggal sa pahina ng wiki na "%s" ay hindi na mababawi. Magpatuloy?
activity.title.releases_n = %d mga paglabas
activity.published_prerelease_label = Pre-release
activity.published_tag_label = Tag
settings.mirror_settings.docs.doc_link_pull_section = ang "Pulling from a remote repository" na seksyon sa dokumentasyon.
settings.mirror_settings.docs.pulling_remote_title = Paghila mula sa remote na repositoryo
settings.mirror_settings.mirrored_repository = Naka-mirror na repositoryo
settings.mirror_settings.push_mirror.remote_url = URL ng remote Git repository
settings.units.overview = Pangkalahatang Ideya
settings.update_settings = I-save ang mga setting
settings.update_mirror_settings = I-update ang mga setting ng mirror
settings.branches.update_default_branch = I-update ang default branch
settings.advanced_settings = Mga advanced na setting
settings.use_internal_issue_tracker = Gamitin ang kasamang tagasubaybay ng isyu
settings.external_tracker_url = URL ng panlabas na tagasubaybay ng isyu
settings.external_tracker_url_desc = Ire-redirect ang mga bisita sa URL ng panlabas na tagasubaybay kapag pipindutin ang mga isyu na tab.
settings.tracker_url_format = URL format ng panlabas na tagasubaybay ng isyu
settings.tracker_url_format_error = Hindi wastong URL ang URL format ng panlabas na tagasubaybay ng isyu.
settings.tracker_issue_style.numeric = Numeric
settings.tracker_issue_style.alphanumeric = Alphanumeric
settings.tracker_issue_style.regexp_pattern = Pattern ng Regular na Ekspresyon
settings.tracker_issue_style.regexp_pattern_desc = Ang unang captured group ay gagamitin sa kapalit ng <code>(index)</code>.
settings.pulls.allow_rebase_update = I-enable ang pag-update ng hiling sa paghila sa pamamagitan ng rebase
settings.admin_enable_health_check = I-enable ang pagsusuri ng kalusugan ng repositoryo (git fsck)
settings.new_owner_has_same_repo = Ang bagong may-ari ay may repositoryo na may katulad na pangalan. Mangyaring pumili ng ibang pangalan.
settings.convert = I-convert sa regular na repositoryo
settings.convert_fork_desc = Maari mong i-convert ang fork na ito bilang regular na repositoryo. Hindi ito mababawi.
settings.convert_fork_notices_1 = Ang operasyon na ito ay ico-convert ang fork bilang regular na repositoryo at hindi mababawi.
settings.transfer_abort_invalid = Hindi mo makakansela ang isang hindi umiiral na paglipat ng repositoryo.
settings.transfer_quota_exceeded = Ang bagong may-ari (%s) ay lumalagpas sa quota. Hindi nailipat ang repositoryo.
settings.trust_model.committer = Taga-commit
settings.trust_model.committer.long = Taga-commit: Pagkatiwalaan ang mga signature na tumutugma sa mga taga-commit (Tumutugma ito sa GitHub at pinipilit ang mga Forgejo signed na mga commit na Forgejo bilang taga-commit)
settings.trust_model.collaboratorcommitter = Tagatulong+Taga-commit
settings.trust_model.collaboratorcommitter.long = Tagatulong+Taga-commit: Pagkatiwalaan ang mga signature batay sa mga katulong na tumutugma sa taga-commit
settings.wiki_rename_branch_main = I-normalize ang pangalan ng branch ng Wiki
settings.wiki_rename_branch_main_notices_1 = <strong>HINDI MABABAWI</strong> ang operasyon na ito.
settings.wiki_rename_branch_main_notices_2 = Permanente nitong papalitan ang pangalan ng internal branch ng wiki ng repositoryo ng %s. Ang mga umiiral na checkout ay dapat ma-update.
settings.wiki_branch_rename_success = Matagumpay na na-normalize ang pangalan ng branch ng wiki ng repositoryo.
settings.wiki_delete = Burahin ang data ng wiki
settings.wiki_delete_notices_1 = - Permanente nitong buburahin at idi-disable ang wiki ng repositoryo para sa %s.
settings.confirm_wiki_delete = Burahin ang data ng wiki
settings.wiki_deletion_success = Binura na ang wiki data ng repositoryo.
settings.delete = Burahin ang repositoryo na ito
settings.delete_desc = Permanente ang pagbura ng repositoryo at hindi ito mababawi.
settings.update_settings_no_unit = Dapat payagan ng repositoryo ang kahit isang uri ng pakikipag-ugnayan.
settings.confirm_delete = Burahin ang repositoryo
settings.add_collaborator = Magdagdag ng katulong
settings.add_collaborator_duplicate = Nadagdag na ang tagatulong na ito sa repositoryo.
settings.add_collaborator_blocked_our = Hindi madagdag ang tagatulong, dahil hinarang siya ng may-ari ng repositoryo.
settings.add_collaborator_blocked_them = Hindi madagdag ang tagatulong, dahil hinarang niya ang may-ari ng repositoryo.
settings.collaborator_deletion = Tanggalin ang Tagatulong
settings.team_not_in_organization = Ang koponan ay hindi nasa katulad na organisasyon sa repositoryo
settings.teams = Mga Koponan
settings.add_team_success = May access na ang koponan sa repositoryo na ito.
settings.remove_team_success = Tinanggal na ang access ng koponan sa repositoryo na ito.
settings.webhook_deletion_desc = Ang pagtanggal ng webhook ay binubura rin ang mga setting at deliver history nito. Magpatuloy?
settings.webhook.test_delivery_desc = Subukan ang webhook na ito gamit ng pekeng event.
settings.webhook.response = Tugon
settings.webhook.headers = Mga header
settings.webhook.payload = Nilalaman
settings.webhook.body = Katawan
settings.webhook.replay.description = I-replay ang webhook na ito.
settings.webhook.delivery.success = May nadagdag na event sa delivery queue. Maari magtagal ng ilang segundo bago makita sa delivery history.
settings.githooks_desc = Pinapagana ng Git ang mga Git hook. Maari mong baguhin ang mga hook file sa ibaba para mag-set up ng mga custom na operasyon.
settings.githook_name = Pangalan ng hook
settings.githook_content = Nilalaman ng hook
settings.update_githook = I-update ang hook
settings.payload_url = Target na URL
settings.http_method = Method ng HTTP
settings.event_push_only = Mga push event
settings.event_delete_desc = Binura ang branch o tag.
settings.event_fork_desc = Na-fork ang repositoryo.
settings.event_repository = Repositoryo
settings.event_header_issue = Mga event sa isyu
settings.event_header_pull_request = Mga event sa hiling sa paghila
settings.event_pull_request_comment_desc = Gumawa, binago o binura ang komento sa hiling sa paghila.
settings.event_pull_request_sync = Na-synchronize
settings.event_pull_request_sync_desc = Na-update ang branch nang awtomatiko sa target branch.
settings.event_pull_request_review_request = Mga hiling sa pagsuri
settings.event_pull_request_merge = Pagsama ng hiling sa paghila
settings.branch_filter = Filter ng branch
settings.authorization_header = Awtorisasyon (Authrorization) na header
settings.active = Aktibo
settings.active_helper = Ang mga impormasyon tungkol sa mga na-trigger na event ay ipapadala sa webhook URL na ito.
settings.update_webhook = I-update ang webhook
settings.update_hook_success = Na-update na ang webhook.
settings.delete_webhook = Tanggalin ang webhook
settings.recent_deliveries = Mga kamakailang pag-deliver
settings.hook_type = Uri ng hook
settings.slack_token = Token
settings.slack_domain = Domain
settings.slack_channel = Channel
settings.add_web_hook_desc = I-integrate ang <a target="_blank" rel="noreferrer" href="%s">%s</a> sa iyong repositoryo.
settings.graphql_url = URL ng GraphQL
settings.web_hook_name_gogs = Gogs
settings.web_hook_name_slack = Slack
settings.web_hook_name_discord = Discord
settings.web_hook_name_dingtalk = DingTalk
settings.web_hook_name_packagist = Packagist
settings.packagist_api_token = API token
settings.packagist_package_url = Package URL sa Packagist
settings.web_hook_name_sourcehut_builds = Mga Build sa Sourcehut
settings.sourcehut_builds.manifest_path = Manifest path ng build
settings.sourcehut_builds.visibility = Visibility ng job
settings.deploy_keys = Mga deploy key
settings.add_deploy_key = Magdagdag ng deploy key
settings.deploy_key_content = Nilalaman
settings.deploy_key_deletion_desc = Ang pagtanggal ng deploy key ay tatanggihan ang pag-access sa repositoryo na ito. Magpatuloy?
settings.deploy_key_deletion_success = Tinanggal na ang deploy key.
settings.protected_branch = Proteksyon sa branch
settings.protected_branch.delete_rule = Burahin ang rule
settings.protect_new_rule = Gumawa ng bagong branch protection rule
settings.protect_disable_push_desc = Walang pinapayagan na pagtulak sa branch na ito.
settings.protect_enable_merge = I-enable ang pagsama
settings.protect_merge_whitelist_committers = I-enable ang whitelist ng pagsasama
pulls.update_branch_success = Matagumpay ang pag-update ng branch
settings.protect_whitelist_committers = I-whitelist ang pinahigpit na pagtulak
settings.site = Website
settings.convert_confirm = I-convert ang repositoryo
settings.webhook.replay.description_disabled = Para i-replay ang webhook na ito, i-activate ito.
settings.tracker_issue_style.regexp = Regular na Ekspresyon
settings.admin_stats_indexer = Taga-index ng istatistika ng code
pulls.open_unmerged_pull_exists = `Hindi ka maaring gumawa ng pagbukas-muli na operasyon dahil may nakabinbin na hiling sa paghila (#%d) na may magkatulad na katangian.`
milestones.deletion_success = Binura na ang milestone.
pulls.auto_merge_has_pending_schedule = Naiskedyul ni %[1]s na awtomatiko na isama ang hiling sa paghila na ito kapag magtagumpay ang lahat ng mga pagsusuri %[2]s.
issues.summary_card_alt = Pangkalahatang-ideyang card ng isyu na tawag na "%s" sa repositoryong %s
pulls.status_checks_hide_all = Itago ang lahat ng mga pagususri
pulls.cmd_instruction_merge_warning = <b>Babala:</b> Hindi naka-enable ang "I-auto detect ang manwal na pagsasama" na setting para sa repositoryo na ito, kailangan mong markahan ang hiling sa paghila na ito bilang manwal na naisama pagkatapos.
pulls.auto_merge_newly_scheduled_comment = `naiskedyul ang hiling sa paghila na ito na awtomatikong maisama kapag magtagumpay ang lahat ng mga pagsusuri %[1]s`
signing.wont_sign.headsigned = Hindi isa-sign ang pagsama na ito dahil hindi naka-sign ang head commit.
settings.mirror_settings.docs.pull_mirror_instructions = Para mag-set up ng pull mirror, mangyaring sumangguni sa:
milestones.invalid_due_date_format = Kailangang "yyyy-mm-dd" na format ang takdang petsa.
signing.wont_sign.nokey = Walang key ang instansya na ito para i-sign ang commit na ito.
activity.title.releases_1 = %d paglabas
settings.mirror_settings.docs.more_information_if_disabled = Maari kang matuto pa tungkol sa mga push at pull na mirror dito:
settings.branches.switch_default_branch = Magpalit ng default branch
settings.convert_notices_1 = Ang operasyon na ito ay ico-covert ang mirror sa regular na repositoryo at hindi mababawi.
settings.convert_fork_succeed = Na-convert na ang fork sa regular na repositoryo.
settings.external_tracker_url_error = Hindi wastong URL ang URL ng panlabas na tagasubaybay ng isyu.
settings.tracker_url_format_desc = Gamitin ang mga placeholder na <code>(user)</code>, <code>(repo)</code> at <code>(index)</code> para sa username, pangalan ng repositoryo, at index ng isyu.
settings.pulls.enable_autodetect_manual_merge = I-enable ang awtomatikong i-detect ang manwal na pagsasama (Tandaan: sa mga espesyal na kaso, maaaring mangyari ang mga maling paghuhusga)
settings.transfer_notices_2 = - Mapapanatili mo ang access sa repositoryo kung ilipat mo ito sa organisasyon na minamay-ari mo o pinapangasiwaan mo.
settings.trust_model.collaboratorcommitter.desc = Ang mga angkop na signature mula sa mga tagatulong sa repositoryo na ito ay mamarkahan bilang "pinagkakatiwalaan" kapag tumutugma sila sa taga-commit. Kung hindi, ang mga angkop na signature ay imamarka bilang "hindi pinagkakatiwalaan" kapag ang signature ay tumutugma sa taga-commit at "hindi tumutugma" kung hindi. Pinipilit nito na markahan ang Forgejo bilang taga-commit sa mga naka-sign na commit na ang aktwal na taga-commit na nakamarka bilang Co-Authored-By: at Co-Committed-By: trailer sa commit. Ang default na Forgejo key ay dapat tumugma sa User sa database.
settings.update_settings_success = Nabago na ang mga setting ng repositoryo.
settings.trust_model.committer.desc = Ang mga angkop na signature ay mamamarkahan lamang bilang "pinagkakatiwalaan" kapag tumutugma sila sa taga-commit, kung hindi ay mamarkahan sila bilang "hindi tugma". Pinipilit nito na Forgejo ang magiging taga-commit para sa mga naka-sign na commit na may aktwal na taga-commit bilang Co-authored-by: at Co-committed-by: trailer sa commit. Ang default na Forgejo key ay dapat tumugma sa User sa database.
settings.delete_notices_1 = - <strong>HINDI MABABAWI</strong> ang operasyon na ito.
settings.delete_notices_2 = - Permanenteng buburahin ang <strong>%s</strong> na repositoryo kasama ang code, mga isyu, mga komento, data ng wiki at mga setting ng tagatulong ang operasyon na ito.
settings.add_collaborator_inactive_user = Hindi makakadagdag ng hindi aktibong user bilang tagatulong.
settings.change_team_access_not_allowed = Ang pagbago ng pag-access para sa koponan para sa repositoryo na ito ay pinahigpitan sa may-ari ng organisasyon
settings.change_team_permission_tip = Ang mga pahintulot ng koponan ay nakatakda sa pahina ng mga setting koponan at hindi mababago kada repositoryo
settings.hooks_desc = Ang mga webhook ay awtomatikong gumagawa ng HTTP POST request sa server kung saan ang ilang mga Forgejo na event ay ma-trigger. Magbasa pa sa <a target="_blank" rel="noopener noreferrer" href="%s">guide ng mga webhook</a>.
settings.githook_edit_desc = Kapag hindi aktibo ang hook, ipapakita ang mga sample na nilalaman. Idi-disable ang hook na ito kapag iwanang walang laman na value ang nilalaman.
settings.key_been_used = Ang deploy key na may katulad na nilalaman ay ginagamit na.
settings.event_issue_comment_desc = Gumawa, binura o binago ang komento ng isyu.
settings.event_pull_request_label_desc = Nadagdag o tinanggal ang mga label ng hiling sa paghila.
settings.event_package_desc = Ginawa o binura ang package sa repositoryo.
settings.branch_filter_desc = Branch whitelist para sa pagtulak, paggawa ng branch at pagbura ng branch na event, natakda bilang glob pattern. Kapag walang laman o <code>*</code>, inuulat ang event para sa lahat ng mga branch. Tignan ang <a href="%[1]s">%[2]s</a> na dokumentasyon para sa syntax. Halimbawa: <code>master</code>, <code>{master,release*}</code>.
settings.sourcehut_builds.secrets_helper = Bigyan ang job ng access sa build secrets (kinakailangan ang SECRETS:RO na grant)
settings.branch_protection = Mga protection rule para sa branch na "<b>%s</b>"
settings.sourcehut_builds.access_token_helper = Access token na may JOBS:RW na grant. Mag-generate ng <a target="_blank" rel="noopener noreferrer" href="%s">builds.sr.ht na token</a> o ng <a target="_blank" rel="noopener noreferrer" href="%s">builds.sr.ht na token na may secrets access</a> sa meta.sr.ht.
settings.protect_enable_push_desc = Ang sinuman na may write access ay mapapayagan na magtulak sa branch na ito (pero hindi ang pinwersang pagtulak).
settings.key_name_used = Umiiral na ang deploy key na may katulad na pangalan.
settings.webhook.request = Hiling
settings.event_package = Package
settings.no_deploy_keys = Wala pang mga deploy key sa ngayon.
settings.transfer_succeed = Nalipat na ang repositoryo.
settings.delete_notices_fork_1 = - Magiging malaya ang mga fork ng repositoryo na ito pagkatapos ng pagbura.
settings.deletion_success = Nabura na ang repositoryo.
settings.web_hook_name_msteams = Microsoft Teams
pulls.auto_merge_cancel_schedule = Kanselahin ang awtomatikong pagsasama
pulls.auto_merge_not_scheduled = Hindi naka-iskedyul ang hiling sa paghila na ito na awtomatikong magsama.
settings.convert_succeed = Na-convert na ang mirror sa isang regular na repositoryo.
settings.convert_fork = I-convert sa regular na repositoryo
settings.webhook.test_delivery = Subukan ang pag-deliver
settings.webhook_deletion_success = Tinanggal na ang webhook.
settings.event_header_repository = Mga event ng repositoryo
contributors.contribution_type.filter_label = Uri ng ambag:
contributors.contribution_type.commits = Mga commit
settings.enter_repo_name = Ilagay ang may-ari at pangalan ng repositoryo nang eksakto na pinapakita:
settings.transfer_abort_success = Matagumpay na nakansela ang paglipat ng repositoryo kay/sa %s.
settings.transfer_desc = Ilipat ang repositoryo sa isang user o organisasyon na kung saan may tagapangasiwa ka na pahintulot.
settings.confirmation_string = String ng kumpirmasyon
settings.event_release = Paglabas
settings.event_release_desc = Na-publish, nabago, o nabura ang release sa repositoryo.
settings.add_key_success = Nadagdag na ang deploy key na "%s".
wiki.page_already_exists = Umiiral na ang pahina ng wiki na may katulad na pangalan.
settings.external_wiki_url_desc = Ire-redirect ang mga bisita sa URL ng panlabas na wiki kapag pipindutin ang wiki tab.
settings.use_external_issue_tracker = Gumamit ng panlabas na tagasubaybay na isyu
settings.wiki_desc = I-enable ang wiki ng repositoryo
settings.trust_model.default.desc = Gamitin ang default na modelo ng pagkatiwala ng repositoryo para sa installation na ito.
settings.add_webhook.invalid_path = Hindi maaring maglaman ang path ng parte na "." o ".." o walang laman na string. Hindi maaring magsimula o magtapos sa slash.
settings.webhook_deletion = Tanggalin ang webhook
settings.add_webhook.invalid_channel_name = Hindi maaring walang laman ang pangalan ng channel ng webhook at hindi maaring maglaman lang ng # na character.
pulls.update_branch = I-update ang branch sa pamamagitan ng pagsama
pulls.status_checks_show_all = Ipakita ang lahat ng mga pagsusuri
pulls.cmd_instruction_checkout_title = I-checkout
pulls.cmd_instruction_checkout_desc = Sa iyong repositoryo ng proyekto, mag-check out ng bagong branch at subukan ang mga pagbabago.
activity.title.unresolved_conv_1 = %d hindi naresolbang paguusap
settings.mirror_settings.docs.no_new_mirrors = Ang iyong repositoryo ay nagsasalamin ng mga pagbabago sa o mula sa ibang repositoryo. Mangyaring tandaan na hindi ka makakagawa ng mga bagong salamin sa oras na ito.
settings.mirror_settings.push_mirror.edit_sync_time = I-edit ang pagitan ng mirror sync
settings.sync_mirror = I-synchronize ngayon
settings.issues_desc = I-enable ang tagasubaybay ng isyu ng repositoryo
settings.reindex_requested = Nahiling ang reindex
settings.releases_desc = I-enable ang mga paglalabas sa repositoryo
settings.wiki_rename_branch_main_desc = Baguhin ang pangalan ng branch na ginagamit ng internal ng Wiki sa "%s". Ang pagbabago na ito ay permanente at hindi mababawi.
settings.secret = Sikreto
settings.slack_icon_url = URL ng icon
settings.event_desc = I-trigger sa:
settings.event_push_desc = Git push sa repositoryo.
settings.web_hook_name_telegram = Telegram
settings.web_hook_name_larksuite_only = Lark Suite
settings.web_hook_name_wechatwork = WeCom (Wechat Work)
settings.web_hook_name_feishu_only = Feishu
settings.branches = Mga branch
pulls.status_checks_failure = Nabigo ang ilang mga pagsusuri
pulls.auto_merge_canceled_schedule = Nakansela ang awtomatikong pagsasama para sa hiling sa paghila na ito.
settings.confirm_wiki_branch_rename = Baguhin ang pangalan ng wiki branch
settings.wiki_delete_desc = Permanente ang pagbura ng data ng wiki ng repositoryo at hindi mababawi.
settings.event_delete = Burahin
settings.pulls.default_allow_edits_from_maintainers = Payagan ang mga pagbabago sa mga tagapagpanatili bilang default
settings.admin_code_indexer = Taga-index ng code
settings.pulls.default_delete_branch_after_merge = Burahin ang branch ng hiling sa paghila pagkatapos ng pagsasama bilang default
settings.trust_model.default = Default na modelo ng pagkatiwala
settings.trust_model.collaborator.desc = Ang mga angkop na signature mula sa mga katulong sa repositoryo na ito ay mamarkahan bilang "pinagkakatiwalaan" - (kung tumutugma ito sa taga-commit o hindi). Kung hindi, ang mga angkop na signature ay mamarkahan bilang "hindi pinagkakatiwalaan" kapag tumutugma ang signature sa taga-commit at "hindi tumutugma" kapag hindi.
settings.trust_model = Modelo ng pagkatiwala ng signature
activity.commit = Mga aktibidad sa commit
settings.mirror_settings.pushed_repository = Natulak na repositoryo
settings.mirror_settings.direction = Direksyon
settings.tracker_issue_style = Number Format ng panlabas na tagasubaybay ng isyu
settings.web_hook_name_feishu = Feishu / Lark Suite
pulls.agit_explanation = Ginawa gamit ang AGit workflow. Nagbibigay daan ang AGit sa mga kontribyutor na magmungkahi ng mga pagbabago gamit ang "git push" nang hindi gumawa ng fork o bagong branch.
milestones.filter_sort.latest_due_date = Pinakamalayong takdang petsa
activity = Aktibidad
activity.unresolved_conv_desc = Ang mga kamakailang nabagong isyu at hiling sa paghila na ito ay hindi pa naresolba.
signing.wont_sign.approved = Hindi isa-sign ang pagsama na ito dahil hindi nakaapruba ang PR.
ext_wiki = Panlabas na Wiki
milestones.filter_sort.name = Pangalan
signing.wont_sign.parentsigned = Hindi isa-sign ang commit na ito dahil hindi naka-sign ang parent commit.
signing.wont_sign.commitssigned = Hindi isa-sign ang pagsama na ito dahil hindi naka-sign ang lahat ng mga nauugnay na commit.
pulls.outdated_with_base_branch = Ang branch na ito ay hindi napapanahon sa base branch
milestones.clear = I-clear
settings.mirror_settings.docs.doc_link_title = Paano ako mag-mirror ng mga repositoryo?
settings.pull_mirror_sync_quota_exceeded = Nalagpasan ang quota, hindi hihila ng mga pagbabago.
settings.mirror_settings.push_mirror.none_ssh = Wala
settings.mirror_settings.push_mirror.copy_public_key = Kopyahin ang publikong key
pulls.delete_after_merge.head_branch.is_protected = Ang head branch na gusto mong burahin ay isang pinoprotektahang branch at hindi maaring burahin.
pulls.delete_after_merge.head_branch.is_default = Ang head branch na gusto mong burahin ay ang default branch at hindi maaring burahin.
issues.num_reviews_few = %d mga pagsusuri
issues.num_reviews_one = %d pagsusuri
[search]
commit_kind = Maghanap ng mga commit...
@ -2712,4 +3093,4 @@ filepreview.line = Linya %[1]d sa %[2]s
deleted.display_name = Binurang Proyekto
[translation_meta]
test = I love Forgejo and Bocchi The Rock! -- Ikuyo Kita
test = I love Forgejo and Bocchi The Rock! -- Ikuyo Kita

View file

@ -1351,7 +1351,7 @@ editor.or=ou
editor.cancel_lower=Annuler
editor.commit_signed_changes=Réviser les changements (signé)
editor.commit_changes=Réviser les changements
editor.add_tmpl=Ajouter "<filename>"
editor.add_tmpl=Ajouter "<%s>"
editor.add=Ajouter %s
editor.update=Actualiser %s
editor.delete=Supprimer %s
@ -3915,8 +3915,8 @@ workflow.dispatch.input_required = Le champ "%s" est obligatoire.
workflow.dispatch.invalid_input_type = Type invalide pour le champ "%s".
workflow.dispatch.warn_input_limit = Affichage des %d premiers champs seulement.
runs.expire_log_message = Les journaux ont été purgés car ils étaient trop anciens.
runs.no_workflows.help_write_access = Vous ne savez pas par où commencer avec les actions Forgejo ? Regarder la section <a target="_blank" rel="noopener noreferrer" href="%s"> démarrage rapide dans la documentation utilisateur</a> pour écrire votre premier workflow, puis <a target="_blank" rel="noopener noreferrer" href="%s">mettre en place un Forgejo runner</a> pour exécuter vos jobs.
runs.no_workflows.help_no_write_access = Pour en savoir plus sur les Actions Forgejo, consultez <a target="_blank" rel="noopener noreferrer" href="%s">la documentation</a>.
runs.no_workflows.help_write_access = Vous ne savez pas par où commencer avec Forgejo Actions ? Regardez la section <a target="_blank" rel="noopener noreferrer" href="%s"> démarrage rapide dans la documentation utilisateur</a> pour écrire votre premier workflow, puis <a target="_blank" rel="noopener noreferrer" href="%s">mettre en place un Forgejo runner</a> pour exécuter vos jobs.
runs.no_workflows.help_no_write_access = Pour en savoir plus sur Forgejo Actions, consultez <a target="_blank" rel="noopener noreferrer" href="%s">la documentation</a>.
[projects]
type-1.display_name=Projet personnel
@ -4001,4 +4001,4 @@ issues.write = <b>Écrire :</b> Fermer des tickets et gérer les métadonnées t
pulls.read = <b>Lire :</b> Lire et créer des demandes de tirage.
[translation_meta]
test = Ceci est une chaîne de test. Elle n'est pas affichée dans l'interface de Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce doux 100 % de complétion :)
test = Ceci est une chaîne de test. Elle n'est pas affichée dans l'interface de Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce doux 100 % de complétion :)

View file

@ -808,7 +808,7 @@ editor.name_your_file=Fájl elnevezése…
editor.or=vagy
editor.cancel_lower=Mégse
editor.commit_changes=Változások Véglegesítése
editor.add_tmpl='<filename>' hozzáadása
editor.add_tmpl='<%s>' hozzáadása
editor.commit_message_desc=Opcionális hosszabb leírás hozzáadása…
editor.commit_directly_to_this_branch=Mentés egyenesen a(z) <strong class="%[2]s">%[1]s</strong> ágba.
editor.create_new_branch=Hozzon létre egy <strong>új ágat</strong> ennek a commit-nak és indíts egy egyesítési kérést.
@ -1793,4 +1793,4 @@ branch_kind = Ágak keresése...
no_results = Nincsenek megfelelő találatok.
issue_kind = Hibajegyek keresése...
exact_tooltip = Csak a keresési kifejezést pontosan tartalmazó találatok mutatása
keyword_search_unavailable = A kulcsszó alapú keresés jelenleg nem elérhető. Kérlek értesítsd az oldal rendszergazdáját.
keyword_search_unavailable = A kulcsszó alapú keresés jelenleg nem elérhető. Kérlek értesítsd az oldal rendszergazdáját.

View file

@ -619,7 +619,7 @@ editor.filename_help=Tambahkan direktori dengan mengetikkan nama direktori diiku
editor.or=atau
editor.cancel_lower=Batalkan
editor.commit_changes=Perubahan komitmen
editor.add_tmpl=Tambahkan '<filename>'
editor.add_tmpl=Tambahkan '<%s>'
editor.commit_message_desc=Tambahkan deskripsi opsional yang panjang…
editor.commit_directly_to_this_branch=Komitmen langsung ke <strong class="%[2]s">%[1]s</strong> cabang.
editor.create_new_branch=Membuat <strong>new branch</strong> untuk tarik komit ini mulai permintaan.
@ -1344,4 +1344,4 @@ runs.commit=Memperbuat
[projects]
[git.filemode]
[git.filemode]

View file

@ -698,7 +698,7 @@ editor.delete_this_file=Eyða Skrá
editor.name_your_file=Nefndu skrána þína…
editor.or=eða
editor.cancel_lower=Hætta við
editor.add_tmpl=Bæta við „<filename>“
editor.add_tmpl=Bæta við „<%s>“
editor.create_new_branch=Búðu til <strong>nýja grein</strong> og sameiningarbeiðni fyrir þetta framlag.
editor.create_new_branch_np=Búðu til <strong>nýja grein</strong> fyrir þetta framlag.
editor.new_branch_name_desc=Heiti nýjar greinar…
@ -1370,4 +1370,4 @@ runs.commit=Framlag
[projects]
[git.filemode]
[git.filemode]

View file

@ -1298,7 +1298,7 @@ editor.or=o
editor.cancel_lower=Annulla
editor.commit_signed_changes=Conferma modifiche firmate
editor.commit_changes=Conferma le modifiche
editor.add_tmpl=Aggiungi "<filename>"
editor.add_tmpl=Aggiungi "<%s>"
editor.patch=Applica Patch
editor.patching=Patching:
editor.new_patch=Nuova Patch
@ -3894,4 +3894,4 @@ b = B
[markup]
filepreview.lines = Linee da %[1]d a %[2]d in %[3]s
filepreview.truncated = L'anteprima è stata troncata
filepreview.line = Linea %[1]d in %[2]s
filepreview.line = Linea %[1]d in %[2]s

View file

@ -1342,7 +1342,8 @@ editor.or=または
editor.cancel_lower=キャンセル
editor.commit_signed_changes=署名した変更をコミット
editor.commit_changes=変更をコミット
editor.add_tmpl="<ファイル名>" を追加
editor.add_tmpl="<%s>" を追加
editor.add_tmpl.filename = ファイル名
editor.add=%s を追加
editor.update=%s を更新
editor.delete=%s を削除
@ -3955,4 +3956,4 @@ projects.read = <b>読み取り:</b> リポジトリ プロジェクト ボー
actions.read = <b>読み取り:</b> 統合された CI/CD パイプラインとそのログを表示します。
[translation_meta]
test = これはテスト文字列です。Forgejo UI には表示されませんが、テスト目的で使用されます。早く済ませるために"ok"と入力するか楽しかった出来事を入力して下さい。そうすれば、完了することができます :)
test = これはテスト文字列です。Forgejo UI には表示されませんが、テスト目的で使用されます。早く済ませるために"ok"と入力するか楽しかった出来事を入力して下さい。そうすれば、完了することができます :)

File diff suppressed because it is too large Load diff

View file

@ -673,7 +673,8 @@ editor.filename_help=ഒരു ഡയറക്‌ടറിയുടെ പേര
editor.or=അഥവാ
editor.cancel_lower=റദ്ദാക്കുക
editor.commit_changes=മാറ്റങ്ങൾ വരുത്തുക
editor.add_tmpl='<ഫയല്‍>' ചേർക്കുക
editor.add_tmpl='<%s>' ചേർക്കുക
editor.add_tmpl.filename = ഫയല്‍
editor.add=%s ചേര്‍ക്കുക
editor.update=%s പുതുക്കുക
editor.delete=%s നീക്കം ചെയ്യുക
@ -783,4 +784,4 @@ repos.issues=ഇഷ്യൂകള്‍
[units]
[packages]
[packages]

View file

@ -141,6 +141,7 @@ new_org.link = Neje Vereenigung
concept_user_organization = Vereenigung
filter.clear = Filters leegmaken
filter.is_mirror = Spegels
copy_path = Padd koperen
[search]
search = Söken …
@ -1120,7 +1121,8 @@ editor.or = of
editor.cancel_lower = Ofbreken
editor.commit_signed_changes = Unnerschrieven Ännerns kommitteren
editor.commit_changes = Ännerns kommitteren
editor.add_tmpl = »Dateinaam« hentofögen
editor.add_tmpl = »<%s>« hentofögen
editor.add_tmpl.filename = Dateinaam
editor.add = %s hentofögen
editor.update = %s vernejen
editor.delete = %s lösken
@ -1294,20 +1296,20 @@ issues.new_label_desc_placeholder = Beschrieven
issues.create_label = Vermark maken
issues.label_templates.helper = Köör eene Vermarkens-Sammlung ut
issues.label_templates.use = Vermarkens-Sammlung bruken
issues.add_labels = hett de Vermarkens %s %s hentoföögt
issues.remove_label = hett de Vermark %s %s wegdaan
issues.add_milestone_at = `hett dat to de Marksteen <b>%s</b> hentoföögt`
issues.add_project_at = `hett dat to de Projekt <b>%s</b> hentoföögt`
issues.change_milestone_at = `hett de Marksteen vun <b>%s</b> to <b>%s</b> ännert`
issues.remove_milestone_at = `hett dat vun de Marksteen <b>%s</b> wegdaan`
issues.remove_project_at = `hett dat vun de Projekt <b>%s</b> wegdaan`
issues.add_labels = hett %[2]s de Vermarkens %[1]s hentoföögt
issues.remove_label = hett %[2]s de Vermark %[1]s wegdaan
issues.add_milestone_at = `hett dat %[2]s to de Marksteen <b>%[1]s</b> hentoföögt`
issues.add_project_at = `hett dat %[2]s to de Projekt <b>%[1]s</b> hentoföögt`
issues.change_milestone_at = `hett %[3]s de Marksteen vun <b>%[1]s</b> to <b>%[2]s</b> ännert`
issues.remove_milestone_at = `hett dat %[2]s vun de Marksteen <b>%[1]s</b> wegdaan`
issues.remove_project_at = `hett dat %[2]s vun de Projekt <b>%[1]s</b> wegdaan`
issues.deleted_milestone = `(lösket)`
issues.deleted_project = `(lösket)`
issues.self_assign_at = `hett dat %s sik sülven towiesen`
issues.remove_self_assignment = `hett sien Towiesen %s wegnohmen`
issues.change_title_at = `hett de Titel vun <b><strike>%s</strike></b> to <b>%s</b> %s ännert`
issues.change_ref_at = `hett de Nömen vun <b><strike>%s</strike></b> to <b>%s</b> %s ännert`
issues.delete_branch_at = `hett de Twieg <b>%s</b> %s lösket`
issues.change_title_at = `hett %[3]s de Titel vun <b><strike>%[1]s</strike></b> to <b>%[2]s</b> ännert`
issues.change_ref_at = `hett %[3]s de Nömen vun <b><strike>%[1]s</strike></b> to <b>%[2]s</b> ännert`
issues.delete_branch_at = `hett %[2]s de Twieg <b>%[1]s</b> lösket`
issues.filter_label = Vermark
issues.filter_label_exclude = `Bruuk <code>Alt</code>+<code>Klick/Enter</code>, um Vermarkens uttosluten`
issues.filter_label_no_select = All Vermarkens
@ -1362,29 +1364,29 @@ issues.context.delete = Lösken
issues.no_content = Keen Beschrieven angeven.
issues.choose.get_started = Lössleggen
issues.label_templates.fail_to_load_file = Kunn de Vermark-Vörlaag-Datei »%s« nich laden: %v
issues.add_label = hett de Vermark %s %s hentoföögt
issues.add_label = hett %[2]s de Vermark %[1]s hentoföögt
issues.add_assignee_at = `is vun <b>%s</b> %s towiesen worden`
issues.action_milestone_no_select = Keen Marksteen
issues.choose.blank_about = Een nejes Gefall vun de Normaal-Vörlaag maken.
issues.create = Gefall maken
issues.label_templates.title = Eene Vermark-Sammlung laden
issues.label_templates.info = Dat gifft noch keene Vermarkens. Maak eenen Vermark mit »Nejer Vermark« of bruuk eene Vermarkens-Sammlung:
issues.change_project_at = `hett dat Projekt vun <b>%s</b> to <b>%s</b> ännert`
issues.change_project_at = `hett %[3]s dat Projekt vun <b>%[1]s</b> to <b>%[2]s</b> ännert`
issues.remove_assignee_at = `is sien Towiesen vun <b>%s</b> %s wegnohmen worden`
issues.open_title = Open
issues.close = Gefall dichtmaken
issues.choose.ignore_invalid_templates = Ungültig Vörlagens sünd ignoreert worden
issues.add_ref_at = `hett de Nömen <b>%s</b> %s hentoföögt`
issues.add_ref_at = `hett %[2]s de Nömen <b>%[1]s</b> hentoföögt`
issues.filter_type.all_issues = All Gefallens
issues.filter_type.created_by_you = Vun di maakt
issues.filter_milestone_closed = Dichtmaakt Markstenen
issues.commented_at = `hett <a href="#%s">%s</a> kommenteert`
issues.remove_labels = hett de Vermarkens %s %s wegdaan
issues.remove_labels = hett %[2]s de Vermarkens %[1]s wegdaan
issues.filter_type = Aard
pulls.merged_by = vun <a href="%[2]s">%[3]s</a> is %[1]s tosamenföhrt worden
issues.next = Anner
issues.add_remove_labels = hett de Vermarkens %s hentoföögt un %s %s wegdaan
issues.remove_ref_at = `hett de Nömen <b>%s</b> %s wegdaan`
issues.add_remove_labels = hett %[3]s de Vermarkens %[1]s hentoföögt un %[2]s wegdaan
issues.remove_ref_at = `hett %[2]s de Nömen <b>%[1]s</b> wegdaan`
issues.filter_milestone_all = All Markstenen
issues.filter_type.reviewed_by_you = Vun di nakiekt
issues.filter_sort.fewestforks = Minnste Gabels
@ -1492,14 +1494,14 @@ issues.add_time_sum_to_small = Keene Tied is indragen worden.
issues.time_spent_total = Tied bruukt all tosamen
issues.time_spent_from_all_authors = `Tied bruukt all tosamen: %s`
issues.due_date = Anstahns-Datum
issues.push_commit_1 = hett %d Kommitteren %s hentoföögt
issues.push_commits_n = hett %d Kommitterens %s hentoföögt
issues.push_commit_1 = hett %[2]s %[1]d Kommitteren hentoföögt
issues.push_commits_n = hett %[2]s %[1]d Kommitterens hentoföögt
issues.force_push_compare = Verglieken
issues.due_date_form_edit = Bewarken
issues.due_date_form_remove = Wegdoon
issues.due_date_not_set = Keen Anstahns-Datum sett.
issues.due_date_added = hett dat Anstahns-Datum %s %s hentoföögt
issues.due_date_remove = hett dat Anstahns-Datum %s %s wegdaan
issues.due_date_added = hett %[2]s dat Anstahns-Datum %[1]s hentoföögt
issues.due_date_remove = hett %[2]s dat Anstahns-Datum %[1]s wegdaan
issues.due_date_overdue = Staht al lang an
issues.dependency.title = Ofhangens
issues.dependency.issue_no_dependencies = Keene Ofhangens sett.
@ -1533,7 +1535,7 @@ issues.review.reject = hett %s um Ännerns beden
issues.review.remove_review_request = hett %[2]s de Nakieken-Anfraag för %[1]s wegdaan
issues.review.remove_review_request_self = hett %s dat Nakieken verweigert
issues.unlock_error = Kann een Gefall nich upsluten, wenn t nich tosloten is.
issues.lock_with_reason = hett dat um <strong>%s</strong> %s tosluten un Snack up Mitarbeiders begrenzt
issues.lock_with_reason = hett dat %[2]s um <strong>%[1]s</strong> tosluten un Snack up Mitarbeiders begrenzt
issues.unpin_comment = hett dat %s lössstoken
issues.lock.notice_1 = - Anner Brukers könen keene nejen Kommentaren to deesem Gefall hentofögen.
issues.stop_tracking = Tiednehmer anhollen
@ -1548,7 +1550,7 @@ issues.lock.notice_2 = - Du un anner Mitarbeiders mit Togriep to deesem Reposito
issues.due_date_modified = hett dat Anstahns-Datum vun %[2]s to %[1]s %[3]s ännert
issues.dependency.issue_remove_text = Dat word de Ofhangen vun deesem Gefall wegdoon. Wiedermaken?
issues.review.approve = hett deese Ännerns %s tostimmt
issues.review.dismissed = hett dat Nakieken vun %s %s ofseggt
issues.review.dismissed = hett %[2]s dat Nakieken vun %[1]s ofseggt
issues.lock.title = Snack up deesem Gefall tosluten.
issues.unlock.title = Snack up deesem Gefall upsluten.
issues.tracker_auto_close = Tiednehmer word automatisk anhollt, wenn dat Gefall dichtmaakt word
@ -1604,7 +1606,7 @@ pulls.nothing_to_compare_have_tag = De utköört Twieg/Mark sünd gliek.
pulls.create = Haalvörslag maken
pulls.title_desc_one = will %[1]d Kommitteren vun <code>%[2]s</code> na <code id="%[4]s">%[3]s</code> tosamenföhren
pulls.merged_title_desc_one = hett %[1]d Kommitteren vun <code>%[2]s</code> na <code>%[3]s</code> %[4]s tosamenföhrt
pulls.change_target_branch_at = `hett de Enn-Twieg vun <b>%s</b> to <b>%s</b> %s ännert`
pulls.change_target_branch_at = `hett %[3]s de Enn-Twieg vun <b>%[1]s</b> to <b>%[2]s</b> ännert`
pulls.tab_conversation = Snack
pulls.tab_commits = Kommitterens
pulls.tab_files = Ännert Dateien
@ -3731,4 +3733,4 @@ filepreview.truncated = Utkiek is ofsneden worden
filepreview.line = Rieg %[1]d in %[2]s
[translation_meta]
test = Moin!
test = Moin!

View file

@ -554,7 +554,7 @@ team_invite.text_2 = Klik alstublieft op de volgende link om aan het team deel t
admin.new_user.text = <a href="%s">Klik hier</a> om deze gebruiker te beheren vanuit het beheerderspaneel.
password_change.subject = Uw wachtwoord is gewijzigd
password_change.text_1 = Het wachtwoord voor je account is zojuist gewijzigd.
reset_password.text_1 =
reset_password.text_1 =
totp_disabled.subject = TOTP is uitgeschakeld
primary_mail_change.subject = Uw primaire e-mail is gewijzigd
totp_disabled.no_2fa = Er zijn geen andere 2FA methodes meer geconfigureerd, wat betekent dat het niet langer nodig is om in te loggen op uw account met 2FA.
@ -1310,7 +1310,8 @@ editor.or=of
editor.cancel_lower=Annuleer
editor.commit_signed_changes=Commit ondertekende wijzigingen
editor.commit_changes=Wijzigingen doorvoeren
editor.add_tmpl="<bestandsnaam>" toevoegen
editor.add_tmpl="<%s>" toevoegen
editor.add_tmpl.filename = bestandsnaam
editor.patch=Patch toepassen
editor.patching=Patchen:
editor.new_patch=Nieuwe patch
@ -4000,4 +4001,4 @@ projects.write = <b>Schrijven:</b> Projecten en kolommen maken en bewerken.
packages.read = <b>Lezen:</b> Bekijk en download pakketten die aan de repository is toegewezen.
packages.write = <b>Schrijven:</b> Publiceer en verwijder pakketten die aan de repository is toegewezen.
actions.read = <b>Lezen:</b> Bekijk geïntegreerde CI/CD-pijplijnen en hun logboeken.
issues.write = <b>Schrijven:</b> Sluit issues af en beheer metadata zoals labels, mijlpalen, verantwoordelijken, vervaldatums en afhankelijkheden.
issues.write = <b>Schrijven:</b> Sluit issues af en beheer metadata zoals labels, mijlpalen, verantwoordelijken, vervaldatums en afhankelijkheden.

View file

@ -1174,7 +1174,7 @@ editor.or=lub
editor.cancel_lower=Anuluj
editor.commit_signed_changes=Zatwierdź podpisane zmiany
editor.commit_changes=Zatwierdź zmiany
editor.add_tmpl=Dodanie '<filename>'
editor.add_tmpl=Dodanie '<%s>'
editor.commit_message_desc=Dodaj dodatkowy rozszerzony opis…
editor.commit_directly_to_this_branch=Zmieniaj bezpośrednio gałąź <strong class="%[2]s">%[1]s</strong>.
editor.create_new_branch=Stwórz <strong>nową gałąź</strong> dla tego commita i rozpocznij Pull Request.
@ -2889,4 +2889,4 @@ issue_kind = Wyszukaj problemy...
pull_kind = Wyszukaj pull requesty...
union = Unia
regexp = RegExp
regexp_tooltip = Interpretuj wyszukiwane hasło jako wyrażenie regularne
regexp_tooltip = Interpretuj wyszukiwane hasło jako wyrażenie regularne

View file

@ -1341,7 +1341,8 @@ editor.or=ou
editor.cancel_lower=Cancelar
editor.commit_signed_changes=Criar commit das modificações assinadas
editor.commit_changes=Criar commit das modificações
editor.add_tmpl=Adicionar "<nome do arquivo>"
editor.add_tmpl=Adicionar "<%s>"
editor.add_tmpl.filename = nome do arquivo
editor.add=Adicionar %s
editor.update=Atualizar %s
editor.delete=Excluir %s
@ -4001,4 +4002,4 @@ packages.write = <b>Escrever:</b> Publique e delete pacotes atribuídos ao repos
ext_issues = Acesse o link para um issue tracker externo. As permissões são gerenciadas externamente.
[translation_meta]
test = To preserve its claws, the giant anteater walks on its front knuckles, like gorillas
test = To preserve its claws, the giant anteater walks on its front knuckles, like gorillas

View file

@ -1033,7 +1033,7 @@ visibility=Visibilidade do utilizador
visibility.public=Pública
visibility.public_tooltip=Visível para todos
visibility.limited=Limitada
visibility.limited_tooltip=Visível apenas para utilizadores autenticados
visibility.limited_tooltip=Visível apenas para utilizadores registados
visibility.private=Privada
visibility.private_tooltip=Visível apenas para membros das organizações a que se associou
additional_repo_units_hint = Sugere a habilitação de unidades do repositório adicionais
@ -1355,7 +1355,7 @@ editor.or=ou
editor.cancel_lower=Cancelar
editor.commit_signed_changes=Cometer modificações assinadas
editor.commit_changes=Cometer modificações
editor.add_tmpl=Adicionar "<filename>"
editor.add_tmpl=Adicionar "<%s>"
editor.add=Adicionar %s
editor.update=Modificar %s
editor.delete=Eliminar %s
@ -2844,6 +2844,9 @@ 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.num_reviews_one = %d revisão
issues.num_reviews_few = %d revisões
[graphs]
component_loading=A carregar %s...
@ -2891,7 +2894,7 @@ settings.permission=Permissões
settings.repoadminchangeteam=O administrador do repositório pode adicionar e remover o acesso às equipas
settings.visibility=Visibilidade
settings.visibility.public=Público
settings.visibility.limited=Limitada (visível apenas para utilizadores autenticados)
settings.visibility.limited=Limitada (visível apenas para utilizadores regitados)
settings.visibility.limited_shortname=Limitada
settings.visibility.private=Privada (visível apenas para membros da organização)
settings.visibility.private_shortname=Privado
@ -3999,4 +4002,4 @@ wiki.read = <b>Ler:</b> Ler o wiki integrado e o seu histórico.
wiki.write = <b>Escrever:</b> Criar, modificar e eliminar páginas no wiki integrado.
code.write = <b>Escrever:</b> Enviar para o repositório, criar ramos e etiquetas.
issues.read = <b>Ler:</b> Ler e criar questões e comentários.
pulls.write = <b>Escrever:</b> Fechar pedidos de integração e gerir metadados, tais como rótulos, etapas, encarregados, datas de vencimento e dependências.
pulls.write = <b>Escrever:</b> Fechar pedidos de integração e gerir metadados, tais como rótulos, etapas, encarregados, datas de vencimento e dependências.

View file

@ -166,6 +166,7 @@ new_repo.title = Новый репозиторий
new_migrate.title = Новый перенос
new_org.title = Новая организация
new_repo.link = Создать репозиторий
copy_path = Копировать путь
[aria]
navbar=Панель навигации
@ -1336,7 +1337,7 @@ editor.or=или
editor.cancel_lower=Отменить
editor.commit_signed_changes=Зафиксировать подписанные изменения
editor.commit_changes=Сохранить правки
editor.add_tmpl=Добавить «<filename
editor.add_tmpl=Добавить «<%s
editor.add=Добавить %s
editor.update=Обновить %s
editor.delete=Удалить %s
@ -4005,4 +4006,4 @@ issues.write = <b>Запись:</b> закрытие задач и измене
actions.write = <b>Запись:</b> ручной запуск, перезапуск, отмена и одобрение работы конвейеров CI/CD.
wiki.write = <b>Запись:</b> создание, изменение и удаление страниц во встроенной вики.
packages.read = <b>Чтение:</b> просмотр и скачивание пакетов в репозитории.
ext_issues = Доступ к ссылке на внешний трекер задач. Настройка разрешений выполняется вне сайта.
ext_issues = Доступ к ссылке на внешний трекер задач. Настройка разрешений выполняется вне сайта.

View file

@ -919,7 +919,7 @@ editor.or=හෝ
editor.cancel_lower=අවලංගු කරන්න
editor.commit_signed_changes=අත්සන් කළ වෙනස්කම් සිදු කරන්න
editor.commit_changes=වෙනස්කම් සිදු කරන්න
editor.add_tmpl='<filename>' එකතු කරන්න
editor.add_tmpl='<%s>' එකතු කරන්න
editor.commit_message_desc=විකල්ප දීර්ඝ විස්තරයක් එක් කරන්න…
editor.signoff_desc=කැපවූ ලොග් පණිවිඩය අවසානයේ දී කැපකරු විසින් සිග්නෙඩ්-ඕෆ්-විසින් ට්රේලරයක් එක් කරන්න.
editor.commit_directly_to_this_branch=<strong class="%[2]s">%[1]s</strong> ශාඛාවට කෙලින්ම කැප කරන්න.
@ -2553,4 +2553,4 @@ runs.commit=කැප
[projects]
[git.filemode]
symbolic_link=සංකේතාත්මක සබැඳිය
symbolic_link=සංකේතාත්මක සබැඳිය

View file

@ -847,7 +847,7 @@ editor.or=eller
editor.cancel_lower=Avbryt
editor.commit_signed_changes=Committa signerade ändringar
editor.commit_changes=Checka in ändringar
editor.add_tmpl=Lägg till '<filename>'
editor.add_tmpl=Lägg till '<%s>'
editor.commit_message_desc=Lägg till en valfri utökad beskrivning…
editor.commit_directly_to_this_branch=Checka in direkt till grenen <strong class="%[2]s">%[1]s</strong>.
editor.create_new_branch=Skapa en <strong>ny gren</strong> för denna incheckning och påbörja en hämtningsbegäran.
@ -2144,4 +2144,4 @@ symbolic_link=Symbolisk länk
[search]
milestone_kind = Sök milstolpar...
exact = Exakt
exact_tooltip = Inkludera bara resultat som exakt matchar söktermen
exact_tooltip = Inkludera bara resultat som exakt matchar söktermen

View file

@ -1307,7 +1307,8 @@ editor.or=veya
editor.cancel_lower=İptal
editor.commit_signed_changes=İmzalı Değişiklikleri İşle
editor.commit_changes=Değişiklikleri Uygula
editor.add_tmpl='<dosyaadi>' eklendi
editor.add_tmpl='<%s>' eklendi
editor.add_tmpl.filename = dosyaadi
editor.add=%s Ekle
editor.update=%s Güncelle
editor.delete=%s Sil
@ -3712,4 +3713,4 @@ code_search_unavailable = Kod araması şu anda kullanıma açık değildir. Lü
issue_kind = Sorunları ara...
pull_kind = Birleştirme isteklerini ara...
code_search_by_git_grep = Anlık kod araması sonuçları "git grep" komutu tarafından sağlanmaktadır. Site yöneticisinin kod endekslemesini açması durumunda daha iyi sonuçlar verilmesi mümkün olabilir.
keyword_search_unavailable = Anahtar kelime ile arama şu anda kullanıma açık değildir. Lütfen site yöneticisi ile iletişime geçin.
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.

View file

@ -166,6 +166,7 @@ filter.not_mirror = Не дзеркала
filter.not_template = Не шаблони
error413 = Ви вичерпали свою частку.
invalid_data = Недійсні дані: %v
copy_path = Копіювати шлях
[aria]
footer.software = Про застосунок
@ -1202,7 +1203,7 @@ editor.or=або
editor.cancel_lower=Скасувати
editor.commit_signed_changes=Внести підписані зміни
editor.commit_changes=Закомітити зміни
editor.add_tmpl=Додати «<filename
editor.add_tmpl=Додати «<%s
editor.commit_message_desc=Додати необов'язковий розширений опис…
editor.signoff_desc=Додати повідомленню в журналі комітів рядок Signed-off-by від свого імені.
editor.commit_directly_to_this_branch=Зробіть коміт прямо в гілку <strong class="%[2]s">%[1]s</strong>.
@ -2416,6 +2417,7 @@ issues.new.assign_to_me = Призначити собі
contributors.contribution_type.additions = Додавання
settings.add_web_hook_desc = Інтегрувати <a target="_blank" rel="noreferrer" href="%s">%s</a> у цей репозиторій.
settings.event_wiki_desc = Вікі-сторінку створено, перейменовано, відредаговано або видалено.
settings.mirror_settings.push_mirror.copy_public_key = Копіювати публічний ключ
[graphs]
contributors.what = внески
@ -3324,4 +3326,4 @@ kib = КіБ
mib = МіБ
gib = ГіБ
tib = ТіБ
b = Б
b = Б

View file

@ -115,7 +115,7 @@ error=错误
error404=您正尝试访问的页面 <strong>不存在</strong> 或 <strong>您尚未被授权</strong> 查看该页面。
go_back=返回
never=
never=
unknown=未知
rss_feed=RSS 订阅源
@ -166,6 +166,7 @@ new_org.title = 创建组织
new_repo.link = 创建仓库
new_migrate.link = 开始迁移
new_org.link = 创建组织
copy_path = 复制路径
[aria]
navbar=导航栏
@ -513,7 +514,7 @@ reset_password.text=如果此请求是您本人作出的,则请在 <b>%s</b>
register_success=注册成功
issue_assigned.pull=@%[1]s 已将仓库 %[3]s 中的合并请求 %[2]s 指派给您。
issue_assigned.issue=@%[1]s 已将仓库 %[3]s 中的工单 %[2]s 指派给您
issue_assigned.issue=@%[1]s 已将仓库 %[3]s 中的工单 %[2]s 指派给您
issue.x_mentioned_you=<b>@%s</b> 提到了您:
issue.action.force_push=<b>%[1]s</b> 强制从 %[3]s 推送 <b>%[2]s</b> 至 [4]s。
@ -599,14 +600,14 @@ Content=内容
SSPISeparatorReplacement=分隔符
SSPIDefaultLanguage=默认语言
require_error=不能为空。
require_error=` 不能为空。`
alpha_dash_error=` 应只包含字母数字、破折号(“-”和下划线“_”字符。`
alpha_dash_dot_error=` 应该只包含半角字母、数字、破折号(“-”、下划线“_”和半角句号“.”) 。`
git_ref_name_error=` 必须是格式良好的 git 引用名称。`
size_error=长度必须为 %s。
min_size_error=长度最小为 %s 个字符。
max_size_error=长度最大为 %s 个字符。
email_error=不是一个有效的邮箱地址。
size_error=`长度必须为 %s。`
min_size_error=`长度最小为 %s 个字符。`
max_size_error=`长度最大为 %s 个字符。`
email_error=`不是一个有效的邮箱地址。`
url_error=`'%s' 不是一个有效的 URL。`
include_error=`必须包含子字符串 "%s"。`
glob_pattern_error=`匹配模式无效:%s.`
@ -616,7 +617,7 @@ invalid_group_team_map_error=`映射无效: %s`
unknown_error=未知错误:
captcha_incorrect=验证码不正确。
password_not_match=密码不匹配。
lang_select_error=从列表中选出语言
lang_select_error=从列表中选择一个语言。
username_been_taken=用户名已被使用。
username_change_not_local_user=非本地用户不允许更改用户名。
@ -641,12 +642,12 @@ password_lowercase_one=至少一个小写字符
password_uppercase_one=至少一个大写字符
password_digit_one=至少一个数字
password_special_one=至少一个特殊字符(标点符号,括号,引号等)
enterred_invalid_repo_name=输入的仓库名称不正确
enterred_invalid_repo_name=输入的仓库名称不正确
enterred_invalid_org_name=您输入的组织名称不正确。
enterred_invalid_owner_name=新的所有者名称无效。
enterred_invalid_password=输入的密码不正确
user_not_exist=该用户不存在
team_not_exist=团队不存在
enterred_invalid_password=输入的密码不正确
user_not_exist=该用户不存在
team_not_exist=团队不存在
last_org_owner=您不能从“所有者”团队中删除最后一个用户。组织中必须至少有一个所有者。
cannot_add_org_to_team=组织不能被加入到团队中。
duplicate_invite_to_team=此用户已被邀请为团队成员。
@ -756,10 +757,10 @@ update_profile=更新个人资料
update_language=更改语言
update_language_not_found=语言 %s 不可用。
update_language_success=语言已更新。
update_profile_success=您的资料信息已经更新
update_profile_success=您的个人资料已经更新
change_username=您的用户名已更改。
change_username_prompt=注意:更改您的用户名也更改您的帐户 URL。
change_username_redirect_prompt=在其他用户使用您的旧用户名注册前,此旧用户名将会重定向到您的新用户名
change_username_redirect_prompt=在其他用户使用您的旧用户名注册前,此旧用户名将会重定向到您的新用户名
continue=继续操作
cancel=取消操作
language=界面语言
@ -1010,7 +1011,7 @@ remove_account_link=删除已绑定的账号
remove_account_link_desc=删除已绑定帐户将吊销其对您的 Forgejo 帐户的访问权限。继续?
remove_account_link_success=已取消绑定帐户。
hooks.desc=添加 Web 钩子,它们将会在您拥有的<strong>所有仓库</strong>上触发
hooks.desc=添加会在您拥有的<strong>所有仓库</strong>上触发的 Web 钩子。
orgs_none=您现在还不是任何组织的成员。
repos_none=你并不拥有任何仓库。
@ -1034,7 +1035,7 @@ visibility.public_tooltip=对所有人可见
visibility.limited=受限
visibility.limited_tooltip=仅对登录用户可见
visibility.private=私有
visibility.private_tooltip=仅对您已加入的组织的成员可见
visibility.private_tooltip=仅对您已加入的组织的成员可见
blocked_users = 已屏蔽的用户
blocked_users_none = 黑名单中没有用户。
blocked_since = 自 %s 起被屏蔽
@ -1076,7 +1077,7 @@ fork_from=派生自
already_forked=你已经派生过 %s
fork_to_different_account=派生到其他账号
fork_visibility_helper=无法更改派生仓库的可见性。
fork_branch=克隆到 Fork 的分支
fork_branch=复制到派生的分支
all_branches=所有分支
fork_no_valid_owners=这个代码仓库无法被派生,因为没有有效的所有者。
use_template=使用此模板
@ -1246,8 +1247,8 @@ forked_from=派生自
generated_from=生成自
fork_from_self=无法派生您拥有的仓库。
fork_guest_user=请先登录再派生此仓库。
watch_guest_user=请登录后再关注此仓库
star_guest_user=请登录后再点赞此仓库
watch_guest_user=请登录后再关注此仓库
star_guest_user=请登录后再点赞此仓库
unwatch=取消关注
watch=关注
unstar=取消点赞
@ -1343,7 +1344,7 @@ editor.cannot_edit_non_text_files=网页不能编辑二进制文件。
editor.edit_this_file=编辑文件
editor.this_file_locked=文件已锁定
editor.must_be_on_a_branch=您必须在某个分支上才能对此文件进行修改操作。
editor.fork_before_edit=您必须派生这个仓库才能对此文件进行修改操作
editor.fork_before_edit=您必须派生这个仓库才能对此文件进行修改操作
editor.delete_this_file=删除文件
editor.must_have_write_access=您必须具有写权限才能对此文件进行修改操作。
editor.file_delete_success=文件 %s 已被删除。
@ -1353,7 +1354,7 @@ editor.or=或
editor.cancel_lower=取消
editor.commit_signed_changes=提交已签名的更改
editor.commit_changes=提交变更
editor.add_tmpl=添加 “<filename>”
editor.add_tmpl=添加 “<%s>”
editor.add=添加 %s
editor.update=更新 %s
editor.delete=删除 %s
@ -1371,7 +1372,7 @@ editor.new_branch_name=为这次提交的新分支命名
editor.new_branch_name_desc=新的分支名称…
editor.cancel=取消
editor.filename_cannot_be_empty=文件名不能为空。
editor.filename_is_invalid=文件名 %s 无效
editor.filename_is_invalid=文件名 %s 无效
editor.branch_does_not_exist=此仓库中不存在名为 %s 的分支。
editor.branch_already_exists=此仓库已存在名为 %s 的分支。
editor.directory_is_a_file=%s 已经作为文件名在此仓库中存在。
@ -1400,12 +1401,12 @@ editor.require_signed_commit=分支需要签名提交
editor.cherry_pick=Cherry-pick %s 到:
editor.revert=将 %s 还原到:
commits.desc=浏览代码修改历史
commits.desc=浏览代码修改历史
commits.commits=次代码提交
commits.no_commits=没有共同的提交。%s 和 %s 的历史完全不同。
commits.nothing_to_compare=这些分支是相同的。
commits.search=搜索提交历史
commits.search.tooltip=`您可以在关键词前加上前缀,如"author:", "committer:", "after:", 或"before:", 例如 "retrin author:Alice before:2019-01-13"`
commits.search.tooltip=您可以在关键词前加上前缀,如"author:", "committer:", "after:", 或"before:", 例如 "retrin author:Alice before:2019-01-13"
commits.find=搜索
commits.search_all=所有分支
commits.author=作者
@ -1811,7 +1812,7 @@ issues.content_history.delete_from_history_confirm=从历史记录中删除吗
issues.content_history.options=选项
issues.reference_link=参考:%s
compare.compare_base=基准分支
compare.compare_base=基准
compare.compare_head=比较
pulls.desc=启用合并请求和代码评审。
@ -1832,7 +1833,7 @@ pulls.compare_compare=拉取从
pulls.switch_comparison_type=切换比较类型
pulls.switch_head_and_base=切换 head 和 base
pulls.filter_branch=过滤分支
pulls.no_results=未找到结果
pulls.no_results=未找到结果
pulls.show_all_commits=显示所有提交
pulls.show_changes_since_your_last_review=显示自您上次评审以来的更改
pulls.showing_only_single_commit=仅显示提交 %[1]s 的更改
@ -1869,7 +1870,7 @@ pulls.files_conflicted=此合并请求有变更与目标分支冲突。
pulls.is_checking=正在进行合并冲突检测,请稍后再试。
pulls.is_ancestor=此分支已经包含在目标分支中,没有更改可以合并。
pulls.is_empty=此分支上的更改已经在目标分支上。这将是一个空提交。
pulls.required_status_check_failed=一些必要的检查没有成功
pulls.required_status_check_failed=一些必要的检查没有成功
pulls.required_status_check_missing=缺少一些必要的检查。
pulls.required_status_check_administrator=作为管理员,您仍可合并此合并请求
pulls.blocked_by_approvals=此合并请求当前还没有通过审批。已获取审批数%d个共需要审批数%d个。
@ -2287,7 +2288,7 @@ settings.add_webhook.invalid_channel_name=Webhook 通道名称不能为空且不
settings.hooks_desc=当Forgejo事件发生时Web钩子自动发出HTTP POST请求。在 <a target="_blank" rel="noopener noreferrer" href="%s"> 指南</a> 中阅读更多内容。
settings.webhook_deletion=删除 Web 钩子
settings.webhook_deletion_desc=删除 web钩子 将删除其设置和历史记录。继续?
settings.webhook_deletion_success=Web 钩子删除成功!
settings.webhook_deletion_success=Web 钩子已移除。
settings.webhook.test_delivery=测试推送
settings.webhook.test_delivery_desc=用假事件测试这个 web钩子。
settings.webhook.test_delivery_desc_disabled=要用 虚假事件 测试这个Webhook请激活它。
@ -2371,9 +2372,9 @@ settings.authorization_header=授权标头
settings.authorization_header_desc=当存在时将被作为授权标头包含在内。例如: %s。
settings.active=激活
settings.active_helper=触发事件的信息将发送到此 webhook 网址。
settings.add_hook_success=Web 钩子添加成功!
settings.add_hook_success=Web 钩子已添加。
settings.update_webhook=更新 Web 钩子
settings.update_hook_success=Web 钩子更新成功!
settings.update_hook_success=Web 钩子已更新。
settings.delete_webhook=删除 Web 钩子
settings.recent_deliveries=最近推送记录
settings.hook_type=钩子类型
@ -2407,7 +2408,7 @@ settings.no_deploy_keys=没有部署密钥。
settings.title=标题
settings.deploy_key_content=密钥文本
settings.key_been_used=具有相同内容的部署密钥已在使用中。
settings.key_name_used=使用相同名称的部署密钥已经存在
settings.key_name_used=使用相同名称的部署密钥已经存在
settings.add_key_success=部署密钥 %s 添加成功。
settings.deploy_key_deletion=删除部署密钥
settings.deploy_key_deletion_desc=删除部署密钥将取消此密钥对此仓库的访问权限。继续?
@ -2509,7 +2510,7 @@ settings.archive.header=归档此仓库
settings.archive.text=归档仓库将使其完全只读。它将在首页隐藏。没有人(甚至你!)能够进行新的提交,或打开工单及合并请求。
settings.archive.success=仓库已成功归档。
settings.archive.error=仓库在归档时出现异常。请通过日志获取详细信息。
settings.archive.error_ismirror=请不要对镜像仓库归档,谢谢!
settings.archive.error_ismirror=不能归档镜像仓库。
settings.archive.branchsettings_unavailable=已归档仓库无法进行分支设置。
settings.archive.tagsettings_unavailable=已归档仓库的Git标签设置不可用。
settings.archive.mirrors_unavailable = 不能镜像已归档的仓库。
@ -2844,6 +2845,9 @@ issues.filter_sort.relevance = 相关性
diff.git-notes.add = 添加注释
diff.git-notes.remove-header = 移除注释
diff.git-notes.remove-body = 此注释将被移除。
issues.num_reviews_one = %d 评审
issues.num_reviews_few = %d 评审
issues.summary_card_alt = 仓库 %[2]s 中标题为 %[1]s 的工单的摘要卡片
[graphs]
component_loading=正在加载 %s...
@ -3999,4 +4003,4 @@ actions.write = <b>写入:</b>手动触发、重启、取消或批准待处理
ext_issues = 访问外部工单系统的链接。权限由外部管理。
ext_wiki = 访问外部百科的链接。权限由外部管理。
projects.write = <b>写入:</b>创建项目和列并进行编辑。
pulls.write = <b>写入:</b>关闭合并请求并管理元数据,如标签、里程碑、指派成员、截止日期和依赖。
pulls.write = <b>写入:</b>关闭合并请求并管理元数据,如标签、里程碑、指派成员、截止日期和依赖。

View file

@ -1296,7 +1296,8 @@ editor.or=或
editor.cancel_lower=取消
editor.commit_signed_changes=提交簽署的變更
editor.commit_changes=提交變更
editor.add_tmpl=新增「<檔案>」
editor.add_tmpl=新增「<%s>」
editor.add_tmpl.filename = 檔案
editor.add=新增 %s
editor.update=更新 %s
editor.delete=刪除 %s
@ -3808,4 +3809,4 @@ filepreview.lines = %[3]s 中的第 %[1]d 至 %[2]d 行
filepreview.line = %[2]s 中的第 %[1]d 行
[translation_meta]
test = 好的
test = 好的

26
options/locale/readme.md Normal file
View file

@ -0,0 +1,26 @@
# Forgejo translations
This directory contains all .INI translations.
## Working on base language
When you work on Forgejo features, you should only modify `locale_en-US.ini`.
* consult https://forgejo.org/docs/next/contributor/localization-english/
* add strings when your change requires doing so
* remove strings when your change renders them unused
## Working on other languages
Translations are done on Codeberg Translate and not via individual pull requests.
* consult https://forgejo.org/docs/next/contributor/localization/
* see the project: https://translate.codeberg.org/projects/forgejo/forgejo/
## Attribution
Forgejo translators are attributed in commit messages and in monthly updates on the website.
Gitea translators are mostly not attributed in this repository because Gitea translation commits are lacking attribution, but it may be preserved on Crowdin.
This directory contains a legacy `TRANSLATORS` file from the Gogs era. It is opt-in and is not actively maintained.

2296
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -12,7 +12,7 @@
"@github/relative-time-element": "4.4.4",
"@github/text-expander-element": "2.8.0",
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
"@primer/octicons": "19.13.0",
"@primer/octicons": "19.14.0",
"ansi_up": "6.0.2",
"asciinema-player": "3.8.0",
"chart.js": "4.4.5",
@ -29,7 +29,7 @@
"htmx.org": "1.9.12",
"idiomorph": "0.3.0",
"jquery": "3.7.1",
"katex": "0.16.14",
"katex": "0.16.18",
"mermaid": "11.4.1",
"mini-css-extract-plugin": "2.9.2",
"minimatch": "10.0.1",
@ -42,7 +42,7 @@
"pretty-ms": "9.0.0",
"sortablejs": "1.15.6",
"swagger-ui-dist": "5.17.14",
"tailwindcss": "3.4.16",
"tailwindcss": "3.4.17",
"throttle-debounce": "5.0.0",
"tinycolor2": "1.6.0",
"tippy.js": "6.3.7",
@ -63,41 +63,41 @@
"@eslint-community/eslint-plugin-eslint-comments": "4.4.1",
"@playwright/test": "1.48.2",
"@stoplight/spectral-cli": "6.14.2",
"@stylistic/eslint-plugin-js": "2.10.1",
"@stylistic/eslint-plugin-js": "2.12.1",
"@stylistic/stylelint-plugin": "3.1.1",
"@typescript-eslint/parser": "8.14.0",
"@typescript-eslint/parser": "8.18.1",
"@vitejs/plugin-vue": "5.1.5",
"@vitest/coverage-v8": "2.1.4",
"@vitest/eslint-plugin": "1.1.13",
"@vitest/coverage-v8": "2.1.8",
"@vitest/eslint-plugin": "1.1.16",
"@vue/test-utils": "2.4.6",
"eslint": "9.14.0",
"eslint-import-resolver-typescript": "3.6.3",
"eslint": "9.17.0",
"eslint-import-resolver-typescript": "3.7.0",
"eslint-plugin-array-func": "5.0.2",
"eslint-plugin-import-x": "4.4.2",
"eslint-plugin-no-jquery": "3.0.2",
"eslint-plugin-import-x": "4.5.1",
"eslint-plugin-no-jquery": "3.1.0",
"eslint-plugin-no-use-extend-native": "0.7.2",
"eslint-plugin-playwright": "2.0.1",
"eslint-plugin-regexp": "2.6.0",
"eslint-plugin-sonarjs": "2.0.4",
"eslint-plugin-unicorn": "56.0.0",
"eslint-plugin-playwright": "2.1.0",
"eslint-plugin-regexp": "2.7.0",
"eslint-plugin-sonarjs": "3.0.1",
"eslint-plugin-unicorn": "56.0.1",
"eslint-plugin-vitest-globals": "1.5.0",
"eslint-plugin-vue": "9.31.0",
"eslint-plugin-vue-scoped-css": "2.8.1",
"eslint-plugin-vue": "9.32.0",
"eslint-plugin-vue-scoped-css": "2.9.0",
"eslint-plugin-wc": "2.2.0",
"globals": "15.13.0",
"globals": "15.14.0",
"happy-dom": "15.11.7",
"license-checker-rseidelsohn": "4.4.2",
"markdownlint-cli": "0.42.0",
"markdownlint-cli": "0.43.0",
"postcss-html": "1.7.0",
"stylelint": "16.10.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-eslint": "8.14.0",
"typescript-eslint": "8.18.1",
"vite-string-plugin": "1.3.4",
"vitest": "2.1.4"
"vitest": "2.1.8"
},
"browserslist": [
"defaults"

View file

@ -65,6 +65,7 @@ export default {
/* Project-specific settings. */
use: {
...devices['Desktop Chrome'],
permissions: ['clipboard-read', 'clipboard-write'],
},
},
@ -87,6 +88,7 @@ export default {
name: 'Mobile Chrome',
use: {
...devices['Pixel 5'],
permissions: ['clipboard-read', 'clipboard-write'],
},
},
{
@ -101,4 +103,5 @@ export default {
outputDir: 'tests/e2e/test-artifacts/',
/* Folder for explicit snapshots for visual testing */
snapshotDir: 'tests/e2e/test-snapshots/',
snapshotPathTemplate: '{snapshotDir}/snapshots/{testFilePath}/{projectName}_{arg}{ext}',
} satisfies PlaywrightTestConfig;

View file

@ -0,0 +1,13 @@
<!--start release-notes-assistant-->
## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Security bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5719) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5723)): <!--number 5723 --><!--line 0 --><!--description Rm9yZ2VqbyBnZW5lcmF0ZXMgYSB0b2tlbiB3aGljaCBpcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB3ZWIgZW5kcG9pbnRzIHRoYXQgYXJlIG9ubHkgbWVhbnQgdG8gYmUgdXNlZCBpbnRlcm5hbGx5LCBmb3IgaW5zdGFuY2Ugd2hlbiB0aGUgU1NIIGRhZW1vbiBpcyB1c2VkIHRvIHB1c2ggYSBjb21taXQgd2l0aCBHaXQuIFRoZSB2ZXJpZmljYXRpb24gb2YgdGhpcyB0b2tlbiB3YXMgbm90IGRvbmUgaW4gY29uc3RhbnQgdGltZSBhbmQgd2FzIHN1c2NlcHRpYmxlIHRvIFt0aW1pbmcgYXR0YWNrc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGltaW5nX2F0dGFjaykuIEEgcHJlLWNvbmRpdGlvbiBmb3Igc3VjaCBhbiBhdHRhY2sgaXMgdGhlIHByZWNpc2UgbWVhc3VyZW1lbnRzIG9mIHRoZSB0aW1lIGZvciBlYWNoIG9wZXJhdGlvbi4gU2luY2UgaXQgcmVxdWlyZXMgb2JzZXJ2aW5nIHRoZSB0aW1pbmcgb2YgbmV0d29yayBvcGVyYXRpb25zLCB0aGUgaXNzdWUgaXMgbWl0aWdhdGVkIHdoZW4gYSBGb3JnZWpvIGluc3RhbmNlIGlzIGFjY2Vzc2VkIG92ZXIgdGhlIGludGVybmV0IGJlY2F1c2UgdGhlIElTUCBpbnRyb2R1Y2UgdW5wcmVkaWN0YWJsZSByYW5kb20gZGVsYXlzLg==-->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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5718) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5720)): <!--number 5720 --><!--line 0 --><!--description QmVjYXVzZSBvZiBhIG1pc3NpbmcgcGVybWlzc2lvbiBjaGVjaywgdGhlIGJyYW5jaCB1c2VkIHRvIHByb3Bvc2UgYSBwdWxsIHJlcXVlc3QgdG8gYSByZXBvc2l0b3J5IGNhbiBhbHdheXMgYmUgZGVsZXRlZCBieSB0aGUgdXNlciBwZXJmb3JtaW5nIHRoZSBtZXJnZS4gSXQgd2FzIGZpeGVkIHNvIHRoYXQgc3VjaCBhIGRlbGV0aW9uIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGUgdXNlciBwZXJmb3JtaW5nIHRoZSBtZXJnZSBoYXMgd3JpdGUgcGVybWlzc2lvbiB0byB0aGUgcmVwb3NpdG9yeSBmcm9tIHdoaWNoIHRoZSBwdWxsIHJlcXVlc3Qgd2FzIG1hZGUu-->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.<!--description-->
- Localization
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5182) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5401)): <!--number 5401 --><!--line 0 --><!--description VHJhbnNsYXRpb24gYmFja3BvcnRzIHRvIHY3-->Translation backports to v7<!--description-->
- Included for completeness but not worth a release note
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5725): <!--number 5725 --><!--line 0 --><!--description VXBkYXRlIGRlcGVuZGVuY3kgbWVybWFpZCB0byB2MTAuOS4zIFtTRUNVUklUWV0gKHY3LjAvZm9yZ2Vqbyk=-->Update dependency mermaid to v10.9.3 [SECURITY] (v7.0/forgejo)<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5241): <!--number 5241 --><!--line 0 --><!--description VXBkYXRlIGRlcGVuZGVuY3kgZ28gdG8gdjEuMjIuNyAodjcuMC9mb3JnZWpvKQ==-->Update dependency go to v1.22.7 (v7.0/forgejo)<!--description-->
<!--end release-notes-assistant-->

View file

@ -0,0 +1,14 @@
<!--start release-notes-assistant-->
## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Security bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): <!--number 5976 --><!--line 0 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8xY2UzM2FhMzhkMWQyNThkMTQ1MjNmZjJjN2MyZGJmMzM5ZjIyYjc0KSBpdCB3YXMgcG9zc2libGUgdG8gdXNlIGEgdG9rZW4gc2VudCB2aWEgZW1haWwgZm9yIHNlY29uZGFyeSBlbWFpbCB2YWxpZGF0aW9uIHRvIHJlc2V0IHRoZSBwYXNzd29yZCBpbnN0ZWFkLiAgSW4gb3RoZXIgd29yZHMsIGEgdG9rZW4gc2VudCBmb3IgIGEgZ2l2ZW4gYWN0aW9uIChyZWdpc3RyYXRpb24sIHBhc3N3b3JkIHJlc2V0IG9yIHNlY29uZGFyeSBlbWFpbCB2YWxpZGF0aW9uKSBjb3VsZCBiZSB1c2VkIHRvIHBlcmZvcm0gYSBkaWZmZXJlbnQgYWN0aW9uLiBJdCBpcyBubyBsb25nZXIgcG9zc2libGUgdG8gdXNlIGEgdG9rZW4gZm9yIGFuIGFjdGlvbiB0aGF0IGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvcmlnaW5hbCBwdXJwb3NlLg==-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): <!--number 5976 --><!--line 1 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8wNjFhYmU2MDA0NTIxMmFjZjhjM2Y1YzQ5YjVjYzc1OGI0Y2JjZGU5KSBhIGZvcmsgb2YgYSBwdWJsaWMgcmVwb3NpdG9yeSB3b3VsZCBzaG93IGluIHRoZSBsaXN0IG9mIGZvcmtzLCBldmVuIGlmIGl0cyBvd25lciB3YXMgbm90IGEgcHVibGljIHVzZXIgb3Igb3JnYW5pemF0aW9uLiBTdWNoIGEgZm9yayBpcyBub3cgaGlkZGVuIGZyb20gdGhlIGxpc3Qgb2YgZm9ya3Mgb2YgdGhlIHB1YmxpYyByZXBvc2l0b3J5Lg==-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): <!--number 5976 --><!--line 2 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8zZTNlZjc2ODA4MTAwY2IxYzg1MzM3ODczM2QwZjZhOTEwMzI0YWM2KSB0aGUgbWVtYmVycyBvZiBhbiBvcmdhbml6YXRpb24gdGVhbSB3aXRoIHJlYWQgYWNjZXNzIHRvIGEgcmVwb3NpdG9yeSAoZS5nLiB0byByZWFkIGlzc3VlcykgYnV0IG5vIHJlYWQgYWNjZXNzIHRvIHRoZSBjb2RlIGNvdWxkIHJlYWQgdGhlIFJTUyBvciBhdG9tIGZlZWRzIHdoaWNoIGluY2x1ZGUgdGhlIGNvbW1pdCBhY3Rpdml0eS4gUmVhZGluZyB0aGUgUlNTIG9yIGF0b20gZmVlZHMgaXMgbm93IGRlbmllZCB1bmxlc3MgdGhlIHRlYW0gaGFzIHJlYWQgcGVybWlzc2lvbnMgb24gdGhlIGNvZGUu-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): <!--number 5976 --><!--line 3 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC85NTA4YWE3NzEzNjMyZWQ0MDEyNGE5MzNkOTFkNTc2NmNmMjM2OWMyKSB0aGUgdG9rZW5zIHVzZWQgd2hlbiBbcmVwbHlpbmcgYnkgZW1haWwgdG8gaXNzdWVzIG9yIHB1bGwgcmVxdWVzdHNdKGh0dHBzOi8vZm9yZ2Vqby5vcmcvZG9jcy92OS4wL3VzZXIvaW5jb21pbmcvKSB3ZXJlIHdlYWtlciB0aGFuIHRoZSBbcmZjMjEwNCByZWNvbW1lbmRhdGlvbnNdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjEwNCNzZWN0aW9uLTUpLiBUaGUgdG9rZW5zIGFyZSBub3cgdHJ1bmNhdGVkIHRvIDEyOCBiaXRzIGluc3RlYWQgb2YgODAgYml0cy4gSXQgaXMgbm8gbG9uZ2VyIHBvc3NpYmxlIHRvIHJlcGx5IHRvIGVtYWlscyBzZW50IGJlZm9yZSB0aGUgdXBncmFkZSBiZWNhdXNlIHRoZSB3ZWFrZXIgdG9rZW5zIGFyZSBpbnZhbGlkLg==-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): <!--number 5976 --><!--line 4 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC83ODZkZmM3ZmI4MWVlNzZkNDI5MmNhNWZjYjMzZTZlYTdiZGNjYzI5KSBhIHJlZ2lzdGVyZWQgdXNlciBjb3VsZCBtb2RpZnkgdGhlIHVwZGF0ZSBmcmVxdWVuY3kgb2YgYW55IHB1c2ggbWlycm9yIChlLmcuIGV2ZXJ5IDRoIGluc3RlYWQgb2YgZXZlcnkgOGgpLiBUaGV5IGFyZSBub3cgb25seSBhYmxlIHRvIGRvIHRoYXQgaWYgdGhleSBoYXZlIGFkbWluaXN0cmF0aXZlIHBlcm1pc3Npb25zIG9uIHRoZSByZXBvc2l0b3J5Lg==-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): <!--number 5976 --><!--line 5 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9lNmJiZWNiMDJkNDc3MzBkM2NjNjMwZDQxOWZlMjdlZjJmYjVjYjM5KSBpdCB3YXMgcG9zc2libGUgdG8gdXNlIGJhc2ljIGF1dGhvcml6YXRpb24gKGkuZS4gdXNlcjpwYXNzd29yZCkgZm9yIHJlcXVlc3RzIHRvIHRoZSBBUEkgZXZlbiB3aGVuIHNlY3VyaXR5IGtleXMgd2VyZSBlbnJvbGxlZCBmb3IgYSB1c2VyLiBJdCBpcyBubyBsb25nZXIgcG9zc2libGUsIGFuIGFwcGxpY2F0aW9uIHRva2VuIG11c3QgYmUgdXNlZCBpbnN0ZWFkLg==-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): <!--number 5976 --><!--line 6 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC83MDY3Y2M3ZGE0ZjE0NGNjOGEyZmQyYWU2ZTUzMDdlMDQ2NWFjZTdmKSBzb21lIG1hcmt1cCBzYW5pdGF0aW9uIHJ1bGVzIHdlcmUgbm90IGFzIHN0cm9uZyBhcyB0aGV5IGNvdWxkIGJlIChlLmcuIGFsbG93aW5nIGBlbW9qaSBzb21ldGhpbmdlbHNlYCBhcyB3ZWxsIGFzIGBlbW9qaWApLiBUaGUgcnVsZXMgYXJlIG5vdyBzdHJpY3RlciBhbmQgZG8gbm90IGFsbG93IGZvciBzdWNoIGNhc2VzLg==-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): <!--number 5976 --><!--line 7 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9iNzAxOTY2NTNmOWQ3ZDNiOWQ0ZTcyZDExNGU1Y2M2ZjQ3Mjk4OGM0KSB3aGVuIEZvcmdlam8gaXMgY29uZmlndXJlZCB0byBlbmFibGUgaW5zdGFuY2Ugd2lkZSBzZWFyY2ggKGUuZy4gd2l0aCBbYmxldmVdKGh0dHBzOi8vYmxldmVzZWFyY2guY29tLykpLCByZXN1bHRzIGZvdW5kIGluIHRoZSByZXBvc2l0b3JpZXMgb2YgcHJpdmF0ZSBvciBsaW1pdGVkIHVzZXJzIHdlcmUgZGlzcGxheWVkIHRvIGFub255bW91cyB2aXNpdG9ycy4gVGhlIHJlc3VsdHMgZm91bmQgaW4gcHJpdmF0ZSBvciBsaW1pdGVkIG9yZ2FuaXphdGlvbnMgd2VyZSBub3QgZGlzcGxheWVkLiBUaGUgc2VhcmNoIHJlc3VsdHMgZm91bmQgaW4gdGhlIHJlcG9zaXRvcmllcyBvZiBwcml2YXRlIG9yIGxpbWl0ZWQgdXNlciBhcmUgbm8gbG9uZ2VyIGRpc3BsYXllZCB0byBhbm9ueW1vdXMgdmlzaXRvcnMu-->[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.<!--description-->
<!--end release-notes-assistant-->

View file

@ -0,0 +1,18 @@
<!--start release-notes-assistant-->
## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Security bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6248) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6252)): <!--number 6252 --><!--line 0 --><!--description Zml4OiBlbnN1cmUgY29ycmVjdCBzc2ggcHVibGljIGtleSBpcyB1c2VkIGZvciBhdXRoZW50aWNhdGlvbg==-->When Forgejo is configured to run the internal ssh server with `[server].START_SSH_SERVER=true`, it was possible for a registered user to impersonate another user. The rootless container image uses the internal ssh server by default and was vulnerable. A Forgejo instance running from a binary or from a root container image does not use the internal ssh server by default and was not vulnerable. The incorrect use of the crypto package is the root cause of the vulnerability and was fixed for the internal ssh server.<!--description-->
- Bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6124) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6132)): <!--number 6132 --><!--line 0 --><!--description Zml4OiBkb2N0b3IgZmFpbHMgd2l0aCBwcTogc3ludGF4IGVycm9yIGF0IG9yIG5lYXIgIi4iIHdoaWxzdCBjb3VudGluZyBBdXRob3JpemF0aW9uIHRva2VuIHdpdGhvdXQgZXhpc3RpbmcgVXNlcg==-->fix: doctor fails with pq: syntax error at or near "." whilst counting Authorization token without existing User<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6054) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6056)): <!--number 6056 --><!--line 0 --><!--description Zml4OiBEbyBub3QgZGVsZXRlIGdsb2JhbCBPYXV0aDIgYXBwbGljYXRpb25z-->fix: Do not delete global Oauth2 applications<!--description-->
- Included for completeness but not worth a release note
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6246): <!--number 6246 --><!--line 0 --><!--description VXBkYXRlIG1vZHVsZSBnb2xhbmcub3JnL3gvY3J5cHRvIHRvIHYwLjMxLjAgKHY3LjAvZm9yZ2Vqbyk=-->Update module golang.org/x/crypto to v0.31.0 (v7.0/forgejo)<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6223) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6230)): <!--number 6230 --><!--line 0 --><!--description Y2hvcmUoY2kpOiBzZXQgdGhlIG1pbGVzdG9uZSB3aGVuIGEgcHVsbCByZXF1ZXN0IGlzIGNsb3NlZCAodGFrZSA0KQ==-->chore(ci): set the milestone when a pull request is closed (take 4)<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6219) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6224)): <!--number 6224 --><!--line 0 --><!--description Y2hvcmUoY2kpOiBzZXQgdGhlIG1pbGVzdG9uZSB3aGVuIGEgcHVsbCByZXF1ZXN0IGlzIG9wZW4gKHRha2UgMyk=-->chore(ci): set the milestone when a pull request is open (take 3)<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6211) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6216)): <!--number 6216 --><!--line 0 --><!--description Y2hvcmUoY2kpOiBzZXQgdGhlIG1pbGVzdG9uZSB3aGVuIGEgcHVsbCByZXF1ZXN0IGlzIG9wZW4=-->chore(ci): set the milestone when a pull request is open<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6034) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6036)): <!--number 6036 --><!--line 0 --><!--description Y2hvcmUoY2kpOiByZW1vdmUgdW51c2VkIGV4cGVyaW1lbnRhbCBETlMgdXBkYXRlcw==-->chore(ci): remove unused experimental DNS updates<!--description-->
<!--end release-notes-assistant-->

View file

@ -0,0 +1,13 @@
This is a security release. See the documentation for more information on the [upgrade procedure](https://forgejo.org/docs/v7.0/admin/upgrade/).
- Security
A [change introduced in Forgejo v1.21](https://codeberg.org/forgejo/forgejo/pulls/1433) allows a Forgejo user with write permission on a repository description to [inject a client-side script into the web page viewed by the visitor](https://en.wikipedia.org/wiki/Cross-site_scripting). This XSS allows for `href` in anchor elements to be set to a `javascript:` URI in the repository description, which will execute the specified script upon clicking (and not upon loading). [`AllowStandardURLs`](https://pkg.go.dev/github.com/microcosm-cc/bluemonday#Policy.AllowStandardURLs) is now called for the repository description policy, which ensures that URIs in anchor elements are `mailto:`, `http://` or `https://` and thereby disallowing the `javascript:` URI.
<!--start release-notes-assistant-->
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4896) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4900)): <!--number 4900 --><!--line 0 --><!--description ZGlzYWxsb3cgamF2YXNjcmlwdDogVVJJIGluIHRoZSByZXBvc2l0b3J5IGRlc2NyaXB0aW9u-->disallow javascript: URI in the repository description<!--description-->
- Localization
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4568) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4882)): <!--number 4882 --><!--line 0 --><!--description aTE4bjogYmFja3BvcnQgb2YgIzQ1NjggIzQ2NjggYW5kICM0NzgzIHRvIHY3-->i18n: backport of #4568 #4668 and #4783 to v7<!--description-->
<!--end release-notes-assistant-->

View file

@ -0,0 +1,18 @@
This is a security release. See the documentation for more information on the [upgrade procedure](https://forgejo.org/docs/v7.0/admin/upgrade/).
- Security bug fixes
[The scope of application tokens was not verified](https://codeberg.org/forgejo/forgejo/pulls/5149) when writing containers or Conan packages. This is of no consequence when the user associated with the application token does not have write access to packages. If the user has write access to packages, such a token can be used to write containers and Conan packages. An application token that was used to write containers or Conan packages without the `package:write` scope will now fail with an unauthorized error. It must be re-created to include the `package:write` scope.
<!--start release-notes-assistant-->
<!--URL:https://codeberg.org/forgejo/forgejo-->
- User Interface bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5029) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5033)): <!--number 5033 --><!--line 0 --><!--description W1BPUlRdIEZpeCBvdmVyZmxvdyBmb3IgaW1hZ2VzIG9uIHByb2plY3QgY2FyZHMgKGdpdGVhIzMxNjgzKQ==-->Overflow for images on project cards.<!--description-->
- Bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5149) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5150)): <!--number 5150 --><!--line 0 --><!--description VGhlIHNjb3BlIG9mIGFwcGxpY2F0aW9uIHRva2VucyBpcyBub3QgdmVyaWZpZWQgd2hlbiB3cml0aW5nIGNvbnRhaW5lcnMgb3IgQ29uYW4gcGFja2FnZXMuIFRoaXMgaXMgb2Ygbm8gY29uc2VxdWVuY2Ugd2hlbiB0aGUgdXNlciBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9uIHRva2VuIGRvZXMgbm90IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHBhY2thZ2VzLiBJZiB0aGUgdXNlciBoYXMgd3JpdGUgYWNjZXNzIHRvIHBhY2thZ2VzLCBzdWNoIGEgdG9rZW4gY2FuIGJlIHVzZWQgdG8gd3JpdGUgY29udGFpbmVycyBhbmQgQ29uYW4gcGFja2FnZXMu-->The scope of application tokens is not verified when writing containers or Conan packages.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4885) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4950)): <!--number 4950 --><!--line 0 --><!--description Zml4OiBSdW4gZnVsbCBQUiBjaGVja3Mgb24gYWdpdCBwdXNo-->Run full PR checks on AGit push.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/3264) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4999)): <!--number 4999 --><!--line 4 --><!--description LSBmaXg6IFtjb21taXRdKGh0dHBzOi8vY29kZWJlcmcub3JnL2Zvcmdlam8vZm9yZ2Vqby9jb21taXQvMzY0OTIyYzZlNGYyODI2NGFkZDllMjUwMWEzNTJjMjVhZDZhMDk5Mykgd2hlbiBhIHJlcG9zaXRvcnkgaXMgYWRvcHRlZCwgaXRzIG9iamVjdCBmb3JtYXQgaXMgbm90IHNldCBpbiB0aGUgZGF0YWJhc2Uu-->- [commit](https://codeberg.org/forgejo/forgejo/commit/364922c6e4f28264add9e2501a352c25ad6a0993) When a repository is adopted, its object format is not set in the database.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/3264) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4999)): <!--number 4999 --><!--line 5 --><!--description LSBmaXg6IFtjb21taXRdKGh0dHBzOi8vY29kZWJlcmcub3JnL2Zvcmdlam8vZm9yZ2Vqby9jb21taXQvZTdmMzMyYTU1ZDZhNDhhM2YzYjRmMmJmYTQzZDE4NDU1YWMwMGFjYykgZHVyaW5nIGEgbWlncmF0aW9uIGZyb20gYml0YnVja2V0LCBMRlMgZG93bmxvYWRzIGZhaWwu-->- [commit](https://codeberg.org/forgejo/forgejo/commit/e7f332a55d6a48a3f3b4f2bfa43d18455ac00acc) During a migration from bitbucket, LFS downloads fail.<!--description-->
- Localization
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4889) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5138)): <!--number 5138 --><!--line 0 --><!--description QmFja3BvcnRzIG9mICM0ODg5IGFuZCAjNDk4NCB0byB2Nw==-->Backports of #4889 and #4984 to v7<!--description-->

View file

@ -0,0 +1,9 @@
<!--start release-notes-assistant-->
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Security
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5244) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5246)): <!--number 5246 --><!--line 0 --><!--description cmVwbGFjZSB2LWh0bWwgd2l0aCB2LXRleHQgaW4gYnJhbmNoIHNlYXJjaCBpbnB1dGJveCBmb3IgWFNTIHByb3RlY3Rpb24=-->replace v-html with v-text in branch search inputbox for XSS protection<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5201): <!--number 5201 --><!--line 0 --><!--description VXBkYXRlIGRlcGVuZGVuY3kgd2VicGFjayB0byB2NS45NC4wIFtTRUNVUklUWV0gKHY3LjAvZm9yZ2Vqbyk=-->Upgrade [webpack to v5.94.0](https://github.com/webpack/webpack/releases/tag/v5.94.0) as a precaution to mitigate [CVE-2024-43788](https://github.com/advisories/GHSA-4vvj-4cpr-p986), although we were not yet able to confirm that this can be exploited in Forgejo.<!--description-->
- Localization
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5070) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5181)): <!--number 5181 --><!--line 0 --><!--description aTE4bjogdXBkYXRlIG9mIHRyYW5zbGF0aW9ucyBmcm9tIENvZGViZXJnIFRyYW5zbGF0ZQ==-->i18n: update of translations from Codeberg Translate<!--description-->
<!--end release-notes-assistant-->

View file

@ -0,0 +1,20 @@
This is a security release. See the documentation for more information on the [upgrade procedure](https://forgejo.org/docs/v8.0/admin/upgrade/).
- Security bug fixes
A [change introduced in Forgejo v1.21](https://codeberg.org/forgejo/forgejo/pulls/1433) allows a Forgejo user with write permission on a repository description to [inject a client-side script into the web page viewed by the visitor](https://en.wikipedia.org/wiki/Cross-site_scripting). This XSS allows for `href` in anchor elements to be set to a `javascript:` URI in the repository description, which will execute the specified script upon clicking (and not upon loading). [`AllowStandardURLs`](https://pkg.go.dev/github.com/microcosm-cc/bluemonday#Policy.AllowStandardURLs) is now called for the repository description policy, which ensures that URIs in anchor elements are `mailto:`, `http://` or `https://` and thereby disallowing the `javascript:` URI.
<!--start release-notes-assistant-->
<!--URL:https://codeberg.org/forgejo/forgejo-->
- User Interface bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4835) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4848)): <!--number 4848 --><!--line 0 --><!--description RG8gbm90IGluY2x1ZGUgdHJhaWxpbmcgRU9MIGNoYXJhY3RlciB3aGVuIGNvdW50aW5nIGxpbmVz-->Do not include trailing EOL character when counting lines<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4836) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4847)): <!--number 4847 --><!--line 0 --><!--description QWRkIGJhY2tncm91bmQgdG8gcmVhY3Rpb25zIG9uIGhvdmVy-->Add background to reactions on hover<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4806) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4807)): <!--number 4807 --><!--line 0 --><!--description UHJldmVudCB1cHBlcmNhc2UgaW4gaGVhZGVyIG9mIGRhc2hib2FyZCBjb250ZXh0IHNlbGVjdG9y-->Prevent uppercase in header of dashboard context selector<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4754) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4756)): <!--number 4756 --><!--line 0 --><!--description Rml4IHBhZ2UgbGF5b3V0IGluIGFkbWluIHNldHRpbmdz-->Fix page layout in admin settings<!--description-->
- Bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4896) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4901)): <!--number 4901 --><!--line 0 --><!--description ZGlzYWxsb3cgamF2YXNjcmlwdDogVVJJIGluIHRoZSByZXBvc2l0b3J5IGRlc2NyaXB0aW9u-->disallow javascript: URI in the repository description<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4852) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4865)): <!--number 4865 --><!--line 0 --><!--description RW5zdXJlIGFsbCBmaWx0ZXJzIGFyZSBwZXJzaXN0ZW50IGluIGlzc3VlIGZpbHRlcnM=-->Ensure all filters are persistent in issue filters<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4828) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4840)): <!--number 4840 --><!--line 0 --><!--description QWxsb3cgNCBjaGFyYWNodGVyIFNIQSBpbiBgL3NyYy9jb21taXRg-->Allow 4 charachter SHA in `/src/commit`<!--description-->
- Localization
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4668) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4881)): <!--number 4881 --><!--line 0 --><!--description aTE4bjogYmFja3BvcnQgb2YgIzQ2NjggYW5kICM0NzgzIHRvIHY4-->i18n: backport of #4668 and #4783 to v8<!--description-->
<!--end release-notes-assistant-->

View file

@ -0,0 +1,24 @@
This is a security release. See the documentation for more information on the [upgrade procedure](https://forgejo.org/docs/v8.0/admin/upgrade/).
- Security
[The scope of application tokens was not verified](https://codeberg.org/forgejo/forgejo/pulls/5149) when writing containers or Conan packages. This is of no consequence when the user associated with the application token does not have write access to packages. If the user has write access to packages, such a token can be used to write containers and Conan packages. An application token that was used to write containers or Conan packages without the `package:write` scope will now fail with an unauthorized error. It must be re-created to include the `package:write` scope.
<!--start release-notes-assistant-->
<!--URL:https://codeberg.org/forgejo/forgejo-->
- User Interface bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5029) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5032)): <!--number 5032 --><!--line 0 --><!--description W1BPUlRdIEZpeCBvdmVyZmxvdyBmb3IgaW1hZ2VzIG9uIHByb2plY3QgY2FyZHMgKGdpdGVhIzMxNjgzKQ==-->Overflow for images on project cards.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4798) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4919)): <!--number 4919 --><!--line 0 --><!--description Zml4KHVpKTogYWxsb3cgdW5yZWFjdGluZyBmcm9tIGNvbW1lbnQgcG9wb3Zlcg==-->Allow unreacting from comment popover.<!--description-->
- Bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5149) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5151)): <!--number 5151 --><!--line 0 --><!--description VGhlIHNjb3BlIG9mIGFwcGxpY2F0aW9uIHRva2VucyBpcyBub3QgdmVyaWZpZWQgd2hlbiB3cml0aW5nIGNvbnRhaW5lcnMgb3IgQ29uYW4gcGFja2FnZXMuIFRoaXMgaXMgb2Ygbm8gY29uc2VxdWVuY2Ugd2hlbiB0aGUgdXNlciBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9uIHRva2VuIGRvZXMgbm90IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHBhY2thZ2VzLiBJZiB0aGUgdXNlciBoYXMgd3JpdGUgYWNjZXNzIHRvIHBhY2thZ2VzLCBzdWNoIGEgdG9rZW4gY2FuIGJlIHVzZWQgdG8gd3JpdGUgY29udGFpbmVycyBhbmQgQ29uYW4gcGFja2FnZXMu-->The scope of application tokens is not verified when writing containers or Conan packages.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5065) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5080)): <!--number 5080 --><!--line 0 --><!--description d2hlbiBhIEZvcmdlam8gQWN0aW9ucyB3b3JrZmxvdyBpbmNsdWRlcyBhIGB3b3JrZmxvd19kaXNwYXRjaGAgd2l0aCBgaW5wdXRzYCBhbmQgb3RoZXIgZXZlbnRzIChmb3IgaW5zdGFuY2UgYHB1c2hgKSwgaXQgaXMgc2lsZW50bHkgaWdub3JlZCBiZWNhdXNlIG9mIGEgcGFyc2luZyBlcnJvci4=-->When a Forgejo Actions workflow includes a `workflow_dispatch` with `inputs` and other events (for instance `push`), it is silently ignored because of a parsing error.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5053): <!--number 5053 --><!--line 0 --><!--description W1BPUlRdIEZpeCBhdXRvbWVyZ2Ugb24gQUdpdCBQUnMgKGdpdGVhIzMxODgxKQ==-->Automerge on AGit pull requests is ignored.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4998) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5050)): <!--number 5050 --><!--line 0 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC83ZjFkYjFkZjNlZThkNjIwZjk5N2I4ZTcwYTQwYzJmNDhhZTk2YzBmKSBTaG93IGxvY2sgb3duZXIgaW5zdGVhZCBvZiByZXBvIG93bmVyIG9uIExGUyBzZXR0aW5nIHBhZ2Uu-->[commit](https://codeberg.org/forgejo/forgejo/commit/7f1db1df3ee8d620f997b8e70a40c2f48ae96c0f) Show lock owner instead of repo owner on LFS setting page.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4998) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5050)): <!--number 5050 --><!--line 1 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9lYmZkYzY1OWQ4MTQ1NjFmODc4MzA5NGUyZWIyNjczOGE1NTAwZTU1KSBSZW5kZXIgcGxhaW4gdGV4dCBmaWxlIGlmIHRoZSBMRlMgb2JqZWN0IGRvZXNuJ3QgZXhpc3Qu-->[commit](https://codeberg.org/forgejo/forgejo/commit/ebfdc659d814561f8783094e2eb26738a5500e55) Render plain text file if the LFS object doesn't exist.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4998) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5050)): <!--number 5050 --><!--line 2 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC85ZTA2NmMzY2FkN2JiMWIzMGUyZGVmMzRiZDA2MDhhYWM4MjVjZjU4KSBGaXggcGFuaWMgb2Ygc3NoIHB1YmxpYyBrZXkgcGFnZSBhZnRlciBkZWxldGlvbiBvZiBhdXRoIHNvdXJjZS4=-->[commit](https://codeberg.org/forgejo/forgejo/commit/9e066c3cad7bb1b30e2def34bd0608aac825cf58) Panic of ssh public key page after deletion of an auth source.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4998) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5050)): <!--number 5050 --><!--line 3 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9hOGUyNWU5MDdjNjYxNDA5NjFmMjhiYTkyNDAzMTc2YzgxNmRmYjYwKSBBZGQgbWlzc2luZyByZXBvc2l0b3J5IHR5cGUgZmlsdGVyIHBhcmFtZXRlcnMgdG8gcGFnZXIu-->[commit](https://codeberg.org/forgejo/forgejo/commit/a8e25e907c66140961f28ba92403176c816dfb60) Add missing repository type filter parameters to pager.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4907) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4965)): <!--number 4965 --><!--line 0 --><!--description UmV2ZXJ0ZWQgYSBjaGFuZ2UgZnJvbSBHaXRlYSB3aGljaCBwcmV2ZW50ZWQgYWxsb3cvcmVqZWN0IHJldmlld3Mgb24gbWVyZ2VkIG9yIGNsb3NlZCBQUnMuIFRoaXMgY2hhbmdlIHdhcyBub3QgY29uc2lkZXJlZCBieSB0aGUgRm9yZ2VqbyBVSSB0ZWFtIGFuZCB0aGVyZSBpcyBhIGNvbnNlbnN1cyB0aGF0IGl0IGZlZWxzIGxpa2UgYSByZWdyZXNzaW9uLCBzaW5jZSBpdCBpbnRlcmZlcmVzIHdpdGggd29ya2Zsb3dzIGtub3duIHRvIGJlIHVzZWQgYnkgRm9yZ2VqbyB1c2VycyB3aXRob3V0IHByb3ZpZGluZyBhIHRhbmdpYmxlIGJlbmVmaXQu-->Reverted a change from Gitea which prevented allow/reject reviews on merged or closed PRs. This change was not considered by the Forgejo UI team and there is a consensus that it feels like a regression, since it interferes with workflows known to be used by Forgejo users without providing a tangible benefit.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4885) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4951)): <!--number 4951 --><!--line 0 --><!--description Zml4OiBSdW4gZnVsbCBQUiBjaGVja3Mgb24gYWdpdCBwdXNo-->Run full PR checks on AGit push.<!--description-->
- Localization
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4984) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5116)): <!--number 5116 --><!--line 0 --><!--description aTE4bjogdXBkYXRlIG9mIHRyYW5zbGF0aW9ucyBmcm9tIENvZGViZXJnIFRyYW5zbGF0ZQ==-->i18n: update of translations from Codeberg Translate<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4889) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5114)): <!--number 5114 --><!--line 0 --><!--description aTE4bjogdXBkYXRlIG9mIHRyYW5zbGF0aW9ucyBmcm9tIENvZGViZXJnIFRyYW5zbGF0ZQ==-->i18n: update of translations from Codeberg Translate<!--description-->

View file

@ -0,0 +1,10 @@
<!--start release-notes-assistant-->
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Security
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5244) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5247)): <!--number 5247 --><!--line 0 --><!--description cmVwbGFjZSB2LWh0bWwgd2l0aCB2LXRleHQgaW4gYnJhbmNoIHNlYXJjaCBpbnB1dGJveCBmb3IgWFNTIHByb3RlY3Rpb24=-->replace v-html with v-text in branch search inputbox for XSS protection<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5202): <!--number 5202 --><!--line 0 --><!--description VXBkYXRlIGRlcGVuZGVuY3kgd2VicGFjayB0byB2NS45NC4wIFtTRUNVUklUWV0gKHY4LjAvZm9yZ2Vqbyk=-->Upgrade [webpack to v5.94.0](https://github.com/webpack/webpack/releases/tag/v5.94.0) as a precaution to mitigate [CVE-2024-43788](https://github.com/advisories/GHSA-4vvj-4cpr-p986), although we were not yet able to confirm that this can be exploited in Forgejo.<!--description-->
- Localization
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5182) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5230)): <!--number 5230 --><!--line 0 --><!--description aTE4bjogdXBkYXRlIG9mIHRyYW5zbGF0aW9ucyBmcm9tIENvZGViZXJnIFRyYW5zbGF0ZQ==-->i18n: update of translations from Codeberg Translate<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5070) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5161)): <!--number 5161 --><!--line 0 --><!--description aTE4bjogdXBkYXRlIG9mIHRyYW5zbGF0aW9ucyBmcm9tIENvZGViZXJnIFRyYW5zbGF0ZQ==-->i18n: update of translations from Codeberg Translate<!--description-->
<!--end release-notes-assistant-->

View file

@ -0,0 +1,114 @@
A [companion blog post](https://forgejo.org/2024-10-release-v9-0/) provides additional context on this major release.
<!--start release-notes-assistant-->
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Breaking changes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4724): <!--number 4724 --><!--line 0 --><!--description T0lEQyBpbnRlZ3JhdGlvbnMgdGhhdCBQT1NUIHRvIGAvbG9naW4vb2F1dGgvaW50cm9zcGVjdGAgd2l0aG91dCBzZW5kaW5nIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24gd2lsbCBub3cgZmFpbCB3aXRoIGEgNDAxIEhUVFAgVW5hdXRob3JpemVkIGVycm9yLiBUbyBmaXggdGhlIGVycm9yLCB0aGUgY2xpZW50IG11c3QgYmVnaW4gc2VuZGluZyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHdpdGggYSB2YWxpZCBjbGllbnQgSUQgYW5kIHNlY3JldC4gVGhpcyBlbmRwb2ludCB3YXMgcHJldmlvdXNseSBhdXRoZW50aWNhdGVkIHZpYSB0aGUgaW50cm9zcGVjdGlvbiB0b2tlbiBpdHNlbGYsIHdoaWNoIGlzIGxlc3Mgc2VjdXJlLg==-->OIDC integrations that POST to `/login/oauth/introspect` without sending HTTP basic authentication will now fail with a 401 HTTP Unauthorized error. To fix the error, the client must begin sending HTTP basic authentication with a valid client ID and secret. This endpoint was previously authenticated via the introspection token itself, which is less secure.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5515) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5526)): <!--number 5526 --><!--line 0 --><!--description KipGaXhpbmcgdGhpcyBidWcgaXMgYSBicmVha2luZyBjaGFuZ2UgYmVjYXVzZSBleGlzdGluZyB0b2tlbnMgd2l0aCBhIHB1YmxpYyBzY29wZSB3aWxsIG5vIGxvbmdlciByZXR1cm4gcHJpdmF0ZSByZXNvdXJjZXMuIFRoZXkgaGF2ZSB0byBiZSBkZWxldGVkIGFuZCByZS1jcmVhdGVkIHdpdGhvdXQgdGhlIHB1YmxpYyBzY29wZSB0byByZXN0b3JlIHRoZWlyIG9yaWdpbmFsIGJlaGF2aW9yKiouIFRoZSBwdWJsaWMgc2NvcGUgb2YgYW4gYXBwbGljYXRpb24gdG9rZW4gZG9lcyBub3QgZmlsdGVyIG91dCBwcml2YXRlIHJlcG9zaXRvcmllcywgb3JnYW5pemF0aW9ucyBvciBwYWNrYWdlcyBpbiBzb21lIGNhc2VzLiBUaGlzIHNjb3BlIGlzIG5vdCB0aGUgZGVmYXVsdCwgaXQgaGFzIHRvIGJlIG1hbnVhbGx5IHNldCB2aWEgdGhlIHdlYiBVSSBvciB0aGUgQVBJLiBXaGVuIHRoZSBwdWJsaWMgc2NvcGUgaXMgZXhwbGljaXRseSBhZGRlZCB0byBhbiBhcHBsaWNhdGlvbiB0b2tlbiB0aGF0IGlzIGFsbG93ZWQgdG8gbGlzdCB0aGUgcmVwb3NpdG9yaWVzIGFuZCBwYWNrYWdlcyBvZiBhIHVzZXIgb3IgYW4gb3JnYW5pemF0aW9uLCBpdCBpcyBtZWFudCBhcyBhIHJlc3RyaWN0aW9uLiBGb3IgaW5zdGFuY2UgaWYgYSB1c2VyIGhhcyB0d28gcmVwb3NpdG9yaWVzLCBvbmUgcHJpdmF0ZSBhbmQgdGhlIG90aGVyIHB1YmxpY2x5IHZpc2libGUsIGEgdG9rZW4gd2l0aCB0aGUgcHVibGljIHNjb3BlIHVzZWQgd2l0aCB0aGUgQVBJIGVuZHBvaW50IGxpc3RpbmcgdGhlIHJlcG9zaXRvcmllcyB0aGF0IGJlbG9uZyB0byB0aGlzIHVzZXIgbXVzdCBvbmx5IHJldHVybiB0aGUgcHVibGljbHkgdmlzaWJsZSBvbmUgYW5kIG5vdCByZXZlYWwgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgcHJpdmF0ZSBvbmUu-->**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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4941): <!--number 4941 --><!--line 0 --><!--description RHJvcCBzdXBwb3J0IHRvIGJ1aWxkIEZvcmdlam8gd2l0aCB0aGUgb3B0aW9uYWwgZ28tZ2l0IEdpdCBiYWNrZW5kLiBJdCBvbmx5IGFmZmVjdHMgdXNlcnMgd2hvIGJ1aWx0IEZvcmdlam8gbWFudWFsbHkgdXNpbmcgYFRBR1M9Z29naXRzYCwgd2hpY2ggbm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiBNb3ZpbmcgZm9yd2FyZCwgd2Ugb25seSBzdXBwb3J0IHRoZSBkZWZhdWx0IGJhY2tlbmQgdXNpbmcgdGhlIGdpdCBiaW5hcnkuIFBsZWFzZSBnZXQgaW4gdG91Y2ggaWYgeW91IHVzZWQgdGhlIGdvLWdpdCBiYWNrZW5kIGFuZCByZXF1aXJlIGFueSBhc3Npc3RhbmNlIG1vdmluZyBhd2F5IGZyb20gaXQu-->Drop support to build Forgejo with the optional go-git Git backend. It only affects users who built Forgejo manually using `TAGS=gogits`, which no longer has any effect. Moving forward, we only support the default backend using the git binary. Please get in touch if you used the go-git backend and require any assistance moving away from it.<!--description-->
- User Interface features
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5286): <!--number 5286 --><!--line 0 --><!--description c2V0IGNyZWF0ZWRfYnkgYXMgdGhlIGRlZmF1bHQgZmlsdGVyIGZvciAvaXNzdWVzIGFuZCAvcHVsbHM=-->Set created_by as the default filter for /issues and /pulls.<!--description-->
Note that this also affects /org/*/pulls and /org/*/issues, but for them this default might be reverted back in the future releases.
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5270): <!--number 5270 --><!--line 0 --><!--description c2V0IGZ1enp5IGFzIGRlZmF1bHQgZm9yIGlzc3VlIHNlYXJjaA==-->Set fuzzy as default for issue search.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5214): <!--number 5214 --><!--line 0 --><!--description dWk6IEltcHJvdmUgY29tbWl0IGdyYXBoIGxheW91dA==-->Improve commit graph layout.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5205): <!--number 5205 --><!--line 0 --><!--description bWVybWFpZDogW0FkZCBzdXBwb3J0IGZvciBpY29uaWZ5IGljb25zXShodHRwczovL2dpdGh1Yi5jb20vbWVybWFpZC1qcy9tZXJtYWlkL3B1bGwvNTc5Myku-->mermaid: [Add support for iconify icons](https://github.com/mermaid-js/mermaid/pull/5793).<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5205): <!--number 5205 --><!--line 1 --><!--description bWVybWFpZDogW0FsbG93IG11bHRpLWxpbmUgcmVsYXRpb25zaGlwIGxhYmVsc10oaHR0cHM6Ly9naXRodWIuY29tL21lcm1haWQtanMvbWVybWFpZC9wdWxsLzU3MTEpLg==-->mermaid: [Allow multi-line relationship labels](https://github.com/mermaid-js/mermaid/pull/5711).<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5205): <!--number 5205 --><!--line 2 --><!--description bWVybWFpZDogW0FkZHMgYXJjaGl0ZWN0dXJlIGRpYWdyYW1zIHdoaWNoIGFsbG93cyB1c2VycyB0byBzaG93IHJlbGF0aW9ucyBiZXR3ZWVuIHNlcnZpY2VzXShodHRwczovL2dpdGh1Yi5jb20vbWVybWFpZC1qcy9tZXJtYWlkL3B1bGwvNTQ1Miku-->mermaid: [Adds architecture diagrams which allows users to show relations between services](https://github.com/mermaid-js/mermaid/pull/5452).<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5110): <!--number 5110 --><!--line 0 --><!--description SW1wcm92ZSBkaWZmcyBnZW5lcmF0ZWQgYnkgRm9yZ2Vqbw==-->Improve diffs generated by Forgejo.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5002): <!--number 5002 --><!--line 0 --><!--description ZmVhdCh1aSk6IEFkZCBgcmVsPSJub2ZvbGxvdyJgIHRvIGluLWxpc3QgbGFiZWxz-->Add `rel="nofollow"` to in-list labels.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4782): <!--number 4782 --><!--line 0 --><!--description RGlzdGluZ3Vpc2ggYmV0d2VlbiBuZXcgdGFncywgcmVsZWFzZXMgYW5kIHByZS1yZWxlYXNlcyBvbiBhY3Rpdml0eSBwYWdl-->Distinguish between new tags, releases and pre-releases on activity page.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4749): <!--number 4749 --><!--line 0 --><!--description aGlnaGxpZ2h0ZWQgY29kZSBzZWFyY2ggcmVzdWx0cw==-->Highlighted code search results.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4710): <!--number 4710 --><!--line 0 --><!--description UmVmYWN0b3IgcmVwbyBtaWdyYXRpb24gaXRlbXM=-->Refactor repo migration items.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4697): <!--number 4697 --><!--line 0 --><!--description ZmVhdChVSSk6IGFkZCBwYWNrYWdlIGNvdW50ZXIgdG8gcmVwby91c2VyL29yZyBvdmVydmlldyBwYWdlcw==-->Add package counter to repo/user/org overview pages.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4571): <!--number 4571 --><!--line 0 --><!--description UmVwbGFjZSBgdnVlLWJhci1ncmFwaGAgd2l0aCBgY2hhcnQuanNg-->Replace `vue-bar-graph` with `chart.js`.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4541): <!--number 4541 --><!--line 0 --><!--description ZmVhdCh1aSk6IGFkZCBtb3JlIGVtb2ppIGFuZCBjb2RlIGJsb2NrIHJlbmRlcmluZyBpbiBpc3N1ZXM=-->Add more emoji and code block rendering in issues.<!--description-->
- User Interface bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5261): <!--number 5261 --><!--line 0 --><!--description Rml4IGJhZCBzcGFjaW5nIG9uIG5ldyByZWxlYXNlIHBhZ2U=-->Bad spacing on new release page.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5180): <!--number 5180 --><!--line 0 --><!--description Rml4IG1pbGVzdG9uZSBhc3NpZ25tZW50IGluIG5ldyBpc3N1ZQ==-->Milestone assignment in new issue.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4928): <!--number 4928 --><!--line 0 --><!--description Z2l0LWdyZXA6IGVuc3VyZSBib3VuZGVkIGRlZmF1bHQgZm9yIE1hdGNoZXNQZXJGaWxl-->git-grep: ensure bounded default for MatchesPerFile.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4597): <!--number 4597 --><!--line 0 --><!--description Rml4IGdvIHRvIGNpdGF0aW9uIGJ1dHRvbg==-->Incorrect go to citation button.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4538): <!--number 4538 --><!--line 0 --><!--description Zml4KHVpKTogSFRNWCBzdXBwb3J0IGZvciBwcm9maWxlIGNhcmQ=-->Incorrect HTMX support for profile card.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4490): <!--number 4490 --><!--line 0 --><!--description W2FjY2Vzc2liaWxpdHldIEFkZCBrZXlib2FyZCBzdXBwb3J0IGZvciB0ZXN0IGFjdGlvbnM=-->Accessibility keyboard support for test actions.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4455): <!--number 4455 --><!--line 0 --><!--description VXBkYXRlIHB1bGwgcmVxdWVzdCBpY29ucw==-->Update pull request icons.<!--description-->
- Features
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5482) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5524)): <!--number 5524 --><!--line 0 --><!--description ZmVhdDogIkFzc2lnbiB0byBtZSIgYnV0dG9uIG9uIFBSIGFuZCBJc3N1ZXMgIzUyMTU=-->"Assign to me" button on PR and Issues.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5351) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5407)): <!--number 5407 --><!--line 0 --><!--description ZmVhdDogIGFkZCBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgcmVtb3ZhbCBzdXBwb3J0IGZvciBhcmNoIHBhY2thZ2U=-->Add architecture-specific removal support for arch package.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5372) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5406)): <!--number 5406 --><!--line 0 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC85ZDM0NzMxMTk4OTNmZmRlMGFiMzZkOThlN2EwZTQxYzVkMGJhOWEzKSBBZGQgYmluIHRvIENvbXBvc2VyIE1ldGFkYXRhLg==-->[commit](https://codeberg.org/forgejo/forgejo/commit/9d3473119893ffde0ab36d98e7a0e41c5d0ba9a3) Add bin to Composer Metadata.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5383): <!--number 5383 --><!--line 0 --><!--description aTE4bjogVVggaW1wcm92ZW1lbnRzOiBUZWFtIHBlcm1pc3Npb25zIGFuZCBpc3N1ZSBjbG9zaW5n-->Internationalization user experience improvements on team permissions and issue closing.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5325): <!--number 5325 --><!--line 2 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8yZGEwZWJiZDIzMTRmMTJiMjg3Njk0YzM3OGE4ODgzMTFkZDMzN2JjKSBTdXBwb3J0IGFsbG93ZWQgaG9zdHMgZm9yIG1pZ3JhdGlvbnMgdG8gd29yayB3aXRoIHByb3h5Lg==-->[commit](https://codeberg.org/forgejo/forgejo/commit/2da0ebbd2314f12b287694c378a888311dd337bc) Support allowed hosts for migrations to work with proxy.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5125): <!--number 5125 --><!--line 0 --><!--description VHJpdmlhbCBkZWZhdWx0IHF1b3RhIGNvbmZpZ3VyYXRpb24=-->Trivial default quota configuration.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5120): <!--number 5120 --><!--line 0 --><!--description TGFuZ3VhZ2UgZGV0ZWN0aW9uIGluIHRoZSByZXBvc2l0b3J5IGxlYXJuZWQgYWJvdXQgdGhlIGZvbGxvd2luZyBsYW5ndWFnZXM6IFtMdWF1XShodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViLWxpbmd1aXN0L2xpbmd1aXN0L3B1bGwvNjYxMiksIFtCUU5dKGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWItbGluZ3Vpc3QvbGluZ3Vpc3QvcHVsbC82NjIzKSwgW0Nyb24gdGFibGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWItbGluZ3Vpc3QvbGluZ3Vpc3QvcHVsbC82NzU5KSwgW05NT0RMXShodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViLWxpbmd1aXN0L2xpbmd1aXN0L3B1bGwvNjc3NiksIFtQa2xdKGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWItbGluZ3Vpc3QvbGluZ3Vpc3QvcHVsbC82NzMwKSwgW3RlbXBsXShodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViLWxpbmd1aXN0L2xpbmd1aXN0L3B1bGwvNjc5OCksIFtGSVJSVExdKGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWItbGluZ3Vpc3QvbGluZ3Vpc3QvcHVsbC82ODQ4KSwgW0p1bGlhIFJFUExdKGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWItbGluZ3Vpc3QvbGluZ3Vpc3QvcHVsbC82ODU5KSwgW0NhZGR5ZmlsZV0oaHR0cHM6Ly9naXRodWIuY29tL2dpdGh1Yi1saW5ndWlzdC9saW5ndWlzdC9wdWxsLzY4NjIpLg==-->Language detection in the repository learned about the following languages: [Luau](https://github.com/github-linguist/linguist/pull/6612), [BQN](https://github.com/github-linguist/linguist/pull/6623), [Cron table](https://github.com/github-linguist/linguist/pull/6759), [NMODL](https://github.com/github-linguist/linguist/pull/6776), [Pkl](https://github.com/github-linguist/linguist/pull/6730), [templ](https://github.com/github-linguist/linguist/pull/6798), [FIRRTL](https://github.com/github-linguist/linguist/pull/6848), [Julia REPL](https://github.com/github-linguist/linguist/pull/6859), [Caddyfile](https://github.com/github-linguist/linguist/pull/6862).<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5120): <!--number 5120 --><!--line 1 --><!--description VGhlIGZvbGxvd2luZyBleHRlbnNpb25zIG9yIGZpbGVuYW1lcyBpbiBhIHJlcG9zaXRvcnkgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWF0Y2hpbmcgbGFuZ3VhZ2U6IFsuc3VibGltZS1jb2xvci1zY2hlbWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWItbGluZ3Vpc3QvbGluZ3Vpc3QvcHVsbC82NzU4KSwgW01PRFVMRS5iYXplbC5sb2NrXShodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViLWxpbmd1aXN0L2xpbmd1aXN0L3B1bGwvNjc4MyksIFtDYXJnby50b21sLm9yaWddKGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWItbGluZ3Vpc3QvbGluZ3Vpc3QvcHVsbC82Nzg3KSwgW3RzeF0oaHR0cHM6Ly9naXRodWIuY29tL2dpdGh1Yi1saW5ndWlzdC9saW5ndWlzdC9wdWxsLzY3ODgpLCBbanVzdGZpbGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWItbGluZ3Vpc3QvbGluZ3Vpc3QvcHVsbC82Nzk1KSwgWy56aWcuem9uXShodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViLWxpbmd1aXN0L2xpbmd1aXN0L3B1bGwvNjgyMCksIFsuZW52cmNdKGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWItbGluZ3Vpc3QvbGluZ3Vpc3QvcHVsbC82ODY1KS4=-->The following extensions or filenames in a repository are associated with the matching language: [.sublime-color-scheme](https://github.com/github-linguist/linguist/pull/6758), [MODULE.bazel.lock](https://github.com/github-linguist/linguist/pull/6783), [Cargo.toml.orig](https://github.com/github-linguist/linguist/pull/6787), [tsx](https://github.com/github-linguist/linguist/pull/6788), [justfile](https://github.com/github-linguist/linguist/pull/6795), [.zig.zon](https://github.com/github-linguist/linguist/pull/6820), [.envrc](https://github.com/github-linguist/linguist/pull/6865).<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5090): <!--number 5090 --><!--line 0 --><!--description UmVtb3ZlIHN1cHBvcnQgZm9yIENvdWNoYmFzZSBhcyBhIHNlc3Npb24gcHJvdmlkZXI7IGl0IGluc3RlYWQgd2lsbCBub3cgZmFsbGJhY2sgdG8gdGhlIGZpbGUgcHJvdmlkZXIuIFRoZSByYXRpb25hbGUgZm9yIHJlbW92aW5nIENvdWNoYmFzZSBzdXBwb3J0IGlzIHRoYXQgaXQncyBub3QgZnJlZSBzb2Z0d2FyZSwgaHR0cHM6Ly93d3cuY291Y2hiYXNlLmNvbS9ibG9nL2NvdWNoYmFzZS1hZG9wdHMtYnNsLWxpY2Vuc2UvLCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSB0ZXN0ZWQgaW4gRm9yZ2VqbyBhbmQgbmVpdGhlciBzaG91bGQgYmUgc3VwcG9ydGVkLg==-->Remove support for Couchbase as a session provider; it instead will now fallback to the file provider. The rationale for removing Couchbase support is that it's not free software, https://www.couchbase.com/blog/couchbase-adopts-bsl-license/, and therefore cannot be tested in Forgejo and neither should be supported.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4967): <!--number 4967 --><!--line 0 --><!--description Z2l0LWdyZXA6IGFsbG93IHNlYXJjaGluZyBmb3Igd29yZHMgd2l0aCBpbml0aWFsIGRhc2hlcw==-->git-grep: allow searching for words with initial dashes.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4927): <!--number 4927 --><!--line 0 --><!--description Z2l0LWdyZXA6IHNraXAgYmluYXJ5IGZpbGVz-->git-grep: skip binary files.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4924): <!--number 4924 --><!--line 1 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9iZjczNzNhMjUyMGFlNTZhMWRjMDA0MTZlZmEwMmRlOTc0OWI2M2QzKSBGb3JnZWpvIEFjdGlvbnMgbG9ncyBhcmUgY29tcHJlc3NlZCBieSBkZWZhdWx0LiBJdCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyBgW2FjdGlvbnNdLkxPR19DT01QUkVTU0lPTj1ub25lYC4=-->[commit](https://codeberg.org/forgejo/forgejo/commit/bf7373a2520ae56a1dc00416efa02de9749b63d3) Forgejo Actions logs are compressed by default. It can be disabled by setting `[actions].LOG_COMPRESSION=none`.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4903): <!--number 4903 --><!--line 0 --><!--description c3VwcG9ydCBncm91cGluZyBieSBhbnkgcGF0aCBmb3IgYXJjaCBwYWNrYWdl-->Support grouping by any path for arch package.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4891): <!--number 4891 --><!--line 0 --><!--description UGVyZm9ybWFuY2U6IFJlbW92ZSBleHBlbnNpdmUgbmVhcmVzdCBicmFuY2ggY2FsY3VsYXRhdGlvbnMgKGAkLkJyYW5jaE5hbWVgKSBmcm9tIGNvbW1pdCBkaWZmIHZpZXcgKGAvOm93bmVyLzpyZXBvL2NvbW1pdC86Y29tbWl0YCk=-->Remove expensive nearest branch calculatations (`$.BranchName`) from commit diff view (`/:owner/:repo/commit/:commit`).<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4819): <!--number 4819 --><!--line 0 --><!--description QWxsb3cgcHVzaCBtaXJyb3JzIHRvIHVzZSBhIFNTSCBrZXkgYXMgdGhlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBmb3IgdGhlIG1pcnJvcmluZyBhY3Rpb24gaW5zdGVhZCBvZiB1c2luZyB1c2VyOnBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLiBUaGUgU1NIIGtleXBhaXIgaXMgY3JlYXRlZCBieSBGb3JnZWpvIGFuZCB0aGUgZGVzdGluYXRpb24gcmVwb3NpdG9yeSBtdXN0IGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgcHVibGljIGtleSB0byBhbGxvdyBmb3IgcHVzaCBvdmVyIFNTSC4=-->Allow push mirrors to use a SSH key as the authentication method for the mirroring action instead of using user:password authentication. The SSH keypair is created by Forgejo and the destination repository must be configured with the public key to allow for push over SSH.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): <!--number 4801 --><!--line 5 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8xMWI2MjUzZTc1MzJiYTExZGVlOGJjMzFkNGMyNjJiMTAyNjc0YTRkKSBVc2UgVVRDIGFzIGEgdGltZXpvbmUgd2hlbiBydW5uaW5nIHNjaGVkdWxlZCBhY3Rpb25zIHRhc2tzLg==-->[commit](https://codeberg.org/forgejo/forgejo/commit/11b6253e7532ba11dee8bc31d4c262b102674a4d) Use UTC as a timezone when running scheduled actions tasks.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): <!--number 4801 --><!--line 6 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9mZWI0M2IyNTg0YjdmNjRlYzdmOTk1MmFmMmI1MGIyMjEwZTZlNmNmKSBUaGUgYWN0aW9ucyBsb2dzIG9sZGVyIHRoYW4gYFthY3Rpb25zXS5MT0dfUkVURU5USU9OX0RBWVNgIGRheXMgYXJlIHJlbW92ZWQgKHRoZSBkZWZhdWx0IGlzIDM2NSku-->[commit](https://codeberg.org/forgejo/forgejo/commit/feb43b2584b7f64ec7f9952af2b50b2210e6e6cf) The actions logs older than `[actions].LOG_RETENTION_DAYS` days are removed (the default is 365).<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4780): <!--number 4780 --><!--line 0 --><!--description QWRkIHNpZ25hdHVyZSBzdXBwb3J0IGZvciB0aGUgUlBNIG1vZHVsZQ==-->Add signature support for the RPM module.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4766): <!--number 4766 --><!--line 0 --><!--description QWxsb3cgY29sb3IgYW5kIGJhY2tncm91bmQtY29sb3Igc3R5bGUgcHJvcGVydGllcyBmb3IgdGFibGUgY2VsbHM=-->Allow color and background-color style properties for table cells.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4716): <!--number 4716 --><!--line 0 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC84ZDIzNDMzZGFiMDhmY2JiODA0M2U1ZDIzOTE3MWZiYTU5YzUzMTA4KTogc3VwcG9ydCBwdWxsX3JlcXVlc3RfdGFyZ2V0IGV2ZW50IGZvciBjb21taXQgc3RhdHVzLg==-->[commit](https://codeberg.org/forgejo/forgejo/commit/8d23433dab08fcbb8043e5d239171fba59c53108): support pull_request_target event for commit status.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4716): <!--number 4716 --><!--line 2 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9jYjkwNzFiYmY0MzM3MTVmMGUxNmUzOWNiNjAxMjZiNjVmODIzNmEwKTogc3VwcG9ydCBkZWxldGUgdXNlciBlbWFpbCBpbiBhZG1pbiBwYW5lbC4=-->[commit](https://codeberg.org/forgejo/forgejo/commit/cb9071bbf433715f0e16e39cb60126b65f8236a0): support delete user email in admin panel.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4704): <!--number 4704 --><!--line 0 --><!--description W1NFQ10gTm90aWZ5IG93bmVyIGFib3V0IFRPVFAgZW5yb2xsbWVudA==-->Notify owner about TOTP enrollment.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4635): <!--number 4635 --><!--line 0 --><!--description RW1haWwgbm90aWZpY2F0aW9ucyBhcmUgbm93IHNlbnQgd2hlbiBhY2NvdW50IHNlY3VyaXR5IGNoYW5nZXMgYXJlIG1hZGU6IHBhc3N3b3JkIGNoYW5nZWQsIHByaW1hcnkgZW1haWwgY2hhbmdlZCAoZW1haWwgc2VudCB0byBvbGQgcHJpbWFyeSBtYWlsKSwgVE9UUCBkaXNhYmxlZCBvciBhIHNlY3VyaXR5IGtleSByZW1vdmVkLg==-->Email notifications are now sent when account security changes are made: password changed, primary email changed (email sent to old primary mail), TOTP disabled or a security key removed.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4633): <!--number 4633 --><!--line 0 --><!--description RW5hYmxlIGBJTlZBTElEQVRFX1JFRlJFU0hfVE9LRU5TYA==-->Enable `INVALIDATE_REFRESH_TOKENS`.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4625): <!--number 4625 --><!--line 0 --><!--description ZmVhdCh1aSk6IHNvcnQgbWlsZXN0b25lcyBieSBuYW1lIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiB0aGUgZHVlIGRhdGU=-->Sort milestones by name by default instead of the due date.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4607): <!--number 4607 --><!--line 0 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8yMWZkZDI4ZjA4NGU3ZjFhZWYzMDljOWViZDc1OTlmZmE2OTg2NDUzKSBhbGxvdyBzeW5jaHJvbml6aW5nIHVzZXIgc3RhdHVzIGZyb20gT0F1dGgyIGxvZ2luIHByb3ZpZGVycy4=-->[commit](https://codeberg.org/forgejo/forgejo/commit/21fdd28f084e7f1aef309c9ebd7599ffa6986453) allow synchronizing user status from OAuth2 login providers.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4607): <!--number 4607 --><!--line 1 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8wMDRjYzZkYzBhYjdjYzljMzI0Y2NiNGVjZDQyMGM2YWVlYjIwNTAwKSBhZGQgb3B0aW9uIHRvIGNoYW5nZSBtYWlsIGZyb20gdXNlciBkaXNwbGF5IG5hbWUu-->[commit](https://codeberg.org/forgejo/forgejo/commit/004cc6dc0ab7cc9c324ccb4ecd420c6aeeb20500) add option to change mail from user display name.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4607): <!--number 4607 --><!--line 2 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9kMDIyN2MyMzZhYTE5NWJkMDM5OTAyMTBmOTY4YjhlNTJlYjIwYjc5KSBpc3N1ZSBUZW1wbGF0ZXM6IGFkZCBvcHRpb24gdG8gaGF2ZSBkcm9wZG93biBwcmludGVkIGxpc3Qu-->[commit](https://codeberg.org/forgejo/forgejo/commit/d0227c236aa195bd03990210f968b8e52eb20b79) issue Templates: add option to have dropdown printed list.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4605): <!--number 4605 --><!--line 0 --><!--description dGhlIGRlZmF1bHQgc2V0dGluZyBhdHRhY2htZW50LkFMTE9XRURfVFlQRVMgd2FzIGFkanVzdGVkIHRvIGFsbG93IC53ZWJwIGF0dGFjaG1lbnRzIGluIGlzc3VlcyAtIGEgbW9yZSBlZmZpY2llbnQgZm9ybWF0IGZvciBpbWFnZXMgbGlrZSBzY3JlZW5zaG90cy4gQWxsIGF0dGFjaG1lbnRzIGFyZSB0cmVhdGVkIGFzIG5vcm1hbCBmaWxlcyBhbmQgYXJlIG5vdCByZS1lbmNvZGVkIGJ5IEZvcmdlam8uIElmIHlvdSBoYXZlIGN1c3RvbWl6ZWQgdGhpcyBzZXR0aW5nLCB5b3UgbWF5IGFsc28gd2FudCB0byBhZGQgLndlYnAgdG8gaXQgZm9yIHRoZSBiZW5lZml0IG9mIHlvdXIgdXNlcnMsIGFzIHdlbGwgYXMgdG8gcmVkdWNlIHNlcnZlciB0cmFmZmljIGFuZCBzdG9yYWdlIHVzYWdlLg==-->the default setting attachment.ALLOWED_TYPES was adjusted to allow .webp attachments in issues - a more efficient format for images like screenshots. All attachments are treated as normal files and are not re-encoded by Forgejo. If you have customized this setting, you may also want to add .webp to it for the benefit of your users, as well as to reduce server traffic and storage usage.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4542): <!--number 4542 --><!--line 0 --><!--description Q29udmVydCBtaWxlc3RvbmUgdG8gSFRNWA==-->Convert milestone to HTMX.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4516): <!--number 4516 --><!--line 0 --><!--description dXNlIHRoZSBmdWxsIHVzZXIgbmFtZSBpbiBlbWFpbHMgdG8gYWRkcmVzcyB0aGUgcmVjaXBpZW50LCB3aGVuIGF2YWlsYWJsZQ==-->Use the full user name in emails to address the recipient, when available.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4449): <!--number 4449 --><!--line 0 --><!--description RW5oYW5jaW5nIEdpdGVhIE9BdXRoMiBQcm92aWRlciB3aXRoIEdyYW51bGFyIFNjb3BlcyBmb3IgUmVzb3VyY2UgQWNjZXNz-->Enhancing OAuth2 Provider with Granular Scopes for Resource Access.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4429): <!--number 4429 --><!--line 0 --><!--description W2Rpc3BsYXkgVVJMcyBpbiAuc2gtc2Vzc2lvbiBmaWxlc10oaHR0cHM6Ly9naXRodWIuY29tL2J1aWxka2l0ZS90ZXJtaW5hbC10by1odG1sL3B1bGwvMTYzKQ==-->[Display URLs in .sh-session files](https://github.com/buildkite/terminal-to-html/pull/163).<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4367): <!--number 4367 --><!--line 0 --><!--description VGhlIGNhY2hpbmcgb2YgY29udHJpYnV0b3Igc3RhdHMgd2FzIGltcHJvdmVkICh0aGUgZGF0YSB1c2VkIGJ5IGAvPHVzZXI+LzxyZXBvPi9hY3Rpdml0eS9yZWNlbnQtY29tbWl0c2ApIHRvIHVzZSB0aGUgY29uZmlndXJlZCBjYWNoZSBUVEwgZnJvbSB0aGUgY29uZmlnIChgW2NhY2hlXS5JVEVNX1RUTGApIGluc3RlYWQgb2YgYSBoYXJkY29kZWQgVFRMIG9mIHRlbiBtaW51dGVzLiBUaGUgY29tcHV0YXRpb24gb2YgdGhpcyBvcGVyYXRpb24gaXMgY29tcHV0YXRpb25hbGx5IGhlYXZ5IGFuZCBtYWtlcyBhIGxvdCBvZiByZXF1ZXN0cyB0byB0aGUgZGF0YWJhc2UgYW5kIEdpdCBvbiByZXBvc2l0b3JpZXMgd2l0aCBhIGxvdCBvZiBjb21taXRzLiBJdCBzaG91bGQgYmUgY2FjaGVkIGZvciBsb25nZXIgdGhhbiB3aGF0IHdhcyBwcmV2aW91c2x5IGhhcmRjb2RlZCwgdGVuIG1pbnV0ZXMu-->The caching of contributor stats was improved (the data used by `/<user>/<repo>/activity/recent-commits`) to use the configured cache TTL from the config (`[cache].ITEM_TTL`) instead of a hardcoded TTL of ten minutes. The computation of this operation is computationally heavy and makes a lot of requests to the database and Git on repositories with a lot of commits. It should be cached for longer than what was previously hardcoded, ten minutes.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4266): <!--number 4266 --><!--line 0 --><!--description LSBhZGQgc3VwcG9ydCBmb3IgTEZTIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggaGF2ZSBiYXRjaCBBUEkgcmVzcG9uc2VzIGluIGFuIG9sZGVyL2RlcHJlY2F0ZWQgc2NoZW1h-->Add support for LFS server implementations which have batch API responses in an older/deprecated schema.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4218): <!--number 4218 --><!--line 0 --><!--description W0Zvcmdlam8gQWN0aW9ucyBhcnRpZmFjdHNdKGh0dHBzOi8vZm9yZ2Vqby5vcmcvZG9jcy9uZXh0L3VzZXIvYWN0aW9ucy8jYXJ0aWZhY3RzKSBzdXBwb3J0IFtyYW5nZSByZXF1ZXN0c10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnl0ZV9zZXJ2aW5nKSB0byByZXN1bWUgYSBkb3dubG9hZA==-->[Forgejo Actions artifacts](https://forgejo.org/docs/next/user/actions/#artifacts) support [range requests](https://en.wikipedia.org/wiki/Byte_serving) to resume a download.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4212): <!--number 4212 --><!--line 0 --><!--description QWRkZWQgdGhlIGZvdW5kYXRpb25zIG9mIGEgZmxleGlibGUsIGNvbmZpZ3VyYWJsZSBxdW90YSBzeXN0ZW0=-->Added the foundations of a flexible, configurable quota system.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/2869): <!--number 2869 --><!--line 0 --><!--description bG9nOiBqb3VybmFsZCBpbnRlZ3JhdGlvbg==-->Logs journald integration.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/1445): <!--number 1445 --><!--line 0 --><!--description YSByZWxlYXNlIGFzc2V0IGNhbiBiZSBhIFVSTCBpbnN0ZWFkIG9mIGEgZmlsZQ==-->A release asset can be a URL instead of a file.<!--description-->
- Bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5529) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5565)): <!--number 5565 --><!--line 0 --><!--description RG9uJ3QgYWxsb3cgb3duZXIgdGVhbSB3aXRoIGluY29ycmVjdCB1bml0IGFjY2VzcyAoaW5jbHVkZXMgZG9jdG9yIGZpeCk=-->Don't allow owner team with incorrect unit access (includes doctor fix).<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5470) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5547)): <!--number 5547 --><!--line 0 --><!--description Zml4OiBkb24ndCBjYW5jZWwgc2NoZWR1bGUgd29ya2Zsb3dzIG9uIHB1c2ggdG8gbWFpbiBicmFuY2g=-->Schedule workflows are canceled when pushing to the default branch.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5492) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5507)): <!--number 5507 --><!--line 0 --><!--description Zml4OiBjb3JyZWN0IERpc2NvcmQgd2ViaG9vayBKU09OIGZvciBpc3N1ZSBldmVudHM=-->Incorrect Discord webhook JSON for issue events.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5372) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5406)): <!--number 5406 --><!--line 1 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9mNzA5ZGUyNDAzOWFiN2U2MDVkM2UwOWUzYjYxMjQwODM2MzgxNjAzKSBGaXggd3JvbmcgbGFzdCBtb2RpZnkgdGltZS4=-->[commit](https://codeberg.org/forgejo/forgejo/commit/f709de24039ab7e605d3e09e3b61240836381603) wrong last modify time.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5372) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5406)): <!--number 5406 --><!--line 2 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8yNjc1YTI0NjQ5YWYyZmZmMzRmNWM3ZTQxNmQ2ZmY3ODU5MWQ4ZDljKSBSZXBvIEFjdGl2aXR5OiBjb3VudCBuZXcgaXNzdWVzIHRoYXQgd2VyZSBjbG9zZWQu-->[commit](https://codeberg.org/forgejo/forgejo/commit/2675a24649af2fff34f5c7e416d6ff78591d8d9c) Repo Activity: count new issues that were closed.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5372) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5406)): <!--number 5406 --><!--line 3 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC81MjYwNTQzMzJhY2IyMjFlMDYxZDM5MDBiYmEyZGM2ZTAxMmRhNTJkKSBGaXggaW5jb3JyZWN0IC90b2tlbnMgYXBpLg==-->[commit](https://codeberg.org/forgejo/forgejo/commit/526054332acb221e061d3900bba2dc6e012da52d) incorrect /tokens API.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5372) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5406)): <!--number 5406 --><!--line 4 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8wY2FmZWM0YzdhMmZhZjgxMDk1M2U5ZDUyMmZhZjVkYzAxOWUxNTIyKSBEbyBub3QgZXNjYXBlIHJlbGF0aXZlIHBhdGggaW4gUlBNIHByaW1hcnkgaW5kZXgu-->[commit](https://codeberg.org/forgejo/forgejo/commit/0cafec4c7a2faf810953e9d522faf5dc019e1522) Do not escape relative path in RPM primary index.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5325): <!--number 5325 --><!--line 0 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9lYjc2NWRhYmZkNDNlMzUzYmQyMjA4ZTgzNzViMTAyOTM1ZDBmMTAzKSBIYW5kbGUgaW52YWxpZCB0YXJnZXQgd2hlbiBjcmVhdGluZyByZWxlYXNlcyB1c2luZyBBUEku-->[commit](https://codeberg.org/forgejo/forgejo/commit/eb765dabfd43e353bd2208e8375b102935d0f103) Handle invalid target when creating releases using API.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5325): <!--number 5325 --><!--line 1 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC81YWYxNjhmYjkyZTVkZDNiMGM4MWQ5N2JhMjdhNmYxOTczOWJlZjE4KSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve2luZGV4fS9maWxlcyBlbmRwb2ludCBub3QgcG9wdWxhdGluZyBwcmV2aW91c19maWxlbmFtZS4=-->[commit](https://codeberg.org/forgejo/forgejo/commit/5af168fb92e5dd3b0c81d97ba27a6f19739bef18) /repos/{owner}/{repo}/pulls/{index}/files endpoint not populating previous_filename.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5269): <!--number 5269 --><!--line 0 --><!--description SW1wcm92ZSB0ZXh0YXJlYSBwYXN0ZSAocGFydCBvZiBnaXRlYSMzMTk0OCk=-->Improve textarea paste.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5195): <!--number 5195 --><!--line 0 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8xOTY5MDdlMzU5NDIwZjYzMDAzZjg4NGQxY2Y4MjdiNGE0ZDdhNGU1KSBIYW5kbGUgImNsb3NlIiBhY3Rpb25hYmxlIHJlZmVyZW5jZXMgZm9yIG1hbnVhbCBtZXJnZXMu-->[commit](https://codeberg.org/forgejo/forgejo/commit/196907e359420f63003f884d1cf827b4a4d7a4e5) Handle "close" actionable references for manual merges.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5195): <!--number 5195 --><!--line 1 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC80NmIxZjJlN2U0ZTc5NTMzMWYyOGY3NDY2NjA5NGM5NDE2NDk5ZTAzKSBUZWFtIGFkbWlucyBhcmUgYWxsb3dlZCB0byBzZWFyY2ggdGVhbSBtZW1iZXJzIHZpYSB0aGUgQVBJLg==-->[commit](https://codeberg.org/forgejo/forgejo/commit/46b1f2e7e4e795331f28f74666094c9416499e03) Team admins are allowed to search team members via the API.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5109): <!--number 5109 --><!--line 0 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8zYWRlNGQ5YjJiZmE2YWU4NGExZGVkOTMyOTA3YTUzMDYwNTY1NTc1KSBEb24ndCByZXR1cm4gNTAwIGlmIG1pcnJvciB1cmwgY29udGFpbnMgc3BlY2lhbCBjaGFycw==-->[commit](https://codeberg.org/forgejo/forgejo/commit/3ade4d9b2bfa6ae84a1ded932907a53060565575) Don't return 500 if mirror url contains special chars.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5109): <!--number 5109 --><!--line 1 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9kZGE1MzU2OWIxYjcwNTA3NDY5ZmMyOTY4ODFlZWM4OTYwNmFiOWMzKSBGaXggYWdpdCBhdXRvbWVyZ2U=-->[commit](https://codeberg.org/forgejo/forgejo/commit/dda53569b1b70507469fc296881eec89606ab9c3) Agit automerge is not working properly.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5075): <!--number 5075 --><!--line 0 --><!--description aW1wcm92ZSB0aGUgZGlzcGxheSBvZiBQUiAmIGlzc3VlIHNob3J0IGxpbmtz-->Improve the display of PR & issue short links.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4978): <!--number 4978 --><!--line 0 --><!--description TWlncmF0ZSBzY29wZWQgR2l0TGFiIGxhYmVscyBhcyBzY29wZWQgRm9yZ2VqbyBsYWJlbHM=-->Migrate scoped GitLab labels as scoped Forgejo labels.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4924): <!--number 4924 --><!--line 0 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC85ODEyYjdhZjkxYjY5Mzg2YzVkNGMwODk4MmFlY2U3YmQ4ZjlhMTc0KSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve2luZGV4fSBbcmVxdWVzdGVkX3Jldmlld2VycyBjb250YWlucyBudWxsIGZvciB0ZWFtc10oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2lzc3Vlcy80MTA4KS4=-->[commit](https://codeberg.org/forgejo/forgejo/commit/9812b7af91b69386c5d4c08982aece7bd8f9a174) /repos/{owner}/{repo}/pulls/{index} [requested_reviewers contains null for teams](https://codeberg.org/forgejo/forgejo/issues/4108).<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4809): <!--number 4809 --><!--line 0 --><!--description dmFsaWRhdGUgdGl0bGUgbGVuZ3RoIHdoZW4gdXBkYXRpbmcgYW4gaXNzdWU=-->Validate title length when updating an issue.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): <!--number 4801 --><!--line 0 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8wZGJjNjIzMDI4NmUxMTNhY2NiYzZkNWU4MjljZThkYWUxZDFmNWQ0KSBIaWRlIHRoZSAiRGV0YWlscyIgbGluayBvZiBjb21taXQgc3RhdHVzIHdoZW4gdGhlIHVzZXIgY2Fubm90IGFjY2VzcyBhY3Rpb25zLg==-->[commit](https://codeberg.org/forgejo/forgejo/commit/0dbc6230286e113accbc6d5e829ce8dae1d1f5d4) Hide the "Details" link of commit status when the user cannot access actions.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): <!--number 4801 --><!--line 1 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC82ZTYzYWZlMzFmNDNlYWY1ZmY3Yzg1OTVkZGVhZjg1MTVjMmRjMGMwKSBUaGUgQVBJIGVuZHBvaW50IHRvIGdldCB0aGUgYWN0aW9ucyByZWdpc3RyYXRpb24gdG9rZW4gaXMgR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMvcmVnaXN0cmF0aW9uLXRva2VuIGFuZCBub3QgR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydW5uZXJzL3JlZ2lzdHJhdGlvbi10b2tlbi4=-->[commit](https://codeberg.org/forgejo/forgejo/commit/6e63afe31f43eaf5ff7c8595ddeaf8515c2dc0c0) The API endpoint to get the actions registration token is GET /repos/{owner}/{repo}/actions/runners/registration-token and not GET /repos/{owner}/{repo}/runners/registration-token.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): <!--number 4801 --><!--line 2 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC82ZTYzYWZlMzFmNDNlYWY1ZmY3Yzg1OTVkZGVhZjg1MTVjMmRjMGMwKSBSdW5uZXIgcmVnaXN0cmF0aW9uIHRva2VuIHZpYSBBUEkgaXMgYnJva2VuIGZvciByZXBvIGxldmVsIHJ1bm5lcnMu-->[commit](https://codeberg.org/forgejo/forgejo/commit/6e63afe31f43eaf5ff7c8595ddeaf8515c2dc0c0) Runner registration token via API is broken for repo level runners.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): <!--number 4801 --><!--line 3 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9jNzg0YTU4NzQwNjZjYTFhMWZkNTE4NDA4ZDU3NjdiNGViNTdiZDY5KSBEZWxldGVkIHByb2plY3RzIGNhdXNlcyBiYWQgcG9wb3ZlciB0ZXh0IG9uIGlzc3Vlcy4=-->[commit](https://codeberg.org/forgejo/forgejo/commit/c784a5874066ca1a1fd518408d5767b4eb57bd69) Deleted projects causes bad popover text on issues.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): <!--number 4801 --><!--line 4 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC80MmJiNTFhZjliODI4MzA3MWUxNWFjNjQ3MGFkYTk4MjRkODdjZDQwKSBEaXN0aW5ndWlzaCBMRlMgb2JqZWN0IGVycm9ycyB0byBpZ25vcmUgbWlzc2luZyBvYmplY3RzIGR1cmluZyBtaWdyYXRpb24u-->[commit](https://codeberg.org/forgejo/forgejo/commit/42bb51af9b8283071e15ac6470ada9824d87cd40) Distinguish LFS object errors to ignore missing objects during migration.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): <!--number 4801 --><!--line 7 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC82MzI4ZjY0OGRlY2MyNzU0ZWYxMGVlNWNhNmNhOTc4NWExNTY2MTRjKSBXaGVuIHZpZXdpbmcgdGhlIHJldmlzaW9uIGhpc3Rvcnkgb2Ygd2lraSBwYWdlcywgdGhlIHBhZ2luYXRpb24gbGlua3MgYXJlIGJyb2tlbjogaW5zdGVhZCBvZiBvcmcvcmVwby93aWtpL1BhZ2U/YWN0aW9uPV9yZXZpc2lvbiZwYWdlPTIsIHRoZSBsaW5rIGlzIG9ubHkgb3JnL3JlcG8vd2lraS9QYWdlP3BhZ2U9MiwgdGh1cyBicmluZ2luZyB0aGUgdXNlciBiYWNrIHRvIHRoZSB3aWtpIHBhZ2Uu-->[commit](https://codeberg.org/forgejo/forgejo/commit/6328f648decc2754ef10ee5ca6ca9785a156614c) When viewing the revision history of wiki pages, the pagination links are broken: instead of org/repo/wiki/Page?action=_revision&page=2, the link is only org/repo/wiki/Page?page=2, thus bringing the user back to the wiki page.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): <!--number 4801 --><!--line 8 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8yMzEwNTU2MTU4ZDcwYmYxZGJmY2E5NmRjOTI4ZTFiZTNkM2Y0MWJlKSBBbHNvIHJlbmFtZSB0aGUgaGVhZCBicmFuY2ggb2Ygb3BlbiBwdWxsIHJlcXVlc3RzIHdoZW4gcmVuYW1pbmcgYSBicmFuY2gu-->[commit](https://codeberg.org/forgejo/forgejo/commit/2310556158d70bf1dbfca96dc928e1be3d3f41be) Also rename the head branch of open pull requests when renaming a branch.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4716): <!--number 4716 --><!--line 1 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9lZTExYTI2M2Y4YzlkZTMzZDQyZmMxMTc0NDNmNDA1NGEzMTFjODc1KTogYWRkIHJldHVybiB0eXBlIHRvIEdldFJhd0ZpbGVPckxGUyBhbmQgR2V0UmF3RmlsZS4=-->[commit](https://codeberg.org/forgejo/forgejo/commit/ee11a263f8c9de33d42fc117443f4054a311c875): add return type to GetRawFileOrLFS and GetRawFile.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4716): <!--number 4716 --><!--line 3 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9mNjE4NzNjN2U0MmI2MTM0MDVkMzY3NDIxYWQxOWRiODBmODMxMDUzKTogcHJvcGVybHkgZmlsdGVyIGlzc3VlIGxpc3QgZ2l2ZW4gbm8gYXNzaWduZWVzIGZpbHRlci4=-->[commit](https://codeberg.org/forgejo/forgejo/commit/f61873c7e42b613405d367421ad19db80f831053): properly filter issue list given no assignees filter.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4698): <!--number 4698 --><!--line 0 --><!--description Y3JvbiB0YXNrIHRvIGNsZWFudXAgZGFuZ2xpbmcgY29udGFpbmVyIGltYWdlcyB3aXRoIHZlcnNpb24gc2hhMjU2Oio=-->Cron task to cleanup dangling container images with version sha256:*.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4619): <!--number 4619 --><!--line 0 --><!--description ZmVhdChjbGkpOiBhbGxvdyB1cGRhdGVzIHRvIHJ1bm5lcnMnIHNlY3JldHM=-->Allow updates to runners' secrets.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4487): <!--number 4487 --><!--line 0 --><!--description RG8gbm90IGZpcmUgd2ViaG9vayBub3RpZmljYXRpb25zIGZvciB1cGRhdGVzIGFuZCBkZWxldGlvbnMgb2YgY29tbWVudHMgdGhhdCBhcmUgcGFydCBvZiBhbiBvbmdvaW5nIHJldmlldyAoYSByZXZpZXcgdGhhdCBpcyBzdGlsbCBpbiBkcmFmdCkuIEFsc28sIGNvbnRlbnQgaGlzdG9yeSB3aWxsIG5vdCBiZSBzYXZlZCBmb3Igc3VjaCBjb21tZW50cywgdG8gYXZvaWQgZXhwb3NpbmcgZml4aW5nIGVtYmFycmFzc2luZyB0eXBvcyB5b3UndmUgaGF2ZSBtYWRlIHdoaWxlIHRoZSByZXZpZXcgd2FzIHN0aWxsIHBlbmRpbmcu-->Do not fire webhook notifications for updates and deletions of comments that are part of an ongoing review (a review that is still in draft). Also, content history will not be saved for such comments, to avoid exposing fixing embarrassing typos you've have made while the review was still pending.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4427): <!--number 4427 --><!--line 0 --><!--description Rml4ZWQgc29jaWFsIG1lZGlhIHByZXZpZXdzIGZvciBsaW5rcyB0byB3aWtpIHBhZ2VzLg==-->Fixed social media previews for links to wiki pages.<!--description-->
- Localization
- Updates of translations from [Codeberg Translate](https://translate.codeberg.org/projects/forgejo/forgejo/).
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4980): <!--number 4980 --><!--line 0 --><!--description aTE4bjogSW1wcm92ZSBjbGFyaXR5IG9mIGNvbmZpcm1hdGlvbiBlbWFpbCBtZXNzYWdlcw==-->Improve the clarity of confirmation in email messages.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5523) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5534)): <!--number 5534 --><!--line 0 --><!--description aTE4bjogRmluZSB0dW5lIGxhbmd1YWdlIGZvciB1bml0cw==-->Fine tune language for units.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5537) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5538)): <!--number 5538 --><!--line 0 --><!--description aTE4bjogSW1wcm92ZSB0cmFuc2xhdGlvbiBzdHJpbmdzIGZvciB3ZWJob29rIGV2ZW50cw==-->Improve translation strings for webhook events.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4829): <!--number 4829 --><!--line 0 --><!--description QWxsb3cgZGlmZmVyZW50IHRyYW5zbGF0aW9ucyBvZiBjcmVhdGlvbiBsaW5rcyBhbmQgdGl0bGVz-->Allow different translations of creation links and titles.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4599): <!--number 4599 --><!--line 0 --><!--description RW5nbGlzaCBpbXByb3ZlbWVudHM=-->English strings improvements for internationalization.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/4596): <!--number 4596 --><!--line 0 --><!--description RW5jb3VyYWdlIHBhcnRpY2lwYXRpb24gaW4gdGhlIGxvY2FsaXphdGlvbiBvZiBGb3JnZWpvIGluIGxhbmd1YWdlIHNldHRpbmdz-->Encourage participation in the localization of Forgejo in language settings.<!--description-->
<!--end release-notes-assistant-->

View file

@ -0,0 +1,33 @@
<!--start release-notes-assistant-->
## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Security bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5719) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5724)): <!--number 5724 --><!--line 0 --><!--description Rm9yZ2VqbyBnZW5lcmF0ZXMgYSB0b2tlbiB3aGljaCBpcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB3ZWIgZW5kcG9pbnRzIHRoYXQgYXJlIG9ubHkgbWVhbnQgdG8gYmUgdXNlZCBpbnRlcm5hbGx5LCBmb3IgaW5zdGFuY2Ugd2hlbiB0aGUgU1NIIGRhZW1vbiBpcyB1c2VkIHRvIHB1c2ggYSBjb21taXQgd2l0aCBHaXQuIFRoZSB2ZXJpZmljYXRpb24gb2YgdGhpcyB0b2tlbiB3YXMgbm90IGRvbmUgaW4gY29uc3RhbnQgdGltZSBhbmQgd2FzIHN1c2NlcHRpYmxlIHRvIFt0aW1pbmcgYXR0YWNrc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGltaW5nX2F0dGFjaykuIEEgcHJlLWNvbmRpdGlvbiBmb3Igc3VjaCBhbiBhdHRhY2sgaXMgdGhlIHByZWNpc2UgbWVhc3VyZW1lbnRzIG9mIHRoZSB0aW1lIGZvciBlYWNoIG9wZXJhdGlvbi4gU2luY2UgaXQgcmVxdWlyZXMgb2JzZXJ2aW5nIHRoZSB0aW1pbmcgb2YgbmV0d29yayBvcGVyYXRpb25zLCB0aGUgaXNzdWUgaXMgbWl0aWdhdGVkIHdoZW4gYSBGb3JnZWpvIGluc3RhbmNlIGlzIGFjY2Vzc2VkIG92ZXIgdGhlIGludGVybmV0IGJlY2F1c2UgdGhlIElTUCBpbnRyb2R1Y2UgdW5wcmVkaWN0YWJsZSByYW5kb20gZGVsYXlzLg==-->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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5718) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5721)): <!--number 5721 --><!--line 0 --><!--description QmVjYXVzZSBvZiBhIG1pc3NpbmcgcGVybWlzc2lvbiBjaGVjaywgdGhlIGJyYW5jaCB1c2VkIHRvIHByb3Bvc2UgYSBwdWxsIHJlcXVlc3QgdG8gYSByZXBvc2l0b3J5IGNhbiBhbHdheXMgYmUgZGVsZXRlZCBieSB0aGUgdXNlciBwZXJmb3JtaW5nIHRoZSBtZXJnZS4gSXQgd2FzIGZpeGVkIHNvIHRoYXQgc3VjaCBhIGRlbGV0aW9uIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGUgdXNlciBwZXJmb3JtaW5nIHRoZSBtZXJnZSBoYXMgd3JpdGUgcGVybWlzc2lvbiB0byB0aGUgcmVwb3NpdG9yeSBmcm9tIHdoaWNoIHRoZSBwdWxsIHJlcXVlc3Qgd2FzIG1hZGUu-->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.<!--description-->
- Bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5439) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5708)): <!--number 5708 --><!--line 0 --><!--description Rml4IGJvb2xlYW4gaW5wdXRzIGluIHdvcmtmbG93X2Rpc3BhdGNo-->Fix boolean inputs in workflow_dispatch<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5634) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5636)): <!--number 5636 --><!--line 0 --><!--description cGFja2FnZSBhcmNoICBkYXRhYmFzZSBub3QgdXBkYXRpbmcgd2hlbiB1cGxvYWRpbmcgImFueSIgYXJjaGl0ZWN0dXJl-->package arch database not updating when uploading "any" architecture<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5627) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5631)): <!--number 5631 --><!--line 0 --><!--description Y29ycmVjdCBTUUwgcXVlcnkgZm9yIGFjdGl2ZSBpc3N1ZXM=-->correct SQL query for active issues<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5626) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5629)): <!--number 5629 --><!--line 0 --><!--description c3BlY2lmeSBkZWZhdWx0IHZhbHVlIGZvciBgRVhQTE9SRV9ERUZBVUxUX1NPUlRgLg==-->specify default value for `EXPLORE_DEFAULT_SORT`.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5613) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5624)): <!--number 5624 --><!--line 0 --><!--description Zml4OiBBZGQgYHJlY2VudHVwZGF0ZWRgIGFzIHJlY29nbml6ZWQgc29ydCBvcHRpb24=-->fix: Add `recentupdated` as recognized sort option<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5616): <!--number 5616 --><!--line 0 --><!--description VXBkYXRlIGRlcGVuZGVuY3kgbWVybWFpZCB0byB2MTEuMy4wICh2OS4wL2Zvcmdlam8p-->Update dependency mermaid to v11.3.0 (v9.0/forgejo)<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5587) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5588)): <!--number 5588 --><!--line 0 --><!--description RG9ja2VyZmlsZTogdXNlIGFscGluZTozLjIwIGluc3RlYWQgb2YgZ29sYW5nOjEuMjMtYWxwaW5lMy4yMA==-->Dockerfile: use alpine:3.20 instead of golang:1.23-alpine3.20<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5585) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5586)): <!--number 5586 --><!--line 0 --><!--description RG9ja2VyZmlsZTogdW5uZWNlc3NhcnkgY29udGFpbmVyIGltYWdlIGxheWVyIGR1cGxpY2F0aW9u-->Dockerfile: unnecessary container image layer duplication<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5647): <!--number 5647 --><!--line 0 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8xOTEzMzk5ZDgxNzY5NDRmMTcwZDRmMWMwMzJkYzM3MDAzYWFhZmMwKSBBbHdheXMgdXBkYXRlIGV4cGlyYXRpb24gdGltZSB3aGVuIGNyZWF0aW5nIGFuIGFydGlmYWN0-->[commit](https://codeberg.org/forgejo/forgejo/commit/1913399d8176944f170d4f1c032dc37003aaafc0) Always update expiration time when creating an artifact<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5647): <!--number 5647 --><!--line 1 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC80ZmUzMTFlN2MwMjkyZTNhYzc5ZjhiYzA2M2YxYmNhY2VmNDQ5NGYwKSBVcGRhdGUgc2NoZWR1bGVkIHRhc2tzIGV2ZW4gaWYgY2hhbmdlcyBhcmUgcHVzaGVkIGJ5ICJBY3Rpb25zVXNlciI=-->[commit](https://codeberg.org/forgejo/forgejo/commit/4fe311e7c0292e3ac79f8bc063f1bcacef4494f0) Update scheduled tasks even if changes are pushed by "ActionsUser"<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5715): <!--number 5715 --><!--line 0 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC83Njg0MDJjODg0MWRiNWU4YWNjOTc5MTkxNDliYTMyOWQ1MTI0ZTE3KSBGaXggZGlzYWJsZSAyZmEgYnVn-->[commit](https://codeberg.org/forgejo/forgejo/commit/768402c8841db5e8acc97919149ba329d5124e17) Fix disable 2fa bug<!--description-->
- Localization
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5583) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5680)): <!--number 5680 --><!--line 0 --><!--description aTE4bjogdXBkYXRlIG9mIHRyYW5zbGF0aW9ucyBmcm9tIENvZGViZXJnIFRyYW5zbGF0ZQ==-->i18n: update of translations from Codeberg Translate<!--description-->
- Included for completeness but not worth a release note
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5702) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5710)): <!--number 5710 --><!--line 0 --><!--description Zml4OiB1c2UgYnVmZmVyZWQgaXRlcmF0ZSBmb3IgZGViaWFuIHNlYXJjaHBhY2thZ2Vz-->fix: use buffered iterate for debian searchpackages<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5688) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5691)): <!--number 5691 --><!--line 0 --><!--description Zml4OiBtYWtlIGJyYW5jaCBwcm90ZWN0aW9uIHdvcmsgZm9yIG5ldyBicmFuY2hlcw==-->fix: make branch protection work for new branches<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5651) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5656)): <!--number 5656 --><!--line 0 --><!--description bGluayB0byBzZWN1cml0eSBwb2xpY3kgaW4gc2VjdXJpdHkudHh0-->link to security policy in security.txt<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5653) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5655)): <!--number 5655 --><!--line 0 --><!--description Zml4OiBkb24ndCBzaG93IHRydW5jYXRlZCBjb21tZW50cyBpbiBSU1MvQXRvbSBmZWVkcw==-->fix: don't show truncated comments in RSS/Atom feeds<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5652) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5654)): <!--number 5654 --><!--line 0 --><!--description Zml4OiB0eXBvIG9uIHJlbGVhc2VzIGZvciBzb3VyY2UgY29kZSBkb3dubG9hZHM=-->fix: typo on releases for source code downloads<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5640) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5645)): <!--number 5645 --><!--line 0 --><!--description UmV2ZXJ0ICJhZGQgZ2FwIGJldHdlZW4gYnJhbmNoIGRyb3Bkb3duIGFuZCBQUiBidXR0b24i-->Revert "add gap between branch dropdown and PR button"<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5615) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5618)): <!--number 5618 --><!--line 0 --><!--description Zml4OiBEb24ndCBkb3VibGUgZXNjYXBlIGRlbGV0ZSBicmFuY2ggdGV4dA==-->fix: Don't double escape delete branch text<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5595) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5596)): <!--number 5596 --><!--line 0 --><!--description Zml4OiBBZGQgc2VydmVyIGxvZ2dpbmcgZm9yIE9BdXRoIHNlcnZlciBlcnJvcnM=-->fix: Add server logging for OAuth server errors<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5592) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5594)): <!--number 5594 --><!--line 0 --><!--description Zm9yZ2Vqby1jbGkgaXMgbm93IGEgc3ltbGluayBhbmQgY2Fubm90IGJlIHVzZWQgZm9yIHNhbml0eSBjaGVja3M=-->forgejo-cli is now a symlink and cannot be used for sanity checks<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5491) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5575)): <!--number 5575 --><!--line 0 --><!--description Zml4OiBjb3JyZWN0IGRvY3VtZW50YXRpb24gZm9yIG5vbiAyMDAgcmVzcG9uc2VzIGluIHN3YWdnZXI=-->fix: correct documentation for non 200 responses in swagger<!--description-->
<!--end release-notes-assistant-->

View file

@ -0,0 +1,26 @@
<!--start release-notes-assistant-->
## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Security bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): <!--number 5975 --><!--line 0 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8xY2UzM2FhMzhkMWQyNThkMTQ1MjNmZjJjN2MyZGJmMzM5ZjIyYjc0KSBpdCB3YXMgcG9zc2libGUgdG8gdXNlIGEgdG9rZW4gc2VudCB2aWEgZW1haWwgZm9yIHNlY29uZGFyeSBlbWFpbCB2YWxpZGF0aW9uIHRvIHJlc2V0IHRoZSBwYXNzd29yZCBpbnN0ZWFkLiAgSW4gb3RoZXIgd29yZHMsIGEgdG9rZW4gc2VudCBmb3IgIGEgZ2l2ZW4gYWN0aW9uIChyZWdpc3RyYXRpb24sIHBhc3N3b3JkIHJlc2V0IG9yIHNlY29uZGFyeSBlbWFpbCB2YWxpZGF0aW9uKSBjb3VsZCBiZSB1c2VkIHRvIHBlcmZvcm0gYSBkaWZmZXJlbnQgYWN0aW9uLiBJdCBpcyBubyBsb25nZXIgcG9zc2libGUgdG8gdXNlIGEgdG9rZW4gZm9yIGFuIGFjdGlvbiB0aGF0IGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvcmlnaW5hbCBwdXJwb3NlLg==-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): <!--number 5975 --><!--line 1 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8wNjFhYmU2MDA0NTIxMmFjZjhjM2Y1YzQ5YjVjYzc1OGI0Y2JjZGU5KSBhIGZvcmsgb2YgYSBwdWJsaWMgcmVwb3NpdG9yeSB3b3VsZCBzaG93IGluIHRoZSBsaXN0IG9mIGZvcmtzLCBldmVuIGlmIGl0cyBvd25lciB3YXMgbm90IGEgcHVibGljIHVzZXIgb3Igb3JnYW5pemF0aW9uLiBTdWNoIGEgZm9yayBpcyBub3cgaGlkZGVuIGZyb20gdGhlIGxpc3Qgb2YgZm9ya3Mgb2YgdGhlIHB1YmxpYyByZXBvc2l0b3J5Lg==-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): <!--number 5975 --><!--line 2 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC8zZTNlZjc2ODA4MTAwY2IxYzg1MzM3ODczM2QwZjZhOTEwMzI0YWM2KSB0aGUgbWVtYmVycyBvZiBhbiBvcmdhbml6YXRpb24gdGVhbSB3aXRoIHJlYWQgYWNjZXNzIHRvIGEgcmVwb3NpdG9yeSAoZS5nLiB0byByZWFkIGlzc3VlcykgYnV0IG5vIHJlYWQgYWNjZXNzIHRvIHRoZSBjb2RlIGNvdWxkIHJlYWQgdGhlIFJTUyBvciBhdG9tIGZlZWRzIHdoaWNoIGluY2x1ZGUgdGhlIGNvbW1pdCBhY3Rpdml0eS4gUmVhZGluZyB0aGUgUlNTIG9yIGF0b20gZmVlZHMgaXMgbm93IGRlbmllZCB1bmxlc3MgdGhlIHRlYW0gaGFzIHJlYWQgcGVybWlzc2lvbnMgb24gdGhlIGNvZGUu-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): <!--number 5975 --><!--line 3 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC85NTA4YWE3NzEzNjMyZWQ0MDEyNGE5MzNkOTFkNTc2NmNmMjM2OWMyKSB0aGUgdG9rZW5zIHVzZWQgd2hlbiBbcmVwbHlpbmcgYnkgZW1haWwgdG8gaXNzdWVzIG9yIHB1bGwgcmVxdWVzdHNdKGh0dHBzOi8vZm9yZ2Vqby5vcmcvZG9jcy92OS4wL3VzZXIvaW5jb21pbmcvKSB3ZXJlIHdlYWtlciB0aGFuIHRoZSBbcmZjMjEwNCByZWNvbW1lbmRhdGlvbnNdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjEwNCNzZWN0aW9uLTUpLiBUaGUgdG9rZW5zIGFyZSBub3cgdHJ1bmNhdGVkIHRvIDEyOCBiaXRzIGluc3RlYWQgb2YgODAgYml0cy4gSXQgaXMgbm8gbG9uZ2VyIHBvc3NpYmxlIHRvIHJlcGx5IHRvIGVtYWlscyBzZW50IGJlZm9yZSB0aGUgdXBncmFkZSBiZWNhdXNlIHRoZSB3ZWFrZXIgdG9rZW5zIGFyZSBpbnZhbGlkLg==-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): <!--number 5975 --><!--line 4 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC83ODZkZmM3ZmI4MWVlNzZkNDI5MmNhNWZjYjMzZTZlYTdiZGNjYzI5KSBhIHJlZ2lzdGVyZWQgdXNlciBjb3VsZCBtb2RpZnkgdGhlIHVwZGF0ZSBmcmVxdWVuY3kgb2YgYW55IHB1c2ggbWlycm9yIChlLmcuIGV2ZXJ5IDRoIGluc3RlYWQgb2YgZXZlcnkgOGgpLiBUaGV5IGFyZSBub3cgb25seSBhYmxlIHRvIGRvIHRoYXQgaWYgdGhleSBoYXZlIGFkbWluaXN0cmF0aXZlIHBlcm1pc3Npb25zIG9uIHRoZSByZXBvc2l0b3J5Lg==-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): <!--number 5975 --><!--line 5 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9lNmJiZWNiMDJkNDc3MzBkM2NjNjMwZDQxOWZlMjdlZjJmYjVjYjM5KSBpdCB3YXMgcG9zc2libGUgdG8gdXNlIGJhc2ljIGF1dGhvcml6YXRpb24gKGkuZS4gdXNlcjpwYXNzd29yZCkgZm9yIHJlcXVlc3RzIHRvIHRoZSBBUEkgZXZlbiB3aGVuIHNlY3VyaXR5IGtleXMgd2VyZSBlbnJvbGxlZCBmb3IgYSB1c2VyLiBJdCBpcyBubyBsb25nZXIgcG9zc2libGUsIGFuIGFwcGxpY2F0aW9uIHRva2VuIG11c3QgYmUgdXNlZCBpbnN0ZWFkLg==-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): <!--number 5975 --><!--line 6 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC83MDY3Y2M3ZGE0ZjE0NGNjOGEyZmQyYWU2ZTUzMDdlMDQ2NWFjZTdmKSBzb21lIG1hcmt1cCBzYW5pdGF0aW9uIHJ1bGVzIHdlcmUgbm90IGFzIHN0cm9uZyBhcyB0aGV5IGNvdWxkIGJlIChlLmcuIGFsbG93aW5nIGBlbW9qaSBzb21ldGhpbmdlbHNlYCBhcyB3ZWxsIGFzIGBlbW9qaWApLiBUaGUgcnVsZXMgYXJlIG5vdyBzdHJpY3RlciBhbmQgZG8gbm90IGFsbG93IGZvciBzdWNoIGNhc2VzLg==-->[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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): <!--number 5975 --><!--line 7 --><!--description W2NvbW1pdF0oaHR0cHM6Ly9jb2RlYmVyZy5vcmcvZm9yZ2Vqby9mb3JnZWpvL2NvbW1pdC9iNzAxOTY2NTNmOWQ3ZDNiOWQ0ZTcyZDExNGU1Y2M2ZjQ3Mjk4OGM0KSB3aGVuIEZvcmdlam8gaXMgY29uZmlndXJlZCB0byBlbmFibGUgaW5zdGFuY2Ugd2lkZSBzZWFyY2ggKGUuZy4gd2l0aCBbYmxldmVdKGh0dHBzOi8vYmxldmVzZWFyY2guY29tLykpLCByZXN1bHRzIGZvdW5kIGluIHRoZSByZXBvc2l0b3JpZXMgb2YgcHJpdmF0ZSBvciBsaW1pdGVkIHVzZXJzIHdlcmUgZGlzcGxheWVkIHRvIGFub255bW91cyB2aXNpdG9ycy4gVGhlIHJlc3VsdHMgZm91bmQgaW4gcHJpdmF0ZSBvciBsaW1pdGVkIG9yZ2FuaXphdGlvbnMgd2VyZSBub3QgZGlzcGxheWVkLiBUaGUgc2VhcmNoIHJlc3VsdHMgZm91bmQgaW4gdGhlIHJlcG9zaXRvcmllcyBvZiBwcml2YXRlIG9yIGxpbWl0ZWQgdXNlciBhcmUgbm8gbG9uZ2VyIGRpc3BsYXllZCB0byBhbm9ueW1vdXMgdmlzaXRvcnMu-->[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.<!--description-->
- Bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5941) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5945)): <!--number 5945 --><!--line 0 --><!--description Zml4OiBoYW5kbGUgcmVuYW1lZCBkZXBlbmRlbmN5IGZvciBjYXJnbyByZWdpc3RyeQ==-->fix: handle renamed dependency for cargo registry.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5795) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5800)): <!--number 5800 --><!--line 0 --><!--description Zml4OiBzdXBwb3J0IGB3d3cuZ2l0aHViLmNvbWAgZm9yIG1pZ3JhdGlvbnM=-->support `www.github.com` for migrations.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5887): <!--number 5887 --><!--line 0 --><!--description Zml4OiBNb3ZlIGZvcmdvdF9wYXNzd29yZC1saW5rIHRvIGZpeCBsb2dpbiB0YWIgb3JkZXI=-->move forgot_password-link to fix login tab order.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5850) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5879)): <!--number 5879 --><!--line 0 --><!--description W1BPUlRdIEZpeCBjb2RlIG93bmVycyB3aWxsIG5vdCBiZSBtZW50aW9uZWQgd2hlbiBhIHB1bGwgcmVxdWVzdCBjb21lcyBmcm9tIGEgZm9ya2VkIHJlcG9zaXRvcnkgKGdpdGVhIzMwNDc2KQ==-->code owners will not be mentioned when a pull request comes from a forked repository.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5831) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5834)): <!--number 5834 --><!--line 0 --><!--description Zml4OiBsYWJlbHMgYXJlIG1pc3NpbmcgaW4gdGhlIHB1bGwgcmVxdWVzdCBwYXlsb2FkIHJlbW92aW5nIGEgbGFiZWw=-->labels are missing in the pull request payload removing a label.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5778) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5810)): <!--number 5810 --><!--line 0 --><!--description SW4gYSBGb3JnZWpvIEFjdGlvbnMgd29ya2Zsb3csIHRoZSBgdW5sYWJlbGVkYCBldmVudCB0eXBlIGZvciBwdWxsIHJlcXVlc3RzIHdhcyBpbmNvcnJlY3RseSBtYXBwZWQgdG8gdGhlIGxhYmVsZWQgZXZlbnQgdHlwZS4=-->in a Forgejo Actions workflow, the `unlabeled` event type for pull requests was incorrectly mapped to the labeled event type.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5778) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5810)): <!--number 5810 --><!--line 1 --><!--description V2hlbiBhIEZvcmdlam8gQWN0aW9ucyBpc3N1ZSBvciBwdWxsIHJlcXVlc3Qgd29ya2Zsb3cgaXMgdHJpZ2dlcmVkIGJ5IGFuIGBsYWJlbGVkYCBvciBgdW5sYWJlbGVkYCBldmVudCB0eXBlLCBpdCBtaXNzZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhYmVsIGFkZGVkIG9yIHJlbW92ZWQuIEl0IGlzIG5vdyBhdmFpbGFibGUgaW4gdGhlIGBsYWJlbGAgZGF0YSBtZW1iZXIgb2YgdGhlIGV2ZW50IHBheWxvYWQu-->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.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5778) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5810)): <!--number 5810 --><!--line 2 --><!--description VGhlIHB1bGwgcmVxdWVzdCB3b3JrZmxvdyBtdXN0IGFsd2F5cyB1cGRhdGUgdGhlIGhlYWQgU0hBIGNvbW1pdCBzdGF0dXMuIE5vdCBqdXN0IHdoZW4gdGhlIFBSIGlzIHN5bmNocm9uaXplZCwgb3BlbmVkIG9yIGNsb3NlZC4gT3RoZXJ3aXNlIGl0IG1ha2VzIGl0IGltcG9zc2libGUgdG8gZGVmaW5lIGEgam9iIHRvIGJlIGEgcmVxdWlyZWQgY2hlY2sgKGZvciBpbnN0YW5jZSBhIGpvYiB0aGF0IGlzIHRyaWdnZXJlZCB3aGVuIGxhYmVscyBhcmUgbW9kaWZpZWQgYW5kIHZlcmlmaWVzIHRoYXQgYSBnaXZlbiBjb21iaW5hdGlvbiBpcyBwcmVzZW50KS4=-->the pull request workflow must always update the head SHA commit status. Not just when the PR is synchronized, opened or closed. Otherwise, a job that is run more often than on commits (e.g. checking for specific labels or approvals) cannot be defined as a required check.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5746) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5759)): <!--number 5759 --><!--line 0 --><!--description Zml4IGdpdC1ncmVwIGZvciBjb2RlIHNlYXJjaCB3aGVuIGdpdCB2ZXJzaW9uIGlzIGJlbG93IDIuMzg=-->fix git-grep for code search when git version is below 2.38.<!--description-->
- Localization
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5681) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5748)): <!--number 5748 --><!--line 0 --><!--description aTE4bjogdXBkYXRlIG9mIHRyYW5zbGF0aW9ucyBmcm9tIENvZGViZXJnIFRyYW5zbGF0ZQ==-->i18n: update of translations from Codeberg Translate.<!--description-->
<!--end release-notes-assistant-->

View file

@ -0,0 +1,39 @@
<!--start release-notes-assistant-->
## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Security bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6248) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6253)): <!--number 6253 --><!--line 0 --><!--description Zml4OiBlbnN1cmUgY29ycmVjdCBzc2ggcHVibGljIGtleSBpcyB1c2VkIGZvciBhdXRoZW50aWNhdGlvbg==-->When Forgejo is configured to run the internal ssh server with `[server].START_SSH_SERVER=true`, it was possible for a registered user to impersonate another user. The rootless container image uses the internal ssh server by default and was vulnerable. A Forgejo instance running from a binary or from a root container image does not use the internal ssh server by default and was not vulnerable. The incorrect use of the crypto package is the root cause of the vulnerability and was fixed for the internal ssh server.<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6249) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6251)): <!--number 6251 --><!--line 0 --><!--description Zml4OiBSZXZlcnQgImFsbG93IHN5bmNocm9uaXppbmcgdXNlciBzdGF0dXMgZnJvbSBPQXV0aDIgbG9naW4gcHJvdmlkZXJzICgjMzE1NzIpIg==-->Revert "allow synchronizing user status from OAuth2 login providers"<!--description-->
- User Interface bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6104): <!--number 6104 --><!--line 0 --><!--description Rml4IHdpa2kgc2VhcmNoIG92ZXJmbG93aW5nIG9uIHdpZGUgc2NyZWVucyAoIzYwNDcp-->Fix wiki search overflowing on wide screens (#6047)<!--description-->
- Bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6097) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6168)): <!--number 6168 --><!--line 0 --><!--description RG8gbm90IHJld3JpdGUgc3NoIGtleXMgZmlsZXMgd2hlbiBkZWxldGluZyBhIHVzZXIgd2l0aG91dCBvbmU=-->Do not rewrite ssh keys files when deleting a user without one<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6124) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6129)): <!--number 6129 --><!--line 0 --><!--description Zml4OiBkb2N0b3IgZmFpbHMgd2l0aCBwcTogc3ludGF4IGVycm9yIGF0IG9yIG5lYXIgIi4iIHdoaWxzdCBjb3VudGluZyBBdXRob3JpemF0aW9uIHRva2VuIHdpdGhvdXQgZXhpc3RpbmcgVXNlcg==-->fix: doctor fails with pq: syntax error at or near "." whilst counting Authorization token without existing User<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6054) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6057)): <!--number 6057 --><!--line 0 --><!--description Zml4OiBEbyBub3QgZGVsZXRlIGdsb2JhbCBPYXV0aDIgYXBwbGljYXRpb25z-->fix: Do not delete global Oauth2 applications<!--description-->
- Other changes without a feature or bug label
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6064): <!--number 6064 --><!--line 0 --><!--description W2dpdGVhXSB3ZWVrIDIwMjQtNDgtdjkuMCBjaGVycnkgcGljayAoZ2l0ZWEvbWFpbiAtPiB2OS4wL2Zvcmdlam8p-->[gitea] week 2024-48-v9.0 cherry pick (gitea/main -> v9.0/forgejo)<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5998): <!--number 5998 --><!--line 0 --><!--description W2dpdGVhXSB3ZWVrIDIwMjQtNDctdjkuMCBjaGVycnkgcGljayAoZ2l0ZWEvbWFpbiAtPiB2OS4wL2Zvcmdlam8p-->[commit](https://codeberg.org/forgejo/forgejo/commit/53c546951115d9e269a2778f90e43b0cb413eab6) Strict matching of allowed content for sanitizer for asciicast and csv rendering<!--description-->
- Included for completeness but not worth a release note
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6247): <!--number 6247 --><!--line 0 --><!--description VXBkYXRlIG1vZHVsZSBnb2xhbmcub3JnL3gvY3J5cHRvIHRvIHYwLjMxLjAgKHY5LjAvZm9yZ2Vqbyk=-->Update module golang.org/x/crypto to v0.31.0 (v9.0/forgejo)<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6223) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6231)): <!--number 6231 --><!--line 0 --><!--description Y2hvcmUoY2kpOiBzZXQgdGhlIG1pbGVzdG9uZSB3aGVuIGEgcHVsbCByZXF1ZXN0IGlzIGNsb3NlZCAodGFrZSA0KQ==-->chore(ci): set the milestone when a pull request is closed (take 4)<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6219) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6225)): <!--number 6225 --><!--line 0 --><!--description Y2hvcmUoY2kpOiBzZXQgdGhlIG1pbGVzdG9uZSB3aGVuIGEgcHVsbCByZXF1ZXN0IGlzIG9wZW4gKHRha2UgMyk=-->chore(ci): set the milestone when a pull request is open (take 3)<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6211) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6217)): <!--number 6217 --><!--line 0 --><!--description Y2hvcmUoY2kpOiBzZXQgdGhlIG1pbGVzdG9uZSB3aGVuIGEgcHVsbCByZXF1ZXN0IGlzIG9wZW4=-->chore(ci): set the milestone when a pull request is open<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6176): <!--number 6176 --><!--line 0 --><!--description VXBkYXRlIGRlcGVuZGVuY3kgQGdpdGh1Yi9yZWxhdGl2ZS10aW1lLWVsZW1lbnQgdG8gdjQuNC40ICh2OS4wL2Zvcmdlam8p-->Update dependency @github/relative-time-element to v4.4.4 (v9.0/forgejo)<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6152) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6155)): <!--number 6155 --><!--line 0 --><!--description Zml4OiByZW1vdmUgc29mdGJyZWFrIGZyb20gZ2l0aHViIGxlZ2FjeSBjYWxsb3V0-->fix: remove softbreak from github legacy callout<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6144) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6149)): <!--number 6149 --><!--line 0 --><!--description Zml4OiBjb3JyZWN0IHBlcm1pc3Npb24gbG9hZGluZyBmb3IgbGltaXRlZCBvcmdhbmlzYXRpb24=-->fix: correct permission loading for limited organisation<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6128) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6131)): <!--number 6131 --><!--line 0 --><!--description Zml4OiBjbGVhbiB1cCBsb2cgZmlsZXMgdGhhdCBubyBsb25nZXIgZXhpc3Q=-->fix: clean up log files that no longer exist<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6114) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6127)): <!--number 6127 --><!--line 0 --><!--description Zml4OiByZXR1cm4gY29ycmVjdCB0eXBlIGluIGBHZXRTdWJNb2R1bGVg-->fix: return correct type in `GetSubModule`<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6050) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6092)): <!--number 6092 --><!--line 0 --><!--description SW1wcm92ZSBTd2FnZ2VyIGRvY3VtZW50YXRpb24gZm9yIHVzZXIgZW5kcG9pbnRz-->Improve Swagger documentation for user endpoints<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6084) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6085)): <!--number 6085 --><!--line 0 --><!--description Zml4OiBub3JtYWxpemUgZ3Vlc3NlZCBsYW5ndWFnZXMgZnJvbSBlbnJ5-->fix: normalize guessed languages from enry<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6052) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6070)): <!--number 6070 --><!--line 0 --><!--description U2hvdyBwYWdlIHRpdGxlcyBpbiB3aWtpIHNlYXJjaCByZXN1bHRzICgjNjA0OCk=-->Show page titles in wiki search results (#6048)<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6060): <!--number 6060 --><!--line 0 --><!--description aTE4bjogYmFja3BvcnQgb2YgdHJhbnNsYXRpb24gdXBkYXRlcyA1NzU0LCA1ODQ1LCA1OTYw-->i18n: backport of translation updates 5754, 5845, 5960<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6034) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6035)): <!--number 6035 --><!--line 0 --><!--description Y2hvcmUoY2kpOiByZW1vdmUgdW51c2VkIGV4cGVyaW1lbnRhbCBETlMgdXBkYXRlcw==-->chore(ci): remove unused experimental DNS updates<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/6013) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6016)): <!--number 6016 --><!--line 0 --><!--description Zml4KHRlc3QpOiBUZXN0R2l0QXR0cmlidXRlQ2hlY2tlckVycm9yIG11c3QgYWxsb3cgYnJva2VuIHBpcGU=-->fix(test): TestGitAttributeCheckerError must allow broken pipe<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5996) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6005)): <!--number 6005 --><!--line 0 --><!--description Zml4OiBjaGVjayByZWFkIHBlcm1pc3Npb25zIGZvciBjb2RlIG93bmVyIHJldmlldyByZXF1ZXN0cw==-->fix: check read permissions for code owner review requests<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5989) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6004)): <!--number 6004 --><!--line 0 --><!--description Zml4OiB1c2UgYmV0dGVyIGNvZGUgdG8gZ3JvdXAgVUlEIGFuZCBzdG9wd2F0Y2hlcw==-->fix: use better code to group UID and stopwatches<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5991) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5993)): <!--number 5993 --><!--line 0 --><!--description Zml4OiBhcGkgcmVwbyBjb21wYXJlIHdpdGggY29tbWl0IGhhc2hlcw==-->fix: api repo compare with commit hashes<!--description-->
- [PR](https://codeberg.org/forgejo/forgejo/pulls/5986) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5992)): <!--number 5992 --><!--line 0 --><!--description YnVnOiBjb3JyZWN0bHkgZ2VuZXJhdGUgb2F1dGgyIGp3dCBzaWduaW5nIGtleQ==-->bug: correctly generate oauth2 jwt signing key<!--description-->
<!--end release-notes-assistant-->

View file

@ -0,0 +1 @@
../RELEASE-NOTES.md

4
release-notes/6271.md Normal file
View file

@ -0,0 +1,4 @@
fix: [commit](https://codeberg.org/forgejo/forgejo/commit/96a7f0a3f065c5db8fdf352c93c8367e24d259de) Fix missing outputs for jobs with matrix
fix: [commit](https://codeberg.org/forgejo/forgejo/commit/2b5c69c451a684b20119e2521dc23734c7869241) Detect whether action view branch was deleted
feat: [commit](https://codeberg.org/forgejo/forgejo/commit/b0d6a7f07bff836190a8e87fe5645d5557893e32) Implement update branch API
fix: [commit](https://codeberg.org/forgejo/forgejo/commit/bf934c96c92d643678ac7a18697b6563bc9d20a5) Add standard-compliant route to serve outdated R packages

View file

@ -1,14 +1,16 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package oauth2
package runner
import (
"testing"
"code.gitea.io/gitea/models/unittest"
_ "code.gitea.io/gitea/models/forgefed"
)
func TestMain(m *testing.M) {
unittest.MainTest(m, &unittest.TestOptions{})
unittest.MainTest(m)
}

View file

@ -162,28 +162,56 @@ func findTaskNeeds(ctx context.Context, task *actions_model.ActionTask) (map[str
return nil, fmt.Errorf("FindRunJobs: %w", err)
}
ret := make(map[string]*runnerv1.TaskNeed, len(needs))
jobIDJobs := make(map[string][]*actions_model.ActionRunJob)
for _, job := range jobs {
if !needs.Contains(job.JobID) {
jobIDJobs[job.JobID] = append(jobIDJobs[job.JobID], job)
}
ret := make(map[string]*runnerv1.TaskNeed, len(needs))
for jobID, jobsWithSameID := range jobIDJobs {
if !needs.Contains(jobID) {
continue
}
if job.TaskID == 0 || !job.Status.IsDone() {
// it shouldn't happen, or the job has been rerun
continue
var jobOutputs map[string]string
for _, job := range jobsWithSameID {
if job.TaskID == 0 || !job.Status.IsDone() {
// it shouldn't happen, or the job has been rerun
continue
}
got, err := actions_model.FindTaskOutputByTaskID(ctx, job.TaskID)
if err != nil {
return nil, fmt.Errorf("FindTaskOutputByTaskID: %w", err)
}
outputs := make(map[string]string, len(got))
for _, v := range got {
outputs[v.OutputKey] = v.OutputValue
}
if len(jobOutputs) == 0 {
jobOutputs = outputs
} else {
jobOutputs = mergeTwoOutputs(outputs, jobOutputs)
}
}
outputs := make(map[string]string)
got, err := actions_model.FindTaskOutputByTaskID(ctx, job.TaskID)
if err != nil {
return nil, fmt.Errorf("FindTaskOutputByTaskID: %w", err)
}
for _, v := range got {
outputs[v.OutputKey] = v.OutputValue
}
ret[job.JobID] = &runnerv1.TaskNeed{
Outputs: outputs,
Result: runnerv1.Result(job.Status),
ret[jobID] = &runnerv1.TaskNeed{
Outputs: jobOutputs,
Result: runnerv1.Result(actions_model.AggregateJobStatus(jobsWithSameID)),
}
}
return ret, nil
}
// mergeTwoOutputs merges two outputs from two different ActionRunJobs
// Values with the same output name may be overridden. The user should ensure the output names are unique.
// See https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#using-job-outputs-in-a-matrix-job
func mergeTwoOutputs(o1, o2 map[string]string) map[string]string {
ret := make(map[string]string, len(o1))
for k1, v1 := range o1 {
if len(v1) > 0 {
ret[k1] = v1
} else {
ret[k1] = o2[k1]
}
}
return ret
}

View file

@ -0,0 +1,29 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package runner
import (
"context"
"testing"
actions_model "code.gitea.io/gitea/models/actions"
"code.gitea.io/gitea/models/unittest"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func Test_findTaskNeeds(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
task := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionTask{ID: 51})
ret, err := findTaskNeeds(context.Background(), task)
require.NoError(t, err)
assert.Len(t, ret, 1)
assert.Contains(t, ret, "job1")
assert.Len(t, ret["job1"].Outputs, 2)
assert.Equal(t, "abc", ret["job1"].Outputs["output_a"])
assert.Equal(t, "bbb", ret["job1"].Outputs["output_b"])
}

View file

@ -337,6 +337,7 @@ func CommonRoutes() *web.Route {
r.Get("/PACKAGES", cran.EnumerateSourcePackages)
r.Get("/PACKAGES{format}", cran.EnumerateSourcePackages)
r.Get("/{filename}", cran.DownloadSourcePackageFile)
r.Get("/Archive/{packagename}/{filename}", cran.DownloadSourcePackageFile)
})
r.Put("", reqPackageAccess(perm.AccessModeWrite), enforcePackagesQuota(), cran.UploadSourcePackageFile)
})

View file

@ -8,6 +8,7 @@ import (
"errors"
"fmt"
"net/http"
"strconv"
"code.gitea.io/gitea/models"
asymkey_model "code.gitea.io/gitea/models/asymkey"
@ -415,6 +416,11 @@ func SearchUsers(ctx *context.APIContext) {
// in: query
// description: user's login name to search for
// type: string
// - name: sort
// in: query
// description: sort order of results
// type: string
// enum: [oldest, newest, alphabetically, reversealphabetically, recentupdate, leastupdate]
// - name: page
// in: query
// description: page number of results to return (1-based)
@ -431,12 +437,40 @@ func SearchUsers(ctx *context.APIContext) {
listOptions := utils.GetListOptions(ctx)
sort := ctx.FormString("sort")
var orderBy db.SearchOrderBy
switch sort {
case "oldest":
orderBy = db.SearchOrderByOldest
case "newest":
orderBy = db.SearchOrderByNewest
case "alphabetically":
orderBy = db.SearchOrderByAlphabetically
case "reversealphabetically":
orderBy = db.SearchOrderByAlphabeticallyReverse
case "recentupdate":
orderBy = db.SearchOrderByRecentUpdated
case "leastupdate":
orderBy = db.SearchOrderByLeastUpdated
default:
orderBy = db.SearchOrderByAlphabetically
}
intSource, err := strconv.ParseInt(ctx.FormString("source_id"), 10, 64)
var sourceID optional.Option[int64]
if ctx.FormString("source_id") == "" || err != nil {
sourceID = optional.None[int64]()
} else {
sourceID = optional.Some(intSource)
}
users, maxResults, err := user_model.SearchUsers(ctx, &user_model.SearchUserOptions{
Actor: ctx.Doer,
Type: user_model.UserTypeIndividual,
LoginName: ctx.FormTrim("login_name"),
SourceID: ctx.FormInt64("source_id"),
OrderBy: db.SearchOrderByAlphabetically,
SourceID: sourceID,
OrderBy: orderBy,
ListOptions: listOptions,
})
if err != nil {

View file

@ -1153,6 +1153,7 @@ func Routes() *web.Route {
m.Get("/*", repo.GetBranch)
m.Delete("/*", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, repo.DeleteBranch)
m.Post("", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, bind(api.CreateBranchRepoOption{}), context.EnforceQuotaAPI(quota_model.LimitSubjectSizeGitAll, context.QuotaTargetRepo), repo.CreateBranch)
m.Patch("/*", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, bind(api.UpdateBranchRepoOption{}), repo.UpdateBranch)
}, context.ReferencesGitRepo(), reqRepoReader(unit.TypeCode))
m.Group("/branch_protections", func() {
m.Get("", repo.ListBranchProtections)

View file

@ -393,6 +393,77 @@ func ListBranches(ctx *context.APIContext) {
ctx.JSON(http.StatusOK, apiBranches)
}
// UpdateBranch updates a repository's branch.
func UpdateBranch(ctx *context.APIContext) {
// swagger:operation PATCH /repos/{owner}/{repo}/branches/{branch} repository repoUpdateBranch
// ---
// summary: Update a branch
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: branch
// in: path
// description: name of the branch
// type: string
// required: true
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/UpdateBranchRepoOption"
// responses:
// "204":
// "$ref": "#/responses/empty"
// "403":
// "$ref": "#/responses/forbidden"
// "404":
// "$ref": "#/responses/notFound"
// "422":
// "$ref": "#/responses/validationError"
opt := web.GetForm(ctx).(*api.UpdateBranchRepoOption)
oldName := ctx.Params("*")
repo := ctx.Repo.Repository
if repo.IsEmpty {
ctx.Error(http.StatusNotFound, "", "Git Repository is empty.")
return
}
if repo.IsMirror {
ctx.Error(http.StatusForbidden, "", "Git Repository is a mirror.")
return
}
msg, err := repo_service.RenameBranch(ctx, repo, ctx.Doer, ctx.Repo.GitRepo, oldName, opt.Name)
if err != nil {
ctx.Error(http.StatusInternalServerError, "RenameBranch", err)
return
}
if msg == "target_exist" {
ctx.Error(http.StatusUnprocessableEntity, "", "Cannot rename a branch using the same name or rename to a branch that already exists.")
return
}
if msg == "from_not_exist" {
ctx.Error(http.StatusNotFound, "", "Branch doesn't exist.")
return
}
ctx.Status(http.StatusNoContent)
}
// GetBranchProtection gets a branch protection
func GetBranchProtection(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/branch_protections/{name} repository repoGetBranchProtection

View file

@ -101,6 +101,8 @@ type swaggerParameterBodies struct {
// in:body
EditRepoOption api.EditRepoOption
// in:body
UpdateBranchRepoOption api.UpdateBranchRepoOption
// in:body
TransferRepoOption api.TransferRepoOption
// in:body
CreateForkOption api.CreateForkOption

View file

@ -599,8 +599,10 @@ func handleUserCreated(ctx *context.Context, u *user_model.User, gothUser *goth.
notify_service.NewUserSignUp(ctx, u)
// update external user information
if gothUser != nil {
if err := externalaccount.EnsureLinkExternalToUser(ctx, u, *gothUser); err != nil {
log.Error("EnsureLinkExternalToUser failed: %v", err)
if err := externalaccount.UpdateExternalUser(ctx, u, *gothUser); err != nil {
if !errors.Is(err, util.ErrNotExist) {
log.Error("UpdateExternalUser failed: %v", err)
}
}
}

View file

@ -1205,39 +1205,9 @@ func handleOAuth2SignIn(ctx *context.Context, source *auth.Source, u *user_model
groups := getClaimedGroups(oauth2Source, &gothUser)
opts := &user_service.UpdateOptions{}
// Reactivate user if they are deactivated
if !u.IsActive {
opts.IsActive = optional.Some(true)
}
// Update GroupClaims
opts.IsAdmin, opts.IsRestricted = getUserAdminAndRestrictedFromGroupClaims(oauth2Source, &gothUser)
if oauth2Source.GroupTeamMap != "" || oauth2Source.GroupTeamMapRemoval {
if err := source_service.SyncGroupsToTeams(ctx, u, groups, groupTeamMapping, oauth2Source.GroupTeamMapRemoval); err != nil {
ctx.ServerError("SyncGroupsToTeams", err)
return
}
}
if err := externalaccount.EnsureLinkExternalToUser(ctx, u, gothUser); err != nil {
ctx.ServerError("EnsureLinkExternalToUser", err)
return
}
// If this user is enrolled in 2FA and this source doesn't override it,
// we can't sign the user in just yet. Instead, redirect them to the 2FA authentication page.
if !needs2FA {
// Register last login
opts.SetLastLogin = true
if err := user_service.UpdateUser(ctx, u, opts); err != nil {
ctx.ServerError("UpdateUser", err)
return
}
if err := updateSession(ctx, nil, map[string]any{
"uid": u.ID,
}); err != nil {
@ -1248,6 +1218,29 @@ func handleOAuth2SignIn(ctx *context.Context, source *auth.Source, u *user_model
// Clear whatever CSRF cookie has right now, force to generate a new one
ctx.Csrf.DeleteCookie(ctx)
opts := &user_service.UpdateOptions{
SetLastLogin: true,
}
opts.IsAdmin, opts.IsRestricted = getUserAdminAndRestrictedFromGroupClaims(oauth2Source, &gothUser)
if err := user_service.UpdateUser(ctx, u, opts); err != nil {
ctx.ServerError("UpdateUser", err)
return
}
if oauth2Source.GroupTeamMap != "" || oauth2Source.GroupTeamMapRemoval {
if err := source_service.SyncGroupsToTeams(ctx, u, groups, groupTeamMapping, oauth2Source.GroupTeamMapRemoval); err != nil {
ctx.ServerError("SyncGroupsToTeams", err)
return
}
}
// update external user information
if err := externalaccount.UpdateExternalUser(ctx, u, gothUser); err != nil {
if !errors.Is(err, util.ErrNotExist) {
log.Error("UpdateExternalUser failed: %v", err)
}
}
if err := resetLocale(ctx, u); err != nil {
ctx.ServerError("resetLocale", err)
return
@ -1263,13 +1256,22 @@ func handleOAuth2SignIn(ctx *context.Context, source *auth.Source, u *user_model
return
}
if opts.IsActive.Has() || opts.IsAdmin.Has() || opts.IsRestricted.Has() {
opts := &user_service.UpdateOptions{}
opts.IsAdmin, opts.IsRestricted = getUserAdminAndRestrictedFromGroupClaims(oauth2Source, &gothUser)
if opts.IsAdmin.Has() || opts.IsRestricted.Has() {
if err := user_service.UpdateUser(ctx, u, opts); err != nil {
ctx.ServerError("UpdateUser", err)
return
}
}
if oauth2Source.GroupTeamMap != "" || oauth2Source.GroupTeamMapRemoval {
if err := source_service.SyncGroupsToTeams(ctx, u, groups, groupTeamMapping, oauth2Source.GroupTeamMapRemoval); err != nil {
ctx.ServerError("SyncGroupsToTeams", err)
return
}
}
if err := updateSession(ctx, nil, map[string]any{
// User needs to use 2FA, save data and redirect to 2FA page.
"twofaUid": u.ID,

View file

@ -12,11 +12,13 @@ import (
actions_model "code.gitea.io/gitea/models/actions"
"code.gitea.io/gitea/models/db"
git_model "code.gitea.io/gitea/models/git"
"code.gitea.io/gitea/models/unit"
"code.gitea.io/gitea/modules/actions"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/container"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/optional"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
@ -222,6 +224,10 @@ func List(ctx *context.Context) {
return
}
if err := loadIsRefDeleted(ctx, runs); err != nil {
log.Error("LoadIsRefDeleted", err)
}
ctx.Data["Runs"] = runs
ctx.Data["Repo"] = ctx.Repo
@ -245,3 +251,31 @@ func List(ctx *context.Context) {
ctx.HTML(http.StatusOK, tplListActions)
}
// loadIsRefDeleted loads the IsRefDeleted field for each run in the list.
// TODO: move this function to models/actions/run_list.go but now it will result in a circular import.
func loadIsRefDeleted(ctx *context.Context, runs actions_model.RunList) error {
branches := make(container.Set[string], len(runs))
for _, run := range runs {
refName := git.RefName(run.Ref)
if refName.IsBranch() {
branches.Add(refName.ShortName())
}
}
if len(branches) == 0 {
return nil
}
branchInfos, err := git_model.GetBranches(ctx, ctx.Repo.Repository.ID, branches.Values(), false)
if err != nil {
return err
}
branchSet := git_model.BranchesToNamesSet(branchInfos)
for _, run := range runs {
refName := git.RefName(run.Ref)
if refName.IsBranch() && !branchSet.Contains(run.Ref) {
run.IsRefDeleted = true
}
}
return nil
}

View file

@ -20,10 +20,13 @@ import (
actions_model "code.gitea.io/gitea/models/actions"
"code.gitea.io/gitea/models/db"
git_model "code.gitea.io/gitea/models/git"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unit"
"code.gitea.io/gitea/modules/actions"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/storage"
"code.gitea.io/gitea/modules/templates"
@ -157,8 +160,9 @@ type ViewUser struct {
}
type ViewBranch struct {
Name string `json:"name"`
Link string `json:"link"`
Name string `json:"name"`
Link string `json:"link"`
IsDeleted bool `json:"isDeleted"`
}
type ViewJobStep struct {
@ -227,6 +231,16 @@ func ViewPost(ctx *context_module.Context) {
Name: run.PrettyRef(),
Link: run.RefLink(),
}
refName := git.RefName(run.Ref)
if refName.IsBranch() {
b, err := git_model.GetBranch(ctx, ctx.Repo.Repository.ID, refName.ShortName())
if err != nil && !git_model.IsErrBranchNotExist(err) {
log.Error("GetBranch: %v", err)
} else if git_model.IsErrBranchNotExist(err) || (b != nil && b.IsDeleted) {
branch.IsDeleted = true
}
}
resp.State.Run.Commit = ViewCommit{
LocaleCommit: ctx.Locale.TrString("actions.runs.commit"),
LocalePushedBy: ctx.Locale.TrString("actions.runs.pushed_by"),

View file

@ -1,62 +0,0 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package oauth2
import (
"time"
"github.com/markbates/goth"
"golang.org/x/oauth2"
)
type fakeProvider struct{}
func (p *fakeProvider) Name() string {
return "fake"
}
func (p *fakeProvider) SetName(name string) {}
func (p *fakeProvider) BeginAuth(state string) (goth.Session, error) {
return nil, nil
}
func (p *fakeProvider) UnmarshalSession(string) (goth.Session, error) {
return nil, nil
}
func (p *fakeProvider) FetchUser(goth.Session) (goth.User, error) {
return goth.User{}, nil
}
func (p *fakeProvider) Debug(bool) {
}
func (p *fakeProvider) RefreshToken(refreshToken string) (*oauth2.Token, error) {
switch refreshToken {
case "expired":
return nil, &oauth2.RetrieveError{
ErrorCode: "invalid_grant",
}
default:
return &oauth2.Token{
AccessToken: "token",
TokenType: "Bearer",
RefreshToken: "refresh",
Expiry: time.Now().Add(time.Hour),
}, nil
}
}
func (p *fakeProvider) RefreshTokenAvailable() bool {
return true
}
func init() {
RegisterGothProvider(
NewSimpleProvider("fake", "Fake", []string{"account"},
func(clientKey, secret, callbackURL string, scopes ...string) goth.Provider {
return &fakeProvider{}
}))
}

View file

@ -39,7 +39,7 @@ func (source *Source) FromDB(bs []byte) error {
return json.UnmarshalHandleDoubleEncode(bs, &source)
}
// ToDB exports an OAuth2Config to a serialized format.
// ToDB exports an SMTPConfig to a serialized format.
func (source *Source) ToDB() ([]byte, error) {
return json.Marshal(source)
}

View file

@ -1,209 +0,0 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package oauth2
import (
"context"
"fmt"
"time"
asymkey_model "code.gitea.io/gitea/models/asymkey"
"code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/db"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/util"
"github.com/markbates/goth"
"github.com/markbates/goth/providers/openidConnect"
"golang.org/x/oauth2"
)
// Sync causes this OAuth2 source to synchronize its users with the db.
func (source *Source) Sync(ctx context.Context, updateExisting bool) error {
log.Trace("Doing: SyncExternalUsers[%s] %d", source.authSource.Name, source.authSource.ID)
if !updateExisting {
log.Info("SyncExternalUsers[%s] not running since updateExisting is false", source.authSource.Name)
return nil
}
provider, err := createProvider(source.authSource.Name, source)
if err != nil {
return err
}
if !provider.RefreshTokenAvailable() {
log.Trace("SyncExternalUsers[%s] provider doesn't support refresh tokens, can't synchronize", source.authSource.Name)
return nil
}
opts := user_model.FindExternalUserOptions{
HasRefreshToken: true,
Expired: true,
LoginSourceID: source.authSource.ID,
}
return user_model.IterateExternalLogin(ctx, opts, func(ctx context.Context, u *user_model.ExternalLoginUser) error {
return source.refresh(ctx, provider, u)
})
}
func (source *Source) refresh(ctx context.Context, provider goth.Provider, u *user_model.ExternalLoginUser) error {
log.Trace("Syncing login_source_id=%d external_id=%s expiration=%s", u.LoginSourceID, u.ExternalID, u.ExpiresAt)
shouldDisable := false
token, err := provider.RefreshToken(u.RefreshToken)
if err != nil {
if err, ok := err.(*oauth2.RetrieveError); ok && err.ErrorCode == "invalid_grant" {
// this signals that the token is not valid and the user should be disabled
shouldDisable = true
} else {
return err
}
}
user := &user_model.User{
LoginName: u.ExternalID,
LoginType: auth.OAuth2,
LoginSource: u.LoginSourceID,
}
hasUser, err := user_model.GetUser(ctx, user)
if err != nil {
return err
}
// If the grant is no longer valid, disable the user and
// delete local tokens. If the OAuth2 provider still
// recognizes them as a valid user, they will be able to login
// via their provider and reactivate their account.
if shouldDisable {
log.Info("SyncExternalUsers[%s] disabling user %d", source.authSource.Name, user.ID)
return db.WithTx(ctx, func(ctx context.Context) error {
if hasUser {
user.IsActive = false
err := user_model.UpdateUserCols(ctx, user, "is_active")
if err != nil {
return err
}
}
// Delete stored tokens, since they are invalid. This
// also provents us from checking this in subsequent runs.
u.AccessToken = ""
u.RefreshToken = ""
u.ExpiresAt = time.Time{}
return user_model.UpdateExternalUserByExternalID(ctx, u)
})
}
// Otherwise, update the tokens
u.AccessToken = token.AccessToken
u.ExpiresAt = token.Expiry
// Some providers only update access tokens provide a new
// refresh token, so avoid updating it if it's empty
if token.RefreshToken != "" {
u.RefreshToken = token.RefreshToken
}
needUserFetch := source.ProvidesSSHKeys()
if needUserFetch {
fetchedUser, err := fetchUser(provider, token)
if err != nil {
log.Error("fetchUser: %v", err)
} else {
err = updateSSHKeys(ctx, source, user, &fetchedUser)
if err != nil {
log.Error("updateSshKeys: %v", err)
}
}
}
err = user_model.UpdateExternalUserByExternalID(ctx, u)
return err
}
func fetchUser(provider goth.Provider, token *oauth2.Token) (goth.User, error) {
state, err := util.CryptoRandomString(40)
if err != nil {
return goth.User{}, err
}
session, err := provider.BeginAuth(state)
if err != nil {
return goth.User{}, err
}
if s, ok := session.(*openidConnect.Session); ok {
s.AccessToken = token.AccessToken
s.RefreshToken = token.RefreshToken
s.ExpiresAt = token.Expiry
s.IDToken = token.Extra("id_token").(string)
}
gothUser, err := provider.FetchUser(session)
if err != nil {
return goth.User{}, err
}
return gothUser, nil
}
func updateSSHKeys(
ctx context.Context,
source *Source,
user *user_model.User,
fetchedUser *goth.User,
) error {
if source.ProvidesSSHKeys() {
sshKeys, err := getSSHKeys(source, fetchedUser)
if err != nil {
return err
}
if len(sshKeys) == 0 {
return nil
}
if asymkey_model.SynchronizePublicKeys(ctx, user, source.authSource, sshKeys) {
err = asymkey_model.RewriteAllPublicKeys(ctx)
if err != nil {
return err
}
}
}
return nil
}
func getSSHKeys(source *Source, gothUser *goth.User) ([]string, error) {
key := source.AttributeSSHPublicKey
value, exists := gothUser.RawData[key]
if !exists {
return nil, fmt.Errorf("attribute '%s' not found in user data", key)
}
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
}

View file

@ -1,101 +0,0 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package oauth2
import (
"context"
"testing"
"code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestSource(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
source := &Source{
Provider: "fake",
authSource: &auth.Source{
ID: 12,
Type: auth.OAuth2,
Name: "fake",
IsActive: true,
IsSyncEnabled: true,
},
}
user := &user_model.User{
LoginName: "external",
LoginType: auth.OAuth2,
LoginSource: source.authSource.ID,
Name: "test",
Email: "external@example.com",
}
err := user_model.CreateUser(context.Background(), user, &user_model.CreateUserOverwriteOptions{})
require.NoError(t, err)
e := &user_model.ExternalLoginUser{
ExternalID: "external",
UserID: user.ID,
LoginSourceID: user.LoginSource,
RefreshToken: "valid",
}
err = user_model.LinkExternalToUser(context.Background(), user, e)
require.NoError(t, err)
provider, err := createProvider(source.authSource.Name, source)
require.NoError(t, err)
t.Run("refresh", func(t *testing.T) {
t.Run("valid", func(t *testing.T) {
err := source.refresh(context.Background(), provider, e)
require.NoError(t, err)
e := &user_model.ExternalLoginUser{
ExternalID: e.ExternalID,
LoginSourceID: e.LoginSourceID,
}
ok, err := user_model.GetExternalLogin(context.Background(), e)
require.NoError(t, err)
assert.True(t, ok)
assert.Equal(t, "refresh", e.RefreshToken)
assert.Equal(t, "token", e.AccessToken)
u, err := user_model.GetUserByID(context.Background(), user.ID)
require.NoError(t, err)
assert.True(t, u.IsActive)
})
t.Run("expired", func(t *testing.T) {
err := source.refresh(context.Background(), provider, &user_model.ExternalLoginUser{
ExternalID: "external",
UserID: user.ID,
LoginSourceID: user.LoginSource,
RefreshToken: "expired",
})
require.NoError(t, err)
e := &user_model.ExternalLoginUser{
ExternalID: e.ExternalID,
LoginSourceID: e.LoginSourceID,
}
ok, err := user_model.GetExternalLogin(context.Background(), e)
require.NoError(t, err)
assert.True(t, ok)
assert.Equal(t, "", e.RefreshToken)
assert.Equal(t, "", e.AccessToken)
u, err := user_model.GetUserByID(context.Background(), user.ID)
require.NoError(t, err)
assert.False(t, u.IsActive)
})
})
}

View file

@ -71,14 +71,14 @@ func LinkAccountToUser(ctx context.Context, user *user_model.User, gothUser goth
return nil
}
// EnsureLinkExternalToUser link the gothUser to the user
func EnsureLinkExternalToUser(ctx context.Context, user *user_model.User, gothUser goth.User) error {
// UpdateExternalUser updates external user's information
func UpdateExternalUser(ctx context.Context, user *user_model.User, gothUser goth.User) error {
externalLoginUser, err := toExternalLoginUser(ctx, user, gothUser)
if err != nil {
return err
}
return user_model.EnsureLinkExternalToUser(ctx, externalLoginUser)
return user_model.UpdateExternalUserByExternalID(ctx, externalLoginUser)
}
// UpdateMigrationsByType updates all migrated repositories' posterid from gitServiceType to replace originalAuthorID to posterID

View file

@ -254,7 +254,7 @@ func SyncBranchesToDB(ctx context.Context, repoID, pusherID int64, branchNames,
}
return db.WithTx(ctx, func(ctx context.Context) error {
branches, err := git_model.GetBranches(ctx, repoID, branchNames)
branches, err := git_model.GetBranches(ctx, repoID, branchNames, true)
if err != nil {
return fmt.Errorf("git_model.GetBranches: %v", err)
}

View file

@ -425,7 +425,7 @@
<p class="help">{{ctx.Locale.Tr "admin.auths.sspi_default_language_helper"}}</p>
</div>
{{end}}
{{if (or .Source.IsLDAP .Source.IsOAuth2)}}
{{if .Source.IsLDAP}}
<div class="inline field">
<div class="ui checkbox">
<label><strong>{{ctx.Locale.Tr "admin.auths.syncenabled"}}</strong></label>

View file

@ -59,7 +59,7 @@
<input name="attributes_in_bind" type="checkbox" {{if .attributes_in_bind}}checked{{end}}>
</div>
</div>
<div class="oauth2 ldap inline field {{if not (or (eq .type 2) (eq .type 6))}}tw-hidden{{end}}">
<div class="ldap inline field {{if not (eq .type 2)}}tw-hidden{{end}}">
<div class="ui checkbox">
<label><strong>{{ctx.Locale.Tr "admin.auths.syncenabled"}}</strong></label>
<input name="is_sync_enabled" type="checkbox" {{if .is_sync_enabled}}checked{{end}}>

View file

@ -13,20 +13,20 @@
<a class="text primary name" href="{{.Link}}">{{.Name}}</a>
<span class="label-list">
{{if .IsArchived}}
<span class="ui basic label">{{ctx.Locale.Tr "repo.desc.archived"}}</span>
<span class="ui label">{{ctx.Locale.Tr "repo.desc.archived"}}</span>
{{end}}
{{if .IsPrivate}}
<span class="ui basic label">{{ctx.Locale.Tr "repo.desc.private"}}</span>
<span class="ui label">{{ctx.Locale.Tr "repo.desc.private"}}</span>
{{else}}
{{if .Owner.Visibility.IsPrivate}}
<span class="ui basic label">{{ctx.Locale.Tr "repo.desc.internal"}}</span>
<span class="ui label">{{ctx.Locale.Tr "repo.desc.internal"}}</span>
{{end}}
{{end}}
{{if .IsTemplate}}
<span class="ui basic label">{{ctx.Locale.Tr "repo.desc.template"}}</span>
<span class="ui label">{{ctx.Locale.Tr "repo.desc.template"}}</span>
{{end}}
{{if eq .ObjectFormatName "sha256"}}
<span class="ui basic label">{{ctx.Locale.Tr "repo.desc.sha256"}}</span>
<span class="ui label">{{ctx.Locale.Tr "repo.desc.sha256"}}</span>
{{end}}
</span>
</div>

View file

@ -8,7 +8,7 @@
<div class="flex-item-title">
{{template "shared/user/name" .}}
{{if .Visibility.IsPrivate}}
<span class="ui basic tiny label">{{ctx.Locale.Tr "repo.desc.private"}}</span>
<span class="ui label">{{ctx.Locale.Tr "repo.desc.private"}}</span>
{{end}}
</div>
<div class="flex-item-body">

Some files were not shown because too many files have changed in this diff Show more