From f8dfb5905f8a90ea4bdd38f2f3eb97f68a47d5c5 Mon Sep 17 00:00:00 2001
From: wxiaoguang
Date: Tue, 11 Mar 2025 00:52:08 +0800
Subject: [PATCH 01/32] Remove "noscript" tag from html head (#33846)
(cherry picked from commit 7fa47de7e96f6d05cdc6d920b0264ce8115de5a8)
---
templates/base/head.tmpl | 6 ------
1 file changed, 6 deletions(-)
diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl
index 9eb5b5addf..7ec2ac87b3 100644
--- a/templates/base/head.tmpl
+++ b/templates/base/head.tmpl
@@ -20,12 +20,6 @@
{{template "base/head_script" .}}
-
{{template "shared/user/mention_highlight" .}}
{{template "base/head_opengraph" .}}
{{template "base/head_style" .}}
From 0dfa5d0c7de137cd072fb007e067bdd722670865 Mon Sep 17 00:00:00 2001
From: wxiaoguang
Date: Fri, 14 Mar 2025 16:36:39 +0800
Subject: [PATCH 02/32] Ignore trivial errors when updating push data (#33864)
Fix #23213
(cherry picked from commit cb6b33c9cd1efa619351a458e2bce8ad1e6cd623)
---
services/gitdiff/gitdiff.go | 2 --
services/repository/push.go | 36 ++++++++++++++++++++----------------
2 files changed, 20 insertions(+), 18 deletions(-)
diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go
index 65f6ac8d12..f2070983e6 100644
--- a/services/gitdiff/gitdiff.go
+++ b/services/gitdiff/gitdiff.go
@@ -1381,10 +1381,8 @@ func GetWhitespaceFlag(whitespaceBehavior string) git.TrustedCmdArgs {
"ignore-eol": {"--ignore-space-at-eol"},
"show-all": nil,
}
-
if flag, ok := whitespaceFlags[whitespaceBehavior]; ok {
return flag
}
- log.Warn("unknown whitespace behavior: %q, default to 'show-all'", whitespaceBehavior)
return nil
}
diff --git a/services/repository/push.go b/services/repository/push.go
index 0c2b66aa3e..924f365c05 100644
--- a/services/repository/push.go
+++ b/services/repository/push.go
@@ -23,6 +23,7 @@ import (
repo_module "code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/timeutil"
+ "code.gitea.io/gitea/modules/util"
issue_service "code.gitea.io/gitea/services/issue"
notify_service "code.gitea.io/gitea/services/notify"
pull_service "code.gitea.io/gitea/services/pull"
@@ -133,23 +134,26 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
} else { // is new tag
newCommit, err := gitRepo.GetCommit(opts.NewCommitID)
if err != nil {
- return fmt.Errorf("gitRepo.GetCommit(%s) in %s/%s[%d]: %w", opts.NewCommitID, repo.OwnerName, repo.Name, repo.ID, err)
+ // in case there is dirty data, for example, the "github.com/git/git" repository has tags pointing to non-existing commits
+ if !errors.Is(err, util.ErrNotExist) {
+ log.Error("Unable to get tag commit: gitRepo.GetCommit(%s) in %s/%s[%d]: %v", opts.NewCommitID, repo.OwnerName, repo.Name, repo.ID, err)
+ }
+ } else {
+ commits := repo_module.NewPushCommits()
+ commits.HeadCommit = repo_module.CommitToPushCommit(newCommit)
+ commits.CompareURL = repo.ComposeCompareURL(objectFormat.EmptyObjectID().String(), opts.NewCommitID)
+
+ notify_service.PushCommits(
+ ctx, pusher, repo,
+ &repo_module.PushUpdateOptions{
+ RefFullName: opts.RefFullName,
+ OldCommitID: objectFormat.EmptyObjectID().String(),
+ NewCommitID: opts.NewCommitID,
+ }, commits)
+
+ addTags = append(addTags, tagName)
+ notify_service.CreateRef(ctx, pusher, repo, opts.RefFullName, opts.NewCommitID)
}
-
- commits := repo_module.NewPushCommits()
- commits.HeadCommit = repo_module.CommitToPushCommit(newCommit)
- commits.CompareURL = repo.ComposeCompareURL(objectFormat.EmptyObjectID().String(), opts.NewCommitID)
-
- notify_service.PushCommits(
- ctx, pusher, repo,
- &repo_module.PushUpdateOptions{
- RefFullName: opts.RefFullName,
- OldCommitID: objectFormat.EmptyObjectID().String(),
- NewCommitID: opts.NewCommitID,
- }, commits)
-
- addTags = append(addTags, tagName)
- notify_service.CreateRef(ctx, pusher, repo, opts.RefFullName, opts.NewCommitID)
}
} else if opts.RefFullName.IsBranch() {
if pusher == nil || pusher.ID != opts.PusherID {
From ae8dca84230975aa553d588435625b0a14f7e69d Mon Sep 17 00:00:00 2001
From: 0ko <0ko@noreply.codeberg.org>
Date: Mon, 17 Mar 2025 07:12:11 +0000
Subject: [PATCH 03/32] branding: update API descriptions (#7244)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7244
Reviewed-by: Gusted
Reviewed-by: Earl Warren
Co-authored-by: 0ko <0ko@noreply.codeberg.org>
Co-committed-by: 0ko <0ko@noreply.codeberg.org>
---
modules/structs/user.go | 2 +-
routers/api/v1/misc/nodeinfo.go | 4 ++--
routers/api/v1/misc/version.go | 2 +-
templates/swagger/v1_json.tmpl | 6 +++---
4 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/modules/structs/user.go b/modules/structs/user.go
index 2dd3051c50..6c0468b5fb 100644
--- a/modules/structs/user.go
+++ b/modules/structs/user.go
@@ -27,7 +27,7 @@ type User struct {
Email string `json:"email"`
// URL to the user's avatar
AvatarURL string `json:"avatar_url"`
- // URL to the user's gitea page
+ // URL to the user's profile page
HTMLURL string `json:"html_url"`
// User locale
Language string `json:"language"`
diff --git a/routers/api/v1/misc/nodeinfo.go b/routers/api/v1/misc/nodeinfo.go
index 9c2a0db8d2..70187e0ebf 100644
--- a/routers/api/v1/misc/nodeinfo.go
+++ b/routers/api/v1/misc/nodeinfo.go
@@ -16,11 +16,11 @@ import (
const cacheKeyNodeInfoUsage = "API_NodeInfoUsage"
-// NodeInfo returns the NodeInfo for the Gitea instance to allow for federation
+// NodeInfo returns the NodeInfo for the Forgejo instance to allow for federation
func NodeInfo(ctx *context.APIContext) {
// swagger:operation GET /nodeinfo miscellaneous getNodeInfo
// ---
- // summary: Returns the nodeinfo of the Gitea application
+ // summary: Returns the nodeinfo of the Forgejo application
// produces:
// - application/json
// responses:
diff --git a/routers/api/v1/misc/version.go b/routers/api/v1/misc/version.go
index e3b43a0e6b..3417475d21 100644
--- a/routers/api/v1/misc/version.go
+++ b/routers/api/v1/misc/version.go
@@ -15,7 +15,7 @@ import (
func Version(ctx *context.APIContext) {
// swagger:operation GET /version miscellaneous getVersion
// ---
- // summary: Returns the version of the Gitea application
+ // summary: Returns the version of the running application
// produces:
// - application/json
// responses:
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index eb891d5a8a..36ed631207 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -1877,7 +1877,7 @@
"tags": [
"miscellaneous"
],
- "summary": "Returns the nodeinfo of the Gitea application",
+ "summary": "Returns the nodeinfo of the Forgejo application",
"operationId": "getNodeInfo",
"responses": {
"200": {
@@ -20530,7 +20530,7 @@
"tags": [
"miscellaneous"
],
- "summary": "Returns the version of the Gitea application",
+ "summary": "Returns the version of the running application",
"operationId": "getVersion",
"responses": {
"200": {
@@ -27943,7 +27943,7 @@
"x-go-name": "FullName"
},
"html_url": {
- "description": "URL to the user's gitea page",
+ "description": "URL to the user's profile page",
"type": "string",
"x-go-name": "HTMLURL"
},
From 5e338062c5d231decc7f60e3690df4b57b05ac39 Mon Sep 17 00:00:00 2001
From: Renovate Bot
Date: Mon, 17 Mar 2025 08:17:54 +0000
Subject: [PATCH 04/32] Update renovate to v39.205.0 (forgejo) (#7246)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7246
Reviewed-by: Michael Kriese
Co-authored-by: Renovate Bot
Co-committed-by: Renovate Bot
---
.forgejo/workflows/renovate.yml | 2 +-
Makefile | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml
index b97ce6f3b0..48f2d6dd50 100644
--- a/.forgejo/workflows/renovate.yml
+++ b/.forgejo/workflows/renovate.yml
@@ -28,7 +28,7 @@ jobs:
runs-on: docker
container:
- image: data.forgejo.org/renovate/renovate:39.195.1
+ image: data.forgejo.org/renovate/renovate:39.205.1
steps:
- name: Load renovate repo cache
diff --git a/Makefile b/Makefile
index b715a1be38..ce607b3668 100644
--- a/Makefile
+++ b/Makefile
@@ -49,7 +49,7 @@ GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasour
DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.31.0 # renovate: datasource=go
GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.4.0 # renovate: datasource=go
GOPLS_PACKAGE ?= golang.org/x/tools/gopls@v0.18.1 # renovate: datasource=go
-RENOVATE_NPM_PACKAGE ?= renovate@39.195.1 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate
+RENOVATE_NPM_PACKAGE ?= renovate@39.205.1 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate
# https://github.com/disposable-email-domains/disposable-email-domains/commits/main/
DISPOSABLE_EMAILS_SHA ?= 0c27e671231d27cf66370034d7f6818037416989 # renovate: ...
From 511148dbc3b18df56cef1dfd2f0f84b88930684c Mon Sep 17 00:00:00 2001
From: Gusted
Date: Mon, 17 Mar 2025 09:00:12 +0000
Subject: [PATCH 05/32] perf: avoid sorting team names for `ComposeMetas`
(#7223)
- `ComposeMetas` is called to compose meta information for the markdown processer (which is called a lot), one of those information is the team names that have access to the repository. This is used to decide if a mention is a team mention or not.
- The SQL query sorts the names, this is unnecessary and not required for within the processer; it does a simple `strings.Contains(teams, ","+teamName+",")`, which doesn't rely on sorted values.
- Doing the SQL query with sorting against Codeberg's MariaDB took ~0.180s and without sorting took ~0.03s. Although the returned values are often a few rows (the query I tested returned 8 values) it seems that doing any sorting will create an temporary index and is mainly optimized where it has to sort a huge amount of rows.
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7223
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Reviewed-by: Otto
Co-authored-by: Gusted
Co-committed-by: Gusted
---
models/repo/repo.go | 1 -
1 file changed, 1 deletion(-)
diff --git a/models/repo/repo.go b/models/repo/repo.go
index bdf0de2f85..ca7d50ca6a 100644
--- a/models/repo/repo.go
+++ b/models/repo/repo.go
@@ -529,7 +529,6 @@ func (repo *Repository) ComposeMetas(ctx context.Context) map[string]string {
Join("INNER", "team", "team.id = team_repo.team_id").
Where("team_repo.repo_id = ?", repo.ID).
Select("team.lower_name").
- OrderBy("team.lower_name").
Find(&teams)
metas["teams"] = "," + strings.Join(teams, ",") + ","
metas["org"] = strings.ToLower(repo.OwnerName)
From ccd87001c8822f575ba6e2c45c37078c3d6fc625 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Mon, 17 Mar 2025 09:00:24 +0000
Subject: [PATCH 06/32] chore(runner): return errors created by `connect`
(#7222)
- Instead of creating errors via `google.golang.org/grpc`, use `connectrpc.com/connect`.
- This _avoids_ another dependency (still indirectly referenced in testing).
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7222
Reviewed-by: Otto
Co-authored-by: Gusted
Co-committed-by: Gusted
---
assets/go-licenses.json | 10 -----
go.mod | 2 +-
routers/api/actions/runner/interceptor.go | 8 ++--
routers/api/actions/runner/runner.go | 45 +++++++++++------------
4 files changed, 26 insertions(+), 39 deletions(-)
diff --git a/assets/go-licenses.json b/assets/go-licenses.json
index c9e80d16ae..af9c0ce8e0 100644
--- a/assets/go-licenses.json
+++ b/assets/go-licenses.json
@@ -1059,16 +1059,6 @@
"path": "golang.org/x/time/rate/LICENSE",
"licenseText": "Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
},
- {
- "name": "google.golang.org/genproto/googleapis/rpc/status",
- "path": "google.golang.org/genproto/googleapis/rpc/status/LICENSE",
- "licenseText": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"
- },
- {
- "name": "google.golang.org/grpc",
- "path": "google.golang.org/grpc/LICENSE",
- "licenseText": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"
- },
{
"name": "google.golang.org/protobuf",
"path": "google.golang.org/protobuf/LICENSE",
diff --git a/go.mod b/go.mod
index dccbaf9029..eed74a4536 100644
--- a/go.mod
+++ b/go.mod
@@ -108,7 +108,6 @@ require (
golang.org/x/sync v0.12.0
golang.org/x/sys v0.31.0
golang.org/x/text v0.23.0
- google.golang.org/grpc v1.71.0
google.golang.org/protobuf v1.36.4
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/ini.v1 v1.67.0
@@ -276,6 +275,7 @@ require (
google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
+ google.golang.org/grpc v1.71.0 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
)
diff --git a/routers/api/actions/runner/interceptor.go b/routers/api/actions/runner/interceptor.go
index 521ba910e3..b56e6870ac 100644
--- a/routers/api/actions/runner/interceptor.go
+++ b/routers/api/actions/runner/interceptor.go
@@ -16,8 +16,6 @@ import (
"code.gitea.io/gitea/modules/util"
"connectrpc.com/connect"
- "google.golang.org/grpc/codes"
- "google.golang.org/grpc/status"
)
const (
@@ -37,12 +35,12 @@ var withRunner = connect.WithInterceptors(connect.UnaryInterceptorFunc(func(unar
runner, err := actions_model.GetRunnerByUUID(ctx, uuid)
if err != nil {
if errors.Is(err, util.ErrNotExist) {
- return nil, status.Error(codes.Unauthenticated, "unregistered runner")
+ return nil, connect.NewError(connect.CodeUnauthenticated, errors.New("unregistered runner"))
}
- return nil, status.Error(codes.Internal, err.Error())
+ return nil, connect.NewError(connect.CodeInternal, err)
}
if subtle.ConstantTimeCompare([]byte(runner.TokenHash), []byte(auth_model.HashToken(token, runner.TokenSalt))) != 1 {
- return nil, status.Error(codes.Unauthenticated, "unregistered runner")
+ return nil, connect.NewError(connect.CodeUnauthenticated, errors.New("unregistered runner"))
}
cols := []string{"last_online"}
diff --git a/routers/api/actions/runner/runner.go b/routers/api/actions/runner/runner.go
index 4316b4a8e1..6cd37fd224 100644
--- a/routers/api/actions/runner/runner.go
+++ b/routers/api/actions/runner/runner.go
@@ -6,6 +6,7 @@ package runner
import (
"context"
"errors"
+ "fmt"
"net/http"
actions_model "code.gitea.io/gitea/models/actions"
@@ -20,8 +21,6 @@ import (
"code.gitea.io/actions-proto-go/runner/v1/runnerv1connect"
"connectrpc.com/connect"
gouuid "github.com/google/uuid"
- "google.golang.org/grpc/codes"
- "google.golang.org/grpc/status"
)
func NewRunnerServiceHandler() (string, http.Handler) {
@@ -44,27 +43,27 @@ func (s *Service) Register(
req *connect.Request[runnerv1.RegisterRequest],
) (*connect.Response[runnerv1.RegisterResponse], error) {
if req.Msg.Token == "" || req.Msg.Name == "" {
- return nil, errors.New("missing runner token, name")
+ return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("missing runner token, name"))
}
runnerToken, err := actions_model.GetRunnerToken(ctx, req.Msg.Token)
if err != nil {
- return nil, errors.New("runner registration token not found")
+ return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("runner registration token not found"))
}
if !runnerToken.IsActive {
- return nil, errors.New("runner registration token has been invalidated, please use the latest one")
+ return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("runner registration token has been invalidated, please use the latest one"))
}
if runnerToken.OwnerID > 0 {
if _, err := user_model.GetUserByID(ctx, runnerToken.OwnerID); err != nil {
- return nil, errors.New("owner of the token not found")
+ return nil, connect.NewError(connect.CodeInternal, errors.New("owner of the token not found"))
}
}
if runnerToken.RepoID > 0 {
if _, err := repo_model.GetRepositoryByID(ctx, runnerToken.RepoID); err != nil {
- return nil, errors.New("repository of the token not found")
+ return nil, connect.NewError(connect.CodeInternal, errors.New("repository of the token not found"))
}
}
@@ -81,18 +80,18 @@ func (s *Service) Register(
AgentLabels: labels,
}
if err := runner.GenerateToken(); err != nil {
- return nil, errors.New("can't generate token")
+ return nil, connect.NewError(connect.CodeInternal, errors.New("can't generate token"))
}
// create new runner
if err := actions_model.CreateRunner(ctx, runner); err != nil {
- return nil, errors.New("can't create new runner")
+ return nil, connect.NewError(connect.CodeInternal, errors.New("can't create new runner"))
}
// update token status
runnerToken.IsActive = true
if err := actions_model.UpdateRunnerToken(ctx, runnerToken, "is_active"); err != nil {
- return nil, errors.New("can't update runner token status")
+ return nil, connect.NewError(connect.CodeInternal, errors.New("can't update runner token status"))
}
res := connect.NewResponse(&runnerv1.RegisterResponse{
@@ -117,7 +116,7 @@ func (s *Service) Declare(
runner.AgentLabels = req.Msg.Labels
runner.Version = req.Msg.Version
if err := actions_model.UpdateRunner(ctx, runner, "agent_labels", "version"); err != nil {
- return nil, status.Errorf(codes.Internal, "update runner: %v", err)
+ return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("update runner: %w", err))
}
return connect.NewResponse(&runnerv1.DeclareResponse{
@@ -143,10 +142,10 @@ func (s *Service) FetchTask(
tasksVersion := req.Msg.TasksVersion // task version from runner
latestVersion, err := actions_model.GetTasksVersionByScope(ctx, runner.OwnerID, runner.RepoID)
if err != nil {
- return nil, status.Errorf(codes.Internal, "query tasks version failed: %v", err)
+ return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("query tasks version failed: %w", err))
} else if latestVersion == 0 {
if err := actions_model.IncreaseTaskVersion(ctx, runner.OwnerID, runner.RepoID); err != nil {
- return nil, status.Errorf(codes.Internal, "fail to increase task version: %v", err)
+ return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("fail to increase task version: %w", err))
}
// if we don't increase the value of `latestVersion` here,
// the response of FetchTask will return tasksVersion as zero.
@@ -160,7 +159,7 @@ func (s *Service) FetchTask(
// try to pick a task for the runner that send the request.
if t, ok, err := actions_service.PickTask(ctx, runner); err != nil {
log.Error("pick task failed: %v", err)
- return nil, status.Errorf(codes.Internal, "pick task: %v", err)
+ return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("pick task: %w", err))
} else if ok {
task = t
}
@@ -181,7 +180,7 @@ func (s *Service) UpdateTask(
task, err := actions_model.UpdateTaskByState(ctx, runner.ID, req.Msg.State)
if err != nil {
- return nil, status.Errorf(codes.Internal, "update task: %v", err)
+ return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("update task: %w", err))
}
for k, v := range req.Msg.Outputs {
@@ -210,10 +209,10 @@ func (s *Service) UpdateTask(
}
if err := task.LoadJob(ctx); err != nil {
- return nil, status.Errorf(codes.Internal, "load job: %v", err)
+ return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("load job: %w", err))
}
if err := task.Job.LoadRun(ctx); err != nil {
- return nil, status.Errorf(codes.Internal, "load run: %v", err)
+ return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("load run: %w", err))
}
// don't create commit status for cron job
@@ -247,9 +246,9 @@ func (s *Service) UpdateLog(
task, err := actions_model.GetTaskByID(ctx, req.Msg.TaskId)
if err != nil {
- return nil, status.Errorf(codes.Internal, "get task: %v", err)
+ return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("get task: %w", err))
} else if runner.ID != task.RunnerID {
- return nil, status.Errorf(codes.Internal, "invalid runner for task")
+ return nil, connect.NewError(connect.CodeInternal, errors.New("invalid runner for task"))
}
ack := task.LogLength
@@ -259,13 +258,13 @@ func (s *Service) UpdateLog(
}
if task.LogInStorage {
- return nil, status.Errorf(codes.AlreadyExists, "log file has been archived")
+ return nil, connect.NewError(connect.CodeAlreadyExists, errors.New("log file has been archived"))
}
rows := req.Msg.Rows[ack-req.Msg.Index:]
ns, err := actions.WriteLogs(ctx, task.LogFilename, task.LogSize, rows)
if err != nil {
- return nil, status.Errorf(codes.Internal, "write logs: %v", err)
+ return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("write logs: %w", err))
}
task.LogLength += int64(len(rows))
for _, n := range ns {
@@ -280,12 +279,12 @@ func (s *Service) UpdateLog(
task.LogInStorage = true
remove, err = actions.TransferLogs(ctx, task.LogFilename)
if err != nil {
- return nil, status.Errorf(codes.Internal, "transfer logs: %v", err)
+ return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("transfer logs: %w", err))
}
}
if err := actions_model.UpdateTask(ctx, task, "log_indexes", "log_length", "log_size", "log_in_storage"); err != nil {
- return nil, status.Errorf(codes.Internal, "update task: %v", err)
+ return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("update task: %w", err))
}
if remove != nil {
remove()
From d5c8091e089ed9b56574ef6488c99aac01a75298 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Mon, 17 Mar 2025 09:00:34 +0000
Subject: [PATCH 07/32] perf: optimize converting releases to feed items
(#7221)
- `releasesToFeedItems` is called to convert release structs to feed items, which is then used to render RSS or Atom feeds.
- Optimize the loading of attributes for the releases, introduce `ReleaseList` type which uses caching to load repository and publishers. It also no longer loads release attachments and downloads counts as that is not used in feed items.
- Optimize the composing of meta by introducing caching, this operation is especially slow when the owner is an organization.
- Add unit test (ensures new `LoadAttributes` works correctly).
- Add integration test (ensures that feed output is still as expected).
Loading https://codeberg.org/forgejo/forgejo/releases.rss reduced from ~15s to ~1s. (It is currently is deployed on codeberg.org)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7221
Reviewed-by: Otto
Co-authored-by: Gusted
Co-committed-by: Gusted
---
models/repo/release_list.go | 45 +++++++++++++
models/repo/release_list_test.go | 42 ++++++++++++
routers/web/feed/convert.go | 22 ++++---
tests/integration/release_feed_test.go | 91 ++++++++++++++++++++++++++
4 files changed, 192 insertions(+), 8 deletions(-)
create mode 100644 models/repo/release_list.go
create mode 100644 models/repo/release_list_test.go
create mode 100644 tests/integration/release_feed_test.go
diff --git a/models/repo/release_list.go b/models/repo/release_list.go
new file mode 100644
index 0000000000..6c33262125
--- /dev/null
+++ b/models/repo/release_list.go
@@ -0,0 +1,45 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package repo
+
+import (
+ "context"
+
+ user_model "code.gitea.io/gitea/models/user"
+)
+
+type ReleaseList []*Release
+
+// LoadAttributes loads the repository and publisher for the releases.
+func (r ReleaseList) LoadAttributes(ctx context.Context) error {
+ repoCache := make(map[int64]*Repository)
+ userCache := make(map[int64]*user_model.User)
+
+ for _, release := range r {
+ var err error
+ repo, ok := repoCache[release.RepoID]
+ if !ok {
+ repo, err = GetRepositoryByID(ctx, release.RepoID)
+ if err != nil {
+ return err
+ }
+ repoCache[release.RepoID] = repo
+ }
+ release.Repo = repo
+
+ publisher, ok := userCache[release.PublisherID]
+ if !ok {
+ publisher, err = user_model.GetUserByID(ctx, release.PublisherID)
+ if err != nil {
+ if !user_model.IsErrUserNotExist(err) {
+ return err
+ }
+ publisher = user_model.NewGhostUser()
+ }
+ userCache[release.PublisherID] = publisher
+ }
+ release.Publisher = publisher
+ }
+ return nil
+}
diff --git a/models/repo/release_list_test.go b/models/repo/release_list_test.go
new file mode 100644
index 0000000000..cbd77683d0
--- /dev/null
+++ b/models/repo/release_list_test.go
@@ -0,0 +1,42 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package repo
+
+import (
+ "testing"
+
+ "code.gitea.io/gitea/models/unittest"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestReleaseListLoadAttributes(t *testing.T) {
+ require.NoError(t, unittest.PrepareTestDatabase())
+
+ releases := ReleaseList{&Release{
+ RepoID: 1,
+ PublisherID: 1,
+ }, &Release{
+ RepoID: 2,
+ PublisherID: 2,
+ }, &Release{
+ RepoID: 1,
+ PublisherID: 2,
+ }, &Release{
+ RepoID: 2,
+ PublisherID: 1,
+ }}
+
+ require.NoError(t, releases.LoadAttributes(t.Context()))
+
+ assert.EqualValues(t, 1, releases[0].Repo.ID)
+ assert.EqualValues(t, 1, releases[0].Publisher.ID)
+ assert.EqualValues(t, 2, releases[1].Repo.ID)
+ assert.EqualValues(t, 2, releases[1].Publisher.ID)
+ assert.EqualValues(t, 1, releases[2].Repo.ID)
+ assert.EqualValues(t, 2, releases[2].Publisher.ID)
+ assert.EqualValues(t, 2, releases[3].Repo.ID)
+ assert.EqualValues(t, 1, releases[3].Publisher.ID)
+}
diff --git a/routers/web/feed/convert.go b/routers/web/feed/convert.go
index d3d01a87e0..5f7687d803 100644
--- a/routers/web/feed/convert.go
+++ b/routers/web/feed/convert.go
@@ -298,14 +298,14 @@ func GetFeedType(name string, req *http.Request) (bool, string, string) {
return false, name, ""
}
-// feedActionsToFeedItems convert gitea's Repo's Releases to feeds Item
-func releasesToFeedItems(ctx *context.Context, releases []*repo_model.Release) (items []*feeds.Item, err error) {
- for _, rel := range releases {
- err := rel.LoadAttributes(ctx)
- if err != nil {
- return nil, err
- }
+// feedActionsToFeedItems convert repository releases into feed items.
+func releasesToFeedItems(ctx *context.Context, releases repo_model.ReleaseList) (items []*feeds.Item, err error) {
+ if err := releases.LoadAttributes(ctx); err != nil {
+ return nil, err
+ }
+ composeCache := make(map[int64]map[string]string)
+ for _, rel := range releases {
var title string
var content template.HTML
@@ -315,13 +315,19 @@ func releasesToFeedItems(ctx *context.Context, releases []*repo_model.Release) (
title = rel.Title
}
+ metas, ok := composeCache[rel.RepoID]
+ if !ok {
+ metas = rel.Repo.ComposeMetas(ctx)
+ composeCache[rel.RepoID] = metas
+ }
+
link := &feeds.Link{Href: rel.HTMLURL()}
content, err = markdown.RenderString(&markup.RenderContext{
Ctx: ctx,
Links: markup.Links{
Base: rel.Repo.Link(),
},
- Metas: rel.Repo.ComposeMetas(ctx),
+ Metas: metas,
}, rel.Note)
if err != nil {
return nil, err
diff --git a/tests/integration/release_feed_test.go b/tests/integration/release_feed_test.go
new file mode 100644
index 0000000000..fd1f42c3cd
--- /dev/null
+++ b/tests/integration/release_feed_test.go
@@ -0,0 +1,91 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package integration
+
+import (
+ "net/http"
+ "regexp"
+ "testing"
+
+ "code.gitea.io/gitea/tests"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestReleaseFeed(t *testing.T) {
+ defer tests.PrepareTestEnv(t)()
+
+ normalize := func(body string) string {
+ // Remove port.
+ body = regexp.MustCompile(`localhost:\d+`).ReplaceAllString(body, "localhost")
+ // date is timezone dependent.
+ body = regexp.MustCompile(`.*`).ReplaceAllString(body, "")
+ body = regexp.MustCompile(`.*`).ReplaceAllString(body, "")
+ return body
+ }
+ t.Run("RSS feed", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ resp := MakeRequest(t, NewRequest(t, "GET", "/user2/repo1/releases.rss"), http.StatusOK)
+ assert.EqualValues(t, `
+
+ Releases for user2/repo1
+ http://localhost/user2/repo1/release
+
+
+
+ pre-release
+ http://localhost/user2/repo1/releases/tag/v1.0
+
+ some text for a pre release
+]]>
+ user2
+ 5: http://localhost/user2/repo1/releases/tag/v1.0
+
+
+
+ testing-release
+ http://localhost/user2/repo1/releases/tag/v1.1
+
+ user2
+ 1: http://localhost/user2/repo1/releases/tag/v1.1
+
+
+
+`, normalize(resp.Body.String()))
+ })
+
+ t.Run("Atom feed", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ resp := MakeRequest(t, NewRequest(t, "GET", "/user2/repo1/releases.atom"), http.StatusOK)
+ assert.EqualValues(t, `
+ Releases for user2/repo1
+ http://localhost/user2/repo1/release
+
+
+
+ pre-release
+
+ 5: http://localhost/user2/repo1/releases/tag/v1.0
+ <p dir="auto">some text for a pre release</p>
+
+
+ user2
+ user2@noreply.example.org
+
+
+
+ testing-release
+
+ 1: http://localhost/user2/repo1/releases/tag/v1.1
+
+
+ user2
+ user2@noreply.example.org
+
+
+`, normalize(resp.Body.String()))
+ })
+}
From 7d6d4f94ee909b1a330817017041e6becddfa0f8 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Mon, 17 Mar 2025 09:02:57 +0000
Subject: [PATCH 08/32] feat(api): add sort parameter to list issues API
(#7211)
- Add the `sort` parameter to the `/api/v1/{repo}/{owner}/issues` API endpoint. Default behavior is preserved.
- Resolves forgejo/forgejo#4173
- Add (non-exhaustive) integration testing.
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7211
Reviewed-by: Otto
Co-authored-by: Gusted
Co-committed-by: Gusted
---
modules/indexer/issues/indexer.go | 28 ++++++++++++++++++
routers/api/v1/repo/issue.go | 8 +++++-
templates/swagger/v1_json.tmpl | 18 ++++++++++++
tests/integration/api_issue_test.go | 44 +++++++++++++++++++++++++++++
4 files changed, 97 insertions(+), 1 deletion(-)
diff --git a/modules/indexer/issues/indexer.go b/modules/indexer/issues/indexer.go
index 7edcb3aa6f..3078882258 100644
--- a/modules/indexer/issues/indexer.go
+++ b/modules/indexer/issues/indexer.go
@@ -8,6 +8,7 @@ import (
"fmt"
"os"
"runtime/pprof"
+ "strings"
"sync/atomic"
"time"
@@ -280,6 +281,33 @@ const (
SortByDeadlineAsc = internal.SortByDeadlineAsc
)
+// ParseSortBy parses the `sortBy` string and returns the associated `SortBy`
+// value, if one exists. Otherwise return `defaultSortBy`.
+func ParseSortBy(sortBy string, defaultSortBy internal.SortBy) internal.SortBy {
+ switch strings.ToLower(sortBy) {
+ case "relevance":
+ return SortByScore
+ case "latest":
+ return SortByCreatedDesc
+ case "oldest":
+ return SortByCreatedAsc
+ case "recentupdate":
+ return SortByUpdatedDesc
+ case "leastupdate":
+ return SortByUpdatedAsc
+ case "mostcomment":
+ return SortByCommentsDesc
+ case "leastcomment":
+ return SortByCommentsAsc
+ case "nearduedate":
+ return SortByDeadlineAsc
+ case "farduedate":
+ return SortByDeadlineDesc
+ default:
+ return defaultSortBy
+ }
+}
+
// SearchIssues search issues by options.
func SearchIssues(ctx context.Context, opts *SearchOptions) ([]int64, int64, error) {
indexer := *globalIndexer.Load()
diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go
index 6221681875..57fc4b2f17 100644
--- a/routers/api/v1/repo/issue.go
+++ b/routers/api/v1/repo/issue.go
@@ -397,6 +397,12 @@ func ListIssues(ctx *context.APIContext) {
// in: query
// description: page size of results
// type: integer
+ // - name: sort
+ // in: query
+ // description: Type of sort
+ // type: string
+ // enum: [relevance, latest, oldest, recentupdate, leastupdate, mostcomment, leastcomment, nearduedate, farduedate]
+ // default: latest
// responses:
// "200":
// "$ref": "#/responses/IssueList"
@@ -510,7 +516,7 @@ func ListIssues(ctx *context.APIContext) {
RepoIDs: []int64{ctx.Repo.Repository.ID},
IsPull: isPull,
IsClosed: isClosed,
- SortBy: issue_indexer.SortByCreatedDesc,
+ SortBy: issue_indexer.ParseSortBy(ctx.FormString("sort"), issue_indexer.SortByCreatedDesc),
}
if since != 0 {
searchOpt.UpdatedAfterUnix = optional.Some(since)
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index 36ed631207..4679a13fa3 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -8628,6 +8628,24 @@
"description": "page size of results",
"name": "limit",
"in": "query"
+ },
+ {
+ "enum": [
+ "relevance",
+ "latest",
+ "oldest",
+ "recentupdate",
+ "leastupdate",
+ "mostcomment",
+ "leastcomment",
+ "nearduedate",
+ "farduedate"
+ ],
+ "type": "string",
+ "default": "latest",
+ "description": "Type of sort",
+ "name": "sort",
+ "in": "query"
}
],
"responses": {
diff --git a/tests/integration/api_issue_test.go b/tests/integration/api_issue_test.go
index 4051f95ed9..2d3fd80c06 100644
--- a/tests/integration/api_issue_test.go
+++ b/tests/integration/api_issue_test.go
@@ -74,6 +74,50 @@ func TestAPIListIssues(t *testing.T) {
if assert.Len(t, apiIssues, 1) {
assert.EqualValues(t, 1, apiIssues[0].ID)
}
+
+ t.Run("Sort", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ link.RawQuery = url.Values{"token": {token}, "sort": {"oldest"}}.Encode()
+ resp = MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
+ DecodeJSON(t, resp, &apiIssues)
+ if assert.Len(t, apiIssues, 4) {
+ assert.EqualValues(t, 1, apiIssues[0].ID)
+ assert.EqualValues(t, 2, apiIssues[1].ID)
+ assert.EqualValues(t, 3, apiIssues[2].ID)
+ assert.EqualValues(t, 11, apiIssues[3].ID)
+ }
+
+ link.RawQuery = url.Values{"token": {token}, "sort": {"newest"}}.Encode()
+ resp = MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
+ DecodeJSON(t, resp, &apiIssues)
+ if assert.Len(t, apiIssues, 4) {
+ assert.EqualValues(t, 11, apiIssues[0].ID)
+ assert.EqualValues(t, 3, apiIssues[1].ID)
+ assert.EqualValues(t, 2, apiIssues[2].ID)
+ assert.EqualValues(t, 1, apiIssues[3].ID)
+ }
+
+ link.RawQuery = url.Values{"token": {token}, "sort": {"recentupdate"}}.Encode()
+ resp = MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
+ DecodeJSON(t, resp, &apiIssues)
+ if assert.Len(t, apiIssues, 4) {
+ assert.EqualValues(t, 11, apiIssues[0].ID)
+ assert.EqualValues(t, 1, apiIssues[1].ID)
+ assert.EqualValues(t, 2, apiIssues[2].ID)
+ assert.EqualValues(t, 3, apiIssues[3].ID)
+ }
+
+ link.RawQuery = url.Values{"token": {token}, "sort": {"leastupdate"}}.Encode()
+ resp = MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
+ DecodeJSON(t, resp, &apiIssues)
+ if assert.Len(t, apiIssues, 4) {
+ assert.EqualValues(t, 3, apiIssues[0].ID)
+ assert.EqualValues(t, 2, apiIssues[1].ID)
+ assert.EqualValues(t, 1, apiIssues[2].ID)
+ assert.EqualValues(t, 11, apiIssues[3].ID)
+ }
+ })
}
func TestAPIListIssuesPublicOnly(t *testing.T) {
From 3901ae6ab142aaa6db645a75459a6951272f935d Mon Sep 17 00:00:00 2001
From: Renovate Bot
Date: Mon, 17 Mar 2025 13:49:34 +0000
Subject: [PATCH 09/32] Update module
github.com/editorconfig/editorconfig-core-go/v2 to v2.6.3 (forgejo) (#7214)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7214
Reviewed-by: Gusted
Co-authored-by: Renovate Bot
Co-committed-by: Renovate Bot
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index eed74a4536..819b1ee351 100644
--- a/go.mod
+++ b/go.mod
@@ -33,7 +33,7 @@ require (
github.com/djherbis/nio/v3 v3.0.1
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707
github.com/dustin/go-humanize v1.0.1
- github.com/editorconfig/editorconfig-core-go/v2 v2.6.2
+ github.com/editorconfig/editorconfig-core-go/v2 v2.6.3
github.com/emersion/go-imap v1.2.1
github.com/felixge/fgprof v0.9.5
github.com/fsnotify/fsnotify v1.8.0
diff --git a/go.sum b/go.sum
index 4cf6d6e1e0..30fa071418 100644
--- a/go.sum
+++ b/go.sum
@@ -845,8 +845,8 @@ github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdf
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
-github.com/editorconfig/editorconfig-core-go/v2 v2.6.2 h1:dKG8sc7n321deIVRcQtwlMNoBEra7j0qQ8RwxO8RN0w=
-github.com/editorconfig/editorconfig-core-go/v2 v2.6.2/go.mod h1:7dvD3GCm7eBw53xZ/lsiq72LqobdMg3ITbMBxnmJmqY=
+github.com/editorconfig/editorconfig-core-go/v2 v2.6.3 h1:XVUp6qW3BIkmM3/1EkrHpa6bL56APOynfXcZEmIgOhs=
+github.com/editorconfig/editorconfig-core-go/v2 v2.6.3/go.mod h1:ThHVc+hqbUsmE1wmK/MASpQEhCleWu1JDJDNhUOMy0c=
github.com/elazarl/goproxy v1.4.0 h1:4GyuSbFa+s26+3rmYNSuUVsx+HgPrV1bk1jXI0l9wjM=
github.com/elazarl/goproxy v1.4.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ=
github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjTA=
From 736adbde23a553b1bf5dbec809fad4db4554fe13 Mon Sep 17 00:00:00 2001
From: Renovate Bot
Date: Mon, 17 Mar 2025 14:40:58 +0000
Subject: [PATCH 10/32] Update dependency eslint-import-resolver-typescript to
v4 (forgejo) (#7253) Co-authored-by: Renovate Bot
Co-committed-by: Renovate Bot
---
package-lock.json | 222 +++++++++++++++++++++++++++++++++++++++-------
package.json | 2 +-
2 files changed, 193 insertions(+), 31 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 9686148328..7da8bfd8b7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -73,7 +73,7 @@
"@vitest/eslint-plugin": "1.1.25",
"@vue/test-utils": "2.4.6",
"eslint": "9.22.0",
- "eslint-import-resolver-typescript": "3.8.7",
+ "eslint-import-resolver-typescript": "4.1.1",
"eslint-plugin-array-func": "5.0.2",
"eslint-plugin-import-x": "4.7.0",
"eslint-plugin-no-jquery": "3.1.1",
@@ -1690,16 +1690,6 @@
"node": ">= 8"
}
},
- "node_modules/@nolyfill/is-core-module": {
- "version": "1.0.39",
- "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
- "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.4.0"
- }
- },
"node_modules/@npmcli/fs": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz",
@@ -3429,6 +3419,163 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@unrs/rspack-resolver-binding-darwin-arm64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-darwin-arm64/-/rspack-resolver-binding-darwin-arm64-1.1.2.tgz",
+ "integrity": "sha512-bQx2L40UF5XxsXwkD26PzuspqUbUswWVbmclmUC+c83Cv/EFrFJ1JaZj5Q5jyYglKGOtyIWY/hXTCdWRN9vT0Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/rspack-resolver-binding-darwin-x64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-darwin-x64/-/rspack-resolver-binding-darwin-x64-1.1.2.tgz",
+ "integrity": "sha512-dMi9a7//BsuPTnhWEDxmdKZ6wxQlPnAob8VSjefGbKX/a+pHfTaX1pm/jv2VPdarP96IIjCKPatJS/TtLQeGQA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/rspack-resolver-binding-freebsd-x64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-freebsd-x64/-/rspack-resolver-binding-freebsd-x64-1.1.2.tgz",
+ "integrity": "sha512-RiBZQ+LSORQObfhV1yH7jGz+4sN3SDYtV53jgc8tUVvqdqVDaUm1KA3zHLffmoiYNGrYkE3sSreGC+FVpsB4Vg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@unrs/rspack-resolver-binding-linux-arm-gnueabihf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-linux-arm-gnueabihf/-/rspack-resolver-binding-linux-arm-gnueabihf-1.1.2.tgz",
+ "integrity": "sha512-IyKIFBtOvuPCJt1WPx9e9ovTGhZzrIbW11vWzw4aPmx3VShE+YcMpAldqQubdCep0UVKZyFt+2hQDQZwFiJ4jg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/rspack-resolver-binding-linux-arm64-gnu": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-linux-arm64-gnu/-/rspack-resolver-binding-linux-arm64-gnu-1.1.2.tgz",
+ "integrity": "sha512-RfYtlCtJrv5i6TO4dSlpbyOJX9Zbhmkqrr9hjDfr6YyE5KD0ywLRzw8UjXsohxG1XWgRpb2tvPuRYtURJwbqWg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/rspack-resolver-binding-linux-arm64-musl": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-linux-arm64-musl/-/rspack-resolver-binding-linux-arm64-musl-1.1.2.tgz",
+ "integrity": "sha512-MaITzkoqsn1Rm3+YnplubgAQEfOt+2jHfFvuFhXseUfcfbxe8Zyc3TM7LKwgv7mRVjIl+/yYN5JqL0cjbnhAnQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/rspack-resolver-binding-linux-x64-gnu": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-linux-x64-gnu/-/rspack-resolver-binding-linux-x64-gnu-1.1.2.tgz",
+ "integrity": "sha512-Nu981XmzQqis/uB3j4Gi3p5BYCd/zReU5zbJmjMrEH7IIRH0dxZpdOmS/+KwEk6ao7Xd8P2D2gDHpHD/QTp0aQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/rspack-resolver-binding-linux-x64-musl": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-linux-x64-musl/-/rspack-resolver-binding-linux-x64-musl-1.1.2.tgz",
+ "integrity": "sha512-xJupeDvaRpV0ADMuG1dY9jkOjhUzTqtykvchiU2NldSD+nafSUcMWnoqzNUx7HGiqbTMOw9d9xT8ZiFs+6ZFyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/rspack-resolver-binding-wasm32-wasi": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-wasm32-wasi/-/rspack-resolver-binding-wasm32-wasi-1.1.2.tgz",
+ "integrity": "sha512-un6X/xInks+KEgGpIHFV8BdoODHRohaDRvOwtjq+FXuoI4Ga0P6sLRvf4rPSZDvoMnqUhZtVNG0jG9oxOnrrLQ==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^0.2.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@unrs/rspack-resolver-binding-win32-arm64-msvc": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-win32-arm64-msvc/-/rspack-resolver-binding-win32-arm64-msvc-1.1.2.tgz",
+ "integrity": "sha512-2lCFkeT1HYUb/OOStBS1m67aZOf9BQxRA+Wf/xs94CGgzmoQt7H4V/BrkB/GSGKsudXjkiwt2oHNkHiowAS90A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/rspack-resolver-binding-win32-x64-msvc": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-win32-x64-msvc/-/rspack-resolver-binding-win32-x64-msvc-1.1.2.tgz",
+ "integrity": "sha512-EYfya5HCQ/8Yfy7rvAAX2rGytu81+d/CIhNCbZfNKLQ690/qFsdEeTXRsMQW1afHoluMM50PsjPYu8ndy8fSQg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
"node_modules/@vitejs/plugin-vue": {
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.5.tgz",
@@ -6609,22 +6756,21 @@
}
},
"node_modules/eslint-import-resolver-typescript": {
- "version": "3.8.7",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.7.tgz",
- "integrity": "sha512-U7k84gOzrfl09c33qrIbD3TkWTWu3nt3dK5sDajHSekfoLlYGusIwSdPlPzVeA6TFpi0Wpj+ZdBD8hX4hxPoww==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.1.1.tgz",
+ "integrity": "sha512-91As8PwH6xjPwndAbvhTuZ3DUfdl4HttocWRyaLOd5T4uUo6km8EDO7Sve4jzH50V1wbgql2nOFbE3GGfARJag==",
"dev": true,
"license": "ISC",
"dependencies": {
- "@nolyfill/is-core-module": "1.0.39",
- "debug": "^4.3.7",
- "enhanced-resolve": "^5.15.0",
+ "debug": "^4.4.0",
"get-tsconfig": "^4.10.0",
- "is-bun-module": "^1.0.2",
- "stable-hash": "^0.0.4",
+ "is-bun-module": "^1.3.0",
+ "rspack-resolver": "^1.1.2",
+ "stable-hash": "^0.0.5",
"tinyglobby": "^0.2.12"
},
"engines": {
- "node": "^14.18.0 || >=16.0.0"
+ "node": "^16.17.0 || >=18.6.0"
},
"funding": {
"url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts"
@@ -6683,13 +6829,6 @@
"eslint": "^8.57.0 || ^9.0.0"
}
},
- "node_modules/eslint-plugin-import-x/node_modules/stable-hash": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
- "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/eslint-plugin-no-jquery": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
@@ -12172,6 +12311,29 @@
"points-on-path": "^0.2.1"
}
},
+ "node_modules/rspack-resolver": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/rspack-resolver/-/rspack-resolver-1.1.2.tgz",
+ "integrity": "sha512-eHhz+9JWHFdbl/CVVqEP6kviLFZqw1s0MWxLdsGMtUKUspSO3SERptPohmrUIC9jT1bGV9Bd3+r8AmWbdfNAzQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/JounQin"
+ },
+ "optionalDependencies": {
+ "@unrs/rspack-resolver-binding-darwin-arm64": "1.1.2",
+ "@unrs/rspack-resolver-binding-darwin-x64": "1.1.2",
+ "@unrs/rspack-resolver-binding-freebsd-x64": "1.1.2",
+ "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": "1.1.2",
+ "@unrs/rspack-resolver-binding-linux-arm64-gnu": "1.1.2",
+ "@unrs/rspack-resolver-binding-linux-arm64-musl": "1.1.2",
+ "@unrs/rspack-resolver-binding-linux-x64-gnu": "1.1.2",
+ "@unrs/rspack-resolver-binding-linux-x64-musl": "1.1.2",
+ "@unrs/rspack-resolver-binding-wasm32-wasi": "1.1.2",
+ "@unrs/rspack-resolver-binding-win32-arm64-msvc": "1.1.2",
+ "@unrs/rspack-resolver-binding-win32-x64-msvc": "1.1.2"
+ }
+ },
"node_modules/run-con": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz",
@@ -12778,9 +12940,9 @@
}
},
"node_modules/stable-hash": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz",
- "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==",
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
+ "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
"dev": true,
"license": "MIT"
},
diff --git a/package.json b/package.json
index 6046307ab4..b63072e835 100644
--- a/package.json
+++ b/package.json
@@ -72,7 +72,7 @@
"@vitest/eslint-plugin": "1.1.25",
"@vue/test-utils": "2.4.6",
"eslint": "9.22.0",
- "eslint-import-resolver-typescript": "3.8.7",
+ "eslint-import-resolver-typescript": "4.1.1",
"eslint-plugin-array-func": "5.0.2",
"eslint-plugin-import-x": "4.7.0",
"eslint-plugin-no-jquery": "3.1.1",
From 2b79c236861b4a5f0e42a51b1c582e894f19b008 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Mon, 17 Mar 2025 14:52:31 +0000
Subject: [PATCH 11/32] chore: add `@vitejs/plugin-vue` to renovate automerge
(#7252)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7252
Reviewed-by: Michael Kriese
Co-authored-by: Gusted
Co-committed-by: Gusted
---
renovate.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/renovate.json b/renovate.json
index 7efe4123b0..f3fcd3d5fc 100644
--- a/renovate.json
+++ b/renovate.json
@@ -148,7 +148,8 @@
"mvdan.cc/gofumpt",
"updates",
"vite-string-plugin",
- "@vue/test-utils"
+ "@vue/test-utils",
+ "@vitejs/plugin-vue"
],
"automerge": true
},
From d40ff8c1c1d226700a14931376dcdd024519c42e Mon Sep 17 00:00:00 2001
From: Renovate Bot
Date: Mon, 17 Mar 2025 15:53:54 +0000
Subject: [PATCH 12/32] Update dependency @vitejs/plugin-vue to v5.2.3
(forgejo) (#7248)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#readme) ([source](https://github.com/vitejs/vite-plugin-vue/tree/HEAD/packages/plugin-vue)) | devDependencies | minor | [`5.1.5` -> `5.2.3`](https://renovatebot.com/diffs/npm/@vitejs%2fplugin-vue/5.1.5/5.2.3) |
---
### Release Notes
vitejs/vite-plugin-vue (@vitejs/plugin-vue)
### [`v5.2.3`](https://github.com/vitejs/vite-plugin-vue/blob/HEAD/packages/plugin-vue/CHANGELOG.md#small523-2025-03-17-small)
- Revert "fix: generate unique component id" ([#548](https://github.com/vitejs/vite-plugin-vue/issues/548)) ([4bc5517](https://github.com/vitejs/vite-plugin-vue/commit/4bc5517)), closes [#548](https://github.com/vitejs/vite-plugin-vue/issues/548)
### [`v5.2.2`](https://github.com/vitejs/vite-plugin-vue/blob/HEAD/packages/plugin-vue/CHANGELOG.md#small522-2025-03-17-small)
- feat: pass descriptor vapor flag to compileTemplte ([219e007](https://github.com/vitejs/vite-plugin-vue/commit/219e007))
- feat(css): tree shake scoped styles ([#533](https://github.com/vitejs/vite-plugin-vue/issues/533)) ([333094f](https://github.com/vitejs/vite-plugin-vue/commit/333094f)), closes [#533](https://github.com/vitejs/vite-plugin-vue/issues/533)
- fix: generate unique component id ([#538](https://github.com/vitejs/vite-plugin-vue/issues/538)) ([2704e85](https://github.com/vitejs/vite-plugin-vue/commit/2704e85)), closes [#538](https://github.com/vitejs/vite-plugin-vue/issues/538)
- fix: properly interpret boolean values in `define` ([#545](https://github.com/vitejs/vite-plugin-vue/issues/545)) ([46d3d65](https://github.com/vitejs/vite-plugin-vue/commit/46d3d65)), closes [#545](https://github.com/vitejs/vite-plugin-vue/issues/545)
- fix(deps): update all non-major dependencies ([#482](https://github.com/vitejs/vite-plugin-vue/issues/482)) ([cdbae68](https://github.com/vitejs/vite-plugin-vue/commit/cdbae68)), closes [#482](https://github.com/vitejs/vite-plugin-vue/issues/482)
- fix(deps): update all non-major dependencies ([#488](https://github.com/vitejs/vite-plugin-vue/issues/488)) ([5d39582](https://github.com/vitejs/vite-plugin-vue/commit/5d39582)), closes [#488](https://github.com/vitejs/vite-plugin-vue/issues/488)
- fix(index): move the if check earlier to avoid creating unnecessary ssr when entering return block ( ([2135c84](https://github.com/vitejs/vite-plugin-vue/commit/2135c84)), closes [#523](https://github.com/vitejs/vite-plugin-vue/issues/523)
- fix(plugin-vue): default value for compile time flags ([#495](https://github.com/vitejs/vite-plugin-vue/issues/495)) ([ae9d948](https://github.com/vitejs/vite-plugin-vue/commit/ae9d948)), closes [#495](https://github.com/vitejs/vite-plugin-vue/issues/495)
- fix(plugin-vue): ensure HMR updates styles when SFC is treated as a type dependency ([#541](https://github.com/vitejs/vite-plugin-vue/issues/541)) ([4abe3be](https://github.com/vitejs/vite-plugin-vue/commit/4abe3be)), closes [#541](https://github.com/vitejs/vite-plugin-vue/issues/541)
- fix(plugin-vue): resolve sourcemap conflicts in build watch mode with cached modules ([#505](https://github.com/vitejs/vite-plugin-vue/issues/505)) ([906cebb](https://github.com/vitejs/vite-plugin-vue/commit/906cebb)), closes [#505](https://github.com/vitejs/vite-plugin-vue/issues/505)
- fix(plugin-vue): support external import URLs for monorepos ([#524](https://github.com/vitejs/vite-plugin-vue/issues/524)) ([cdd4922](https://github.com/vitejs/vite-plugin-vue/commit/cdd4922)), closes [#524](https://github.com/vitejs/vite-plugin-vue/issues/524)
- fix(plugin-vue): support vapor template-only component ([#529](https://github.com/vitejs/vite-plugin-vue/issues/529)) ([95be153](https://github.com/vitejs/vite-plugin-vue/commit/95be153)), closes [#529](https://github.com/vitejs/vite-plugin-vue/issues/529)
- fix(plugin-vue): suppress warnings for non-recognized pseudo selectors form lightningcss ([#521](https://github.com/vitejs/vite-plugin-vue/issues/521)) ([15c0eb0](https://github.com/vitejs/vite-plugin-vue/commit/15c0eb0)), closes [#521](https://github.com/vitejs/vite-plugin-vue/issues/521)
- chore(deps): update dependency rollup to ^4.27.4 ([#479](https://github.com/vitejs/vite-plugin-vue/issues/479)) ([428320d](https://github.com/vitejs/vite-plugin-vue/commit/428320d)), closes [#479](https://github.com/vitejs/vite-plugin-vue/issues/479)
- chore(deps): update dependency rollup to ^4.28.1 ([#484](https://github.com/vitejs/vite-plugin-vue/issues/484)) ([388403f](https://github.com/vitejs/vite-plugin-vue/commit/388403f)), closes [#484](https://github.com/vitejs/vite-plugin-vue/issues/484)
- chore(deps): update dependency rollup to ^4.29.1 ([#493](https://github.com/vitejs/vite-plugin-vue/issues/493)) ([b092bc8](https://github.com/vitejs/vite-plugin-vue/commit/b092bc8)), closes [#493](https://github.com/vitejs/vite-plugin-vue/issues/493)
- chore(deps): update upstream ([#503](https://github.com/vitejs/vite-plugin-vue/issues/503)) ([8c12b9f](https://github.com/vitejs/vite-plugin-vue/commit/8c12b9f)), closes [#503](https://github.com/vitejs/vite-plugin-vue/issues/503)
- chore(deps): update upstream ([#511](https://github.com/vitejs/vite-plugin-vue/issues/511)) ([d057351](https://github.com/vitejs/vite-plugin-vue/commit/d057351)), closes [#511](https://github.com/vitejs/vite-plugin-vue/issues/511)
- chore(deps): update upstream ([#526](https://github.com/vitejs/vite-plugin-vue/issues/526)) ([59946d3](https://github.com/vitejs/vite-plugin-vue/commit/59946d3)), closes [#526](https://github.com/vitejs/vite-plugin-vue/issues/526)
- chore(plugin-vue): simplify `resolved` declaration ([7288a59](https://github.com/vitejs/vite-plugin-vue/commit/7288a59))
### [`v5.2.1`](https://github.com/vitejs/vite-plugin-vue/blob/HEAD/packages/plugin-vue/CHANGELOG.md#small521-2024-11-26-small)
- chore: add vite 6 peer dep ([#481](https://github.com/vitejs/vite-plugin-vue/issues/481)) ([4288652](https://github.com/vitejs/vite-plugin-vue/commit/4288652)), closes [#481](https://github.com/vitejs/vite-plugin-vue/issues/481)
- chore: fix lint ([378aea3](https://github.com/vitejs/vite-plugin-vue/commit/378aea3))
- chore(deps): update dependency rollup to ^4.27.2 ([#476](https://github.com/vitejs/vite-plugin-vue/issues/476)) ([b2df95e](https://github.com/vitejs/vite-plugin-vue/commit/b2df95e)), closes [#476](https://github.com/vitejs/vite-plugin-vue/issues/476)
### [`v5.2.0`](https://github.com/vitejs/vite-plugin-vue/blob/HEAD/packages/plugin-vue/CHANGELOG.md#520-2024-11-13)
- feat: add a feature option to support custom component id generator ([#461](https://github.com/vitejs/vite-plugin-vue/issues/461)) ([7a1fc4c](https://github.com/vitejs/vite-plugin-vue/commit/7a1fc4c)), closes [#461](https://github.com/vitejs/vite-plugin-vue/issues/461)
---
### Configuration
📅 **Schedule**: Branch creation - "* 0-3 * * *" (UTC), Automerge - "* 0-3 * * *" (UTC).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [x] If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7248
Reviewed-by: Gusted
Co-authored-by: Renovate Bot
Co-committed-by: Renovate Bot
---
package-lock.json | 10 +++++-----
package.json | 2 +-
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 7da8bfd8b7..5f83e7c923 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -68,7 +68,7 @@
"@stylistic/eslint-plugin-js": "4.2.0",
"@stylistic/stylelint-plugin": "3.1.2",
"@typescript-eslint/parser": "8.26.1",
- "@vitejs/plugin-vue": "5.1.5",
+ "@vitejs/plugin-vue": "5.2.3",
"@vitest/coverage-v8": "3.0.8",
"@vitest/eslint-plugin": "1.1.25",
"@vue/test-utils": "2.4.6",
@@ -3577,16 +3577,16 @@
]
},
"node_modules/@vitejs/plugin-vue": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.5.tgz",
- "integrity": "sha512-dlnib73G05CDBAUR/YpuZcQQ47fpjihnnNouAAqN62z+oqSsWJ+kh52GRzIxpkgFG3q11eXK7Di7RMmoCwISZA==",
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.3.tgz",
+ "integrity": "sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^18.0.0 || >=20.0.0"
},
"peerDependencies": {
- "vite": "^5.0.0",
+ "vite": "^5.0.0 || ^6.0.0",
"vue": "^3.2.25"
}
},
diff --git a/package.json b/package.json
index b63072e835..db5fbbc431 100644
--- a/package.json
+++ b/package.json
@@ -67,7 +67,7 @@
"@stylistic/eslint-plugin-js": "4.2.0",
"@stylistic/stylelint-plugin": "3.1.2",
"@typescript-eslint/parser": "8.26.1",
- "@vitejs/plugin-vue": "5.1.5",
+ "@vitejs/plugin-vue": "5.2.3",
"@vitest/coverage-v8": "3.0.8",
"@vitest/eslint-plugin": "1.1.25",
"@vue/test-utils": "2.4.6",
From 83e186c00cd71c7acd3e9970f79770dbbf25cdf4 Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Mon, 17 Mar 2025 16:25:37 +0000
Subject: [PATCH 13/32] fix: discard v25 secrets migrations errors instead of
failing (#7251)
Failing the migration when a corrupted record is found is problematic because there is no transaction and the database may need to be restored from a backup to attempt the migration again, after deleting the corrupted records.
Each documented case of failed migration was resolved by removing the corrupted records. There is no instance of a failed migration that was caused by non corrupted record.
In the unlikely event of a false negative where a two_factor record is discarded although it is in use, the only consequence is that the user will have to enroll again. Detailed logs are displayed so the Forgejo admin can file a bug report if that happens.
Refs: https://codeberg.org/forgejo/forgejo/issues/6637
## Release notes
- Bug fixes
- [PR](https://codeberg.org/forgejo/forgejo/pulls/7251): When migrating to Forgejo v10, the TOTP secrets found to be corrupted are now transparently removed from the database instead of failing the migration. TOTP is no longer required to login with the associated users. They should be informed because they will need to visit their security settings and configure TOTP again. No other action is required.
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7251
Reviewed-by: Gusted
Co-authored-by: Earl Warren
Co-committed-by: Earl Warren
---
models/forgejo_migrations/v25.go | 27 ++++++++++++++++---
models/forgejo_migrations/v25_test.go | 6 ++++-
.../two_factor.yml | 9 +++++++
release-notes/7251.md | 1 +
4 files changed, 39 insertions(+), 4 deletions(-)
create mode 100644 release-notes/7251.md
diff --git a/models/forgejo_migrations/v25.go b/models/forgejo_migrations/v25.go
index e2316007cf..5e3dff80b3 100644
--- a/models/forgejo_migrations/v25.go
+++ b/models/forgejo_migrations/v25.go
@@ -7,9 +7,11 @@ import (
"context"
"crypto/md5"
"encoding/base64"
+ "fmt"
"code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/db"
+ "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/secret"
"code.gitea.io/gitea/modules/setting"
@@ -57,19 +59,38 @@ func MigrateTwoFactorToKeying(x *xorm.Engine) error {
oldEncryptionKey := md5.Sum([]byte(setting.SecretKey))
- return db.Iterate(context.Background(), nil, func(ctx context.Context, bean *auth.TwoFactor) error {
+ messages := make([]string, 0, 100)
+ ids := make([]int64, 0, 100)
+
+ err = db.Iterate(context.Background(), nil, func(ctx context.Context, bean *auth.TwoFactor) error {
decodedStoredSecret, err := base64.StdEncoding.DecodeString(string(bean.Secret))
if err != nil {
- return err
+ messages = append(messages, fmt.Sprintf("two_factor.id=%d, two_factor.uid=%d: base64.StdEncoding.DecodeString: %v", bean.ID, bean.UID, err))
+ ids = append(ids, bean.ID)
+ return nil
}
secretBytes, err := secret.AesDecrypt(oldEncryptionKey[:], decodedStoredSecret)
if err != nil {
- return err
+ messages = append(messages, fmt.Sprintf("two_factor.id=%d, two_factor.uid=%d: secret.AesDecrypt: %v", bean.ID, bean.UID, err))
+ ids = append(ids, bean.ID)
+ return nil
}
bean.SetSecret(string(secretBytes))
_, err = db.GetEngine(ctx).Cols("secret").ID(bean.ID).Update(bean)
return err
})
+ if err == nil {
+ if len(ids) > 0 {
+ log.Error("Forgejo migration[25]: The following TOTP secrets were found to be corrupted and removed from the database. TOTP is no longer required to login with the associated users. They should be informed because they will need to visit their security settings and configure TOTP again. No other action is required. See https://codeberg.org/forgejo/forgejo/issues/6637 for more context on the various causes for such a corruption.")
+ for _, message := range messages {
+ log.Error("Forgejo migration[25]: %s", message)
+ }
+
+ _, err = db.GetEngine(context.Background()).In("id", ids).NoAutoCondition().NoAutoTime().Delete(&auth.TwoFactor{})
+ }
+ }
+
+ return err
}
diff --git a/models/forgejo_migrations/v25_test.go b/models/forgejo_migrations/v25_test.go
index 43c5885c39..73b97f7a35 100644
--- a/models/forgejo_migrations/v25_test.go
+++ b/models/forgejo_migrations/v25_test.go
@@ -36,10 +36,14 @@ func Test_MigrateTwoFactorToKeying(t *testing.T) {
cnt, err := x.Table("two_factor").Count()
require.NoError(t, err)
- assert.EqualValues(t, 1, cnt)
+ assert.EqualValues(t, 2, cnt)
require.NoError(t, MigrateTwoFactorToKeying(x))
+ cnt, err = x.Table("two_factor").Count()
+ require.NoError(t, err)
+ assert.EqualValues(t, 1, cnt)
+
var twofactor auth.TwoFactor
_, err = x.Table("two_factor").ID(1).Get(&twofactor)
require.NoError(t, err)
diff --git a/models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml b/models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml
index ef6c158659..91aa420340 100644
--- a/models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml
+++ b/models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml
@@ -7,3 +7,12 @@
last_used_passcode:
created_unix: 1564253724
updated_unix: 1564253724
+-
+ id: 2
+ uid: 23
+ secret: badbad
+ scratch_salt: badbad
+ scratch_hash: badbad
+ last_used_passcode:
+ created_unix: 1564253724
+ updated_unix: 1564253724
diff --git a/release-notes/7251.md b/release-notes/7251.md
new file mode 100644
index 0000000000..9c35603981
--- /dev/null
+++ b/release-notes/7251.md
@@ -0,0 +1 @@
+When migrating from a Forgejo version lower than v10, the TOTP secrets found to be corrupted are now transparently removed from the database instead of failing the migration. TOTP is no longer required to login with the associated users. They should be informed because they will need to visit their security settings and configure TOTP again. No other action is required.
From 9786982c6eff6e80bb7cb7b6d9eed48e84c755b6 Mon Sep 17 00:00:00 2001
From: Renovate Bot
Date: Mon, 17 Mar 2025 19:57:41 +0000
Subject: [PATCH 14/32] Lock file maintenance (forgejo) (#7247)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7247
Reviewed-by: Gusted
Co-authored-by: Renovate Bot
Co-committed-by: Renovate Bot
---
package-lock.json | 420 ++++++++++++++---------------
web_src/fomantic/package-lock.json | 12 +-
2 files changed, 216 insertions(+), 216 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 5f83e7c923..3154368ccf 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -216,12 +216,12 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.26.9",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz",
- "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz",
+ "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.26.9"
+ "@babel/types": "^7.26.10"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -231,9 +231,9 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.26.9",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz",
- "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz",
+ "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==",
"license": "MIT",
"dependencies": {
"regenerator-runtime": "^0.14.0"
@@ -243,9 +243,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.26.9",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz",
- "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz",
+ "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.25.9",
@@ -562,9 +562,9 @@
}
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz",
- "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz",
+ "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==",
"cpu": [
"ppc64"
],
@@ -578,9 +578,9 @@
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz",
- "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz",
+ "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==",
"cpu": [
"arm"
],
@@ -594,9 +594,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz",
- "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz",
+ "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==",
"cpu": [
"arm64"
],
@@ -610,9 +610,9 @@
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz",
- "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz",
+ "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==",
"cpu": [
"x64"
],
@@ -626,9 +626,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz",
- "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz",
+ "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==",
"cpu": [
"arm64"
],
@@ -642,9 +642,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz",
- "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz",
+ "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==",
"cpu": [
"x64"
],
@@ -658,9 +658,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz",
- "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==",
"cpu": [
"arm64"
],
@@ -674,9 +674,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz",
- "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz",
+ "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==",
"cpu": [
"x64"
],
@@ -690,9 +690,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz",
- "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz",
+ "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==",
"cpu": [
"arm"
],
@@ -706,9 +706,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz",
- "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz",
+ "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==",
"cpu": [
"arm64"
],
@@ -722,9 +722,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz",
- "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz",
+ "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==",
"cpu": [
"ia32"
],
@@ -738,9 +738,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz",
- "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz",
+ "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==",
"cpu": [
"loong64"
],
@@ -754,9 +754,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz",
- "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz",
+ "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==",
"cpu": [
"mips64el"
],
@@ -770,9 +770,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz",
- "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz",
+ "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==",
"cpu": [
"ppc64"
],
@@ -786,9 +786,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz",
- "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz",
+ "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==",
"cpu": [
"riscv64"
],
@@ -802,9 +802,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz",
- "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz",
+ "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==",
"cpu": [
"s390x"
],
@@ -818,9 +818,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz",
- "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz",
+ "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==",
"cpu": [
"x64"
],
@@ -834,9 +834,9 @@
}
},
"node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz",
- "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==",
"cpu": [
"arm64"
],
@@ -850,9 +850,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz",
- "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz",
+ "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==",
"cpu": [
"x64"
],
@@ -866,9 +866,9 @@
}
},
"node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz",
- "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==",
"cpu": [
"arm64"
],
@@ -882,9 +882,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz",
- "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz",
+ "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==",
"cpu": [
"x64"
],
@@ -898,9 +898,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz",
- "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz",
+ "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==",
"cpu": [
"x64"
],
@@ -914,9 +914,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz",
- "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz",
+ "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==",
"cpu": [
"arm64"
],
@@ -930,9 +930,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz",
- "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz",
+ "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==",
"cpu": [
"ia32"
],
@@ -946,9 +946,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz",
- "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz",
+ "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==",
"cpu": [
"x64"
],
@@ -982,9 +982,9 @@
}
},
"node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
- "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz",
+ "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1960,9 +1960,9 @@
"license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz",
- "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz",
+ "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==",
"cpu": [
"arm"
],
@@ -1974,9 +1974,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz",
- "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz",
+ "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==",
"cpu": [
"arm64"
],
@@ -1988,9 +1988,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz",
- "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz",
+ "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==",
"cpu": [
"arm64"
],
@@ -2002,9 +2002,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz",
- "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz",
+ "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==",
"cpu": [
"x64"
],
@@ -2016,9 +2016,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz",
- "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz",
+ "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==",
"cpu": [
"arm64"
],
@@ -2030,9 +2030,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz",
- "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz",
+ "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==",
"cpu": [
"x64"
],
@@ -2044,9 +2044,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz",
- "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz",
+ "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==",
"cpu": [
"arm"
],
@@ -2058,9 +2058,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz",
- "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz",
+ "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==",
"cpu": [
"arm"
],
@@ -2072,9 +2072,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz",
- "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz",
+ "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==",
"cpu": [
"arm64"
],
@@ -2086,9 +2086,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz",
- "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz",
+ "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==",
"cpu": [
"arm64"
],
@@ -2100,9 +2100,9 @@
]
},
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz",
- "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz",
+ "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==",
"cpu": [
"loong64"
],
@@ -2114,9 +2114,9 @@
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz",
- "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz",
+ "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==",
"cpu": [
"ppc64"
],
@@ -2128,9 +2128,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz",
- "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz",
+ "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==",
"cpu": [
"riscv64"
],
@@ -2142,9 +2142,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz",
- "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz",
+ "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==",
"cpu": [
"s390x"
],
@@ -2156,9 +2156,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz",
- "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz",
+ "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==",
"cpu": [
"x64"
],
@@ -2170,9 +2170,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz",
- "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz",
+ "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==",
"cpu": [
"x64"
],
@@ -2184,9 +2184,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz",
- "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz",
+ "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==",
"cpu": [
"arm64"
],
@@ -2198,9 +2198,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz",
- "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz",
+ "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==",
"cpu": [
"ia32"
],
@@ -2212,9 +2212,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz",
- "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz",
+ "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==",
"cpu": [
"x64"
],
@@ -4705,9 +4705,9 @@
}
},
"node_modules/cacheable/node_modules/keyv": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.1.tgz",
- "integrity": "sha512-13hQT2q2VIwOoaJdJa7nY3J8UVbYtMTJFHnwm9LI+SaQRfUiM6Em9KZeOVTCKbMnGcRIL3NSUFpAdjZCq24nLQ==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.2.tgz",
+ "integrity": "sha512-Lji2XRxqqa5Wg+CHLVfFKBImfJZ4pCSccu9eVWK6w4c2SDFLd8JAn1zqTuSFnsxb7ope6rMsnIHfp+eBbRBRZQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4783,9 +4783,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001703",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz",
- "integrity": "sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==",
+ "version": "1.0.30001705",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz",
+ "integrity": "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg==",
"funding": [
{
"type": "opencollective",
@@ -6314,9 +6314,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.113",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.113.tgz",
- "integrity": "sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==",
+ "version": "1.5.119",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.119.tgz",
+ "integrity": "sha512-Ku4NMzUjz3e3Vweh7PhApPrZSS4fyiCIbcIrG9eKrriYVLmbMepETR/v6SU7xPm98QTqMSYiCwfO89QNjXLkbQ==",
"license": "ISC"
},
"node_modules/emoji-regex": {
@@ -6565,9 +6565,9 @@
}
},
"node_modules/esbuild": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz",
- "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz",
+ "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
@@ -6577,31 +6577,31 @@
"node": ">=18"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.0",
- "@esbuild/android-arm": "0.25.0",
- "@esbuild/android-arm64": "0.25.0",
- "@esbuild/android-x64": "0.25.0",
- "@esbuild/darwin-arm64": "0.25.0",
- "@esbuild/darwin-x64": "0.25.0",
- "@esbuild/freebsd-arm64": "0.25.0",
- "@esbuild/freebsd-x64": "0.25.0",
- "@esbuild/linux-arm": "0.25.0",
- "@esbuild/linux-arm64": "0.25.0",
- "@esbuild/linux-ia32": "0.25.0",
- "@esbuild/linux-loong64": "0.25.0",
- "@esbuild/linux-mips64el": "0.25.0",
- "@esbuild/linux-ppc64": "0.25.0",
- "@esbuild/linux-riscv64": "0.25.0",
- "@esbuild/linux-s390x": "0.25.0",
- "@esbuild/linux-x64": "0.25.0",
- "@esbuild/netbsd-arm64": "0.25.0",
- "@esbuild/netbsd-x64": "0.25.0",
- "@esbuild/openbsd-arm64": "0.25.0",
- "@esbuild/openbsd-x64": "0.25.0",
- "@esbuild/sunos-x64": "0.25.0",
- "@esbuild/win32-arm64": "0.25.0",
- "@esbuild/win32-ia32": "0.25.0",
- "@esbuild/win32-x64": "0.25.0"
+ "@esbuild/aix-ppc64": "0.25.1",
+ "@esbuild/android-arm": "0.25.1",
+ "@esbuild/android-arm64": "0.25.1",
+ "@esbuild/android-x64": "0.25.1",
+ "@esbuild/darwin-arm64": "0.25.1",
+ "@esbuild/darwin-x64": "0.25.1",
+ "@esbuild/freebsd-arm64": "0.25.1",
+ "@esbuild/freebsd-x64": "0.25.1",
+ "@esbuild/linux-arm": "0.25.1",
+ "@esbuild/linux-arm64": "0.25.1",
+ "@esbuild/linux-ia32": "0.25.1",
+ "@esbuild/linux-loong64": "0.25.1",
+ "@esbuild/linux-mips64el": "0.25.1",
+ "@esbuild/linux-ppc64": "0.25.1",
+ "@esbuild/linux-riscv64": "0.25.1",
+ "@esbuild/linux-s390x": "0.25.1",
+ "@esbuild/linux-x64": "0.25.1",
+ "@esbuild/netbsd-arm64": "0.25.1",
+ "@esbuild/netbsd-x64": "0.25.1",
+ "@esbuild/openbsd-arm64": "0.25.1",
+ "@esbuild/openbsd-x64": "0.25.1",
+ "@esbuild/sunos-x64": "0.25.1",
+ "@esbuild/win32-arm64": "0.25.1",
+ "@esbuild/win32-ia32": "0.25.1",
+ "@esbuild/win32-x64": "0.25.1"
}
},
"node_modules/esbuild-loader": {
@@ -8046,9 +8046,9 @@
}
},
"node_modules/hookified": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.7.1.tgz",
- "integrity": "sha512-OXcdHsXeOiD7OJ5zvWj8Oy/6RCdLwntAX+wUrfemNcMGn6sux4xbEHi2QXwqePYhjQ/yvxxq2MvCRirdlHscBw==",
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.8.1.tgz",
+ "integrity": "sha512-GrO2l93P8xCWBSTBX9l2BxI78VU/MAAYag+pG8curS3aBGy0++ZlxrQ7PdUOUVMbn5BwkGb6+eRrnf43ipnFEA==",
"dev": true,
"license": "MIT"
},
@@ -10597,9 +10597,9 @@
}
},
"node_modules/nanoid": {
- "version": "3.3.9",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz",
- "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==",
+ "version": "3.3.10",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.10.tgz",
+ "integrity": "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==",
"funding": [
{
"type": "github",
@@ -14895,9 +14895,9 @@
}
},
"node_modules/vite/node_modules/rollup": {
- "version": "4.35.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz",
- "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.36.0.tgz",
+ "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -14911,25 +14911,25 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.35.0",
- "@rollup/rollup-android-arm64": "4.35.0",
- "@rollup/rollup-darwin-arm64": "4.35.0",
- "@rollup/rollup-darwin-x64": "4.35.0",
- "@rollup/rollup-freebsd-arm64": "4.35.0",
- "@rollup/rollup-freebsd-x64": "4.35.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.35.0",
- "@rollup/rollup-linux-arm-musleabihf": "4.35.0",
- "@rollup/rollup-linux-arm64-gnu": "4.35.0",
- "@rollup/rollup-linux-arm64-musl": "4.35.0",
- "@rollup/rollup-linux-loongarch64-gnu": "4.35.0",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.35.0",
- "@rollup/rollup-linux-s390x-gnu": "4.35.0",
- "@rollup/rollup-linux-x64-gnu": "4.35.0",
- "@rollup/rollup-linux-x64-musl": "4.35.0",
- "@rollup/rollup-win32-arm64-msvc": "4.35.0",
- "@rollup/rollup-win32-ia32-msvc": "4.35.0",
- "@rollup/rollup-win32-x64-msvc": "4.35.0",
+ "@rollup/rollup-android-arm-eabi": "4.36.0",
+ "@rollup/rollup-android-arm64": "4.36.0",
+ "@rollup/rollup-darwin-arm64": "4.36.0",
+ "@rollup/rollup-darwin-x64": "4.36.0",
+ "@rollup/rollup-freebsd-arm64": "4.36.0",
+ "@rollup/rollup-freebsd-x64": "4.36.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.36.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.36.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.36.0",
+ "@rollup/rollup-linux-arm64-musl": "4.36.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.36.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.36.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.36.0",
+ "@rollup/rollup-linux-x64-gnu": "4.36.0",
+ "@rollup/rollup-linux-x64-musl": "4.36.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.36.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.36.0",
+ "@rollup/rollup-win32-x64-msvc": "4.36.0",
"fsevents": "~2.3.2"
}
},
diff --git a/web_src/fomantic/package-lock.json b/web_src/fomantic/package-lock.json
index b42eaf66a7..1612636096 100644
--- a/web_src/fomantic/package-lock.json
+++ b/web_src/fomantic/package-lock.json
@@ -1249,9 +1249,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001703",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz",
- "integrity": "sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==",
+ "version": "1.0.30001705",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz",
+ "integrity": "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg==",
"funding": [
{
"type": "opencollective",
@@ -2005,9 +2005,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.113",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.113.tgz",
- "integrity": "sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==",
+ "version": "1.5.119",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.119.tgz",
+ "integrity": "sha512-Ku4NMzUjz3e3Vweh7PhApPrZSS4fyiCIbcIrG9eKrriYVLmbMepETR/v6SU7xPm98QTqMSYiCwfO89QNjXLkbQ==",
"license": "ISC"
},
"node_modules/emoji-regex": {
From e2aa9adad75e18c7f4fa7816bdd4acb615d4d45d Mon Sep 17 00:00:00 2001
From: Gusted
Date: Mon, 17 Mar 2025 20:03:24 +0000
Subject: [PATCH 15/32] feat(api): add more sorting to own repository list
(#7256)
- Add more sorting options, by leveraging the existing `repo_model.OrderByFlatMap` map, to the `/api/v1/user/repos` endpoint.
- Swagger has been updated.
- Add (non-exhaustive) integration testing.
- Ref: gitnex/GitNex#1266
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7256
Reviewed-by: Earl Warren
Co-authored-by: Gusted
Co-committed-by: Gusted
---
routers/api/v1/user/repo.go | 14 ++++----
templates/swagger/v1_json.tmpl | 22 +++++++++++-
tests/integration/api_repo_test.go | 55 ++++++++++++++++++++++++++++++
3 files changed, 84 insertions(+), 7 deletions(-)
diff --git a/routers/api/v1/user/repo.go b/routers/api/v1/user/repo.go
index 3b0654ef13..7df13ee413 100644
--- a/routers/api/v1/user/repo.go
+++ b/routers/api/v1/user/repo.go
@@ -101,8 +101,9 @@ func ListMyRepos(ctx *context.APIContext) {
// type: integer
// - name: order_by
// in: query
- // description: order the repositories by name (default), id, or size
+ // description: order the repositories
// type: string
+ // enum: [name, id, newest, oldest, recentupdate, leastupdate, reversealphabetically, alphabetically, reversesize, size, reversegitsize, gitsize, reverselfssize, lfssize, moststars, feweststars, mostforks, fewestforks]
// responses:
// "200":
// "$ref": "#/responses/RepositoryList"
@@ -124,14 +125,15 @@ func ListMyRepos(ctx *context.APIContext) {
switch orderBy {
case "name":
opts.OrderBy = "name ASC"
- case "size":
- opts.OrderBy = "size DESC"
case "id":
opts.OrderBy = "id ASC"
- case "":
default:
- ctx.Error(http.StatusUnprocessableEntity, "", "invalid order_by")
- return
+ if orderBy, ok := repo_model.OrderByFlatMap[orderBy]; ok {
+ opts.OrderBy = orderBy
+ } else if orderBy != "" {
+ ctx.Error(http.StatusUnprocessableEntity, "", "invalid order_by")
+ return
+ }
}
repos, count, err := repo_model.SearchRepository(ctx, opts)
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index 4679a13fa3..4cc8f7eddd 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -19361,8 +19361,28 @@
"in": "query"
},
{
+ "enum": [
+ "name",
+ "id",
+ "newest",
+ "oldest",
+ "recentupdate",
+ "leastupdate",
+ "reversealphabetically",
+ "alphabetically",
+ "reversesize",
+ "size",
+ "reversegitsize",
+ "gitsize",
+ "reverselfssize",
+ "lfssize",
+ "moststars",
+ "feweststars",
+ "mostforks",
+ "fewestforks"
+ ],
"type": "string",
- "description": "order the repositories by name (default), id, or size",
+ "description": "order the repositories",
"name": "order_by",
"in": "query"
}
diff --git a/tests/integration/api_repo_test.go b/tests/integration/api_repo_test.go
index b635b7099e..6cc7aea2c8 100644
--- a/tests/integration/api_repo_test.go
+++ b/tests/integration/api_repo_test.go
@@ -764,3 +764,58 @@ func TestAPIRepoCommitPull(t *testing.T) {
req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/not-a-commit/pull")
MakeRequest(t, req, http.StatusNotFound)
}
+
+func TestAPIListOwnRepoSorting(t *testing.T) {
+ defer tests.PrepareTestEnv(t)()
+
+ user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
+ session := loginUser(t, user.Name)
+ token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository, auth_model.AccessTokenScopeReadUser)
+
+ t.Run("No sorting", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ MakeRequest(t, NewRequest(t, "GET", "/api/v1/user/repos").AddTokenAuth(token), http.StatusOK)
+ })
+
+ t.Run("ID sorting", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ var repos []api.Repository
+ resp := MakeRequest(t, NewRequest(t, "GET", "/api/v1/user/repos?limit=2&order_by=id").AddTokenAuth(token), http.StatusOK)
+ DecodeJSON(t, resp, &repos)
+
+ assert.Len(t, repos, 2)
+ assert.EqualValues(t, 1, repos[0].ID)
+ assert.EqualValues(t, 2, repos[1].ID)
+ })
+
+ t.Run("Name sorting", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ var repos []api.Repository
+ resp := MakeRequest(t, NewRequest(t, "GET", "/api/v1/user/repos?limit=2&order_by=name").AddTokenAuth(token), http.StatusOK)
+ DecodeJSON(t, resp, &repos)
+
+ assert.Len(t, repos, 2)
+ assert.EqualValues(t, "big_test_private_4", repos[0].Name)
+ // Postgres doesn't do ascii sorting.
+ if setting.Database.Type.IsPostgreSQL() {
+ assert.EqualValues(t, "commitsonpr", repos[1].Name)
+ } else {
+ assert.EqualValues(t, "commits_search_test", repos[1].Name)
+ }
+ })
+
+ t.Run("Reverse alphabetic sorting", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ var repos []api.Repository
+ resp := MakeRequest(t, NewRequest(t, "GET", "/api/v1/user/repos?limit=2&order_by=reversealphabetically").AddTokenAuth(token), http.StatusOK)
+ DecodeJSON(t, resp, &repos)
+
+ assert.Len(t, repos, 2)
+ assert.EqualValues(t, "utf8", repos[0].Name)
+ assert.EqualValues(t, "test_workflows", repos[1].Name)
+ })
+}
From 9ad3f2813b2d680d472bc4af8b1288b09adc03fc Mon Sep 17 00:00:00 2001
From: Renovate Bot
Date: Tue, 18 Mar 2025 07:28:52 +0000
Subject: [PATCH 16/32] Update dependency yamllint to v1.36.2 (forgejo) (#7259)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7259
Reviewed-by: Michael Kriese
Co-authored-by: Renovate Bot
Co-committed-by: Renovate Bot
---
poetry.lock | 8 ++++----
pyproject.toml | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/poetry.lock b/poetry.lock
index 9735921fa0..5cda33c903 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -404,13 +404,13 @@ files = [
[[package]]
name = "yamllint"
-version = "1.36.1"
+version = "1.36.2"
description = "A linter for YAML files."
optional = false
python-versions = ">=3.9"
files = [
- {file = "yamllint-1.36.1-py3-none-any.whl", hash = "sha256:3e2ccd47ea12449837adf6b2c56fd9e31172ce42bc1470380806be461f25df66"},
- {file = "yamllint-1.36.1.tar.gz", hash = "sha256:a287689daaafc301a80549b2d0170452ebfdcabd826e3fe3b4c66e322d4851fa"},
+ {file = "yamllint-1.36.2-py3-none-any.whl", hash = "sha256:6ba19800513d86c987ed3cf48c0aba4e82b3624596e1dab55723b3733e11f35c"},
+ {file = "yamllint-1.36.2.tar.gz", hash = "sha256:c9ccc818659736e7b13f7e2f9c3c9bb9ac77445be13e789e7d843e92cb8428ef"},
]
[package.dependencies]
@@ -423,4 +423,4 @@ dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"]
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
-content-hash = "15925764be9383752b2d6eaba27c7f65e3a07456123bb69a2837fa54c916d7cb"
+content-hash = "6e4e2a74db7e165f0aa8cae9bb8932cbe1e84ea9bef64db42371e6d620d77c93"
diff --git a/pyproject.toml b/pyproject.toml
index a11496510c..eb3b338794 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -6,7 +6,7 @@ python = "^3.10"
[tool.poetry.group.dev.dependencies]
djlint = "1.36.4"
-yamllint = "1.36.1"
+yamllint = "1.36.2"
codespell = "2.4.1"
[tool.djlint]
From 5032388cc7128f58deb91f163666dfe7110c7a58 Mon Sep 17 00:00:00 2001
From: Renovate Bot
Date: Tue, 18 Mar 2025 07:49:36 +0000
Subject: [PATCH 17/32] Update module gitlab.com/gitlab-org/api/client-go to
v0.126.0 (forgejo) (#7260)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [gitlab.com/gitlab-org/api/client-go](https://gitlab.com/gitlab-org/api/client-go) | require | minor | `v0.123.0` -> `v0.126.0` |
---
### Release Notes
gitlab-org/api/client-go (gitlab.com/gitlab-org/api/client-go)
### [`v0.126.0`](https://gitlab.com/gitlab-org/api/client-go/tags/v0.126.0)
[Compare Source](https://gitlab.com/gitlab-org/api/client-go/compare/v0.125.0...v0.126.0)
#### 0.126.0 (2025-03-17)
##### Improvements (6 changes)
- [Parallelize unit tests](https://gitlab.com/gitlab-org/api/client-go/-/commit/8075babaf90b6ca07780fb1d1e2ea2b990dc99f8) ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2209))
- [Adding service ping API](https://gitlab.com/gitlab-org/api/client-go/-/commit/e84bdb0357fc3372fbbcc9fb88079ba048f05954) ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2196))
- [Exclude generated files from coverage report](https://gitlab.com/gitlab-org/api/client-go/-/commit/e6484c32b9553503bfe6cdf0ea82bb1fb5f047f9) ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2203))
- [Enable SAST scans](https://gitlab.com/gitlab-org/api/client-go/-/commit/2587cc764136d30bd1444384c588611227195457) ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2204))
- [bug: Add fallback for macOS version of readlink](https://gitlab.com/gitlab-org/api/client-go/-/commit/8ecad42574aa5255918b62448694cf8c6fe91528) ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2206))
- [Implement testing package for gomock based tests](https://gitlab.com/gitlab-org/api/client-go/-/commit/ca46822612ab4c5522446eebea4af0e21d60290b) ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2199))
### [`v0.125.0`](https://gitlab.com/gitlab-org/api/client-go/tags/v0.125.0)
[Compare Source](https://gitlab.com/gitlab-org/api/client-go/compare/v0.124.0...v0.125.0)
#### 0.125.0 (2025-03-14)
##### Improvements (11 changes)
- [Add function for deleting a user's identity](https://gitlab.com/gitlab-org/api/client-go/-/commit/8b7fe39f30034ad0ce465acde93695af5de56a05) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2197))
- [Add `GetProjectMirrorPublicKey`, and add support for `auth_method` to `ProjectMirror`](https://gitlab.com/gitlab-org/api/client-go/-/commit/8b74606a431629390d1be7e2a70e461b2423f8f4) by @mness ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2195))
- [Add custom role support to LDAP links](https://gitlab.com/gitlab-org/api/client-go/-/commit/27ce4cb84c3ed0f9b348877c3d58bca1b0d1c233) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2194))
- [Add function for configuring a project pull mirror](https://gitlab.com/gitlab-org/api/client-go/-/commit/4f1442ef76556a5cefe8b6ecd5ef44cc3c1eaebc) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2192))
- [Add new user filter options: Humans, ExcludeActive and ExcludeHumans](https://gitlab.com/gitlab-org/api/client-go/-/commit/0297e100facc7035e7767df233ff01eaf98858a6) by @mjovanovic1 ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2191))
- [Add support for `Usernames` in project-level MR approval rules](https://gitlab.com/gitlab-org/api/client-go/-/commit/a7434e79b052250d125f65a7e73204ce7ad37068) by @rkosegi ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2186))
- [add `ci_id_token_sub_claim_components` to EditProjectOptions](https://gitlab.com/gitlab-org/api/client-go/-/commit/2632817f163095003685e24ca412b997e04a1107) by @bakkerduncan ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2173))
- [feat: Add support for list shared projects group API](https://gitlab.com/gitlab-org/api/client-go/-/commit/e34f2c78a13f595f2bfce7897a1835e688201874) by @sy-be ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2187))
- [Fix pipeline for arbitrary fork location without Ultimate access](https://gitlab.com/gitlab-org/api/client-go/-/commit/6b1baf787fb57edb18e77b6d5287f6cf37d63575) ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2189))
- [Update access tokens to use alias type to reduce duplication](https://gitlab.com/gitlab-org/api/client-go/-/commit/0e325d6335557ad0748f33faa3cffbc704f278e4) ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2178))
- [Add support for merge request approval settings API](https://gitlab.com/gitlab-org/api/client-go/-/commit/165fd77adf308aca36a273ec66feffe2fb83f408) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2184))
### [`v0.124.0`](https://gitlab.com/gitlab-org/api/client-go/tags/v0.124.0)
[Compare Source](https://gitlab.com/gitlab-org/api/client-go/compare/v0.123.0...v0.124.0)
#### 0.124.0 (2025-02-28)
##### Breaking Changes (4 changes)
- [Refactor ShareWithGroup as a Named Struct instead of an Anonymous Struct](https://gitlab.com/gitlab-org/api/client-go/-/commit/65524df62bbcef5ad2debf21aef51bac8c4c3526) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2181))
- [Add support for instance member roles API, and align `CreateMemberRoleOptions`...](https://gitlab.com/gitlab-org/api/client-go/-/commit/6d63332b5704b5dff060e88c058215738b4abae7) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2179))
- [Switch to using BasicMergeRequest for API endpoints that use it](https://gitlab.com/gitlab-org/api/client-go/-/commit/42ec248d8b3bd359b57740e4f9b0f3d03ba02b97) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2176))
- [Add state option when listing project access tokens. This requires that...](https://gitlab.com/gitlab-org/api/client-go/-/commit/761f7de049e19f7486ebe1bda00b713713e6885d) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2170))
##### Improvements (13 changes)
- [Add bundled reviewable command for ease of local development](https://gitlab.com/gitlab-org/api/client-go/-/commit/fd06b55dbfc6ff2ca15706648b512d85f35fcf2f) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2180))
- [Add function for uploading a wiki attachment](https://gitlab.com/gitlab-org/api/client-go/-/commit/bf2d5c0f6bb8b93a005ceac6f9f60c0feea8d633) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2177))
- [Add internal flag when creating different types of notes. Update documentation...](https://gitlab.com/gitlab-org/api/client-go/-/commit/c103a6b83ef874d727e9f3760d82647b588f69e9) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2172))
- [Add `Internal` support to `CreateIssueNoteOptions`](https://gitlab.com/gitlab-org/api/client-go/-/commit/27f52bd13d5d087bba18972404141acce4c17716) by @ebuildy ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2154))
- [Add support for Secure Files API](https://gitlab.com/gitlab-org/api/client-go/-/commit/601d75bc57337619b2bc2c1964070d1c98fdcfa0) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2171))
- [add ci_delete_pipelines_in_seconds to project edit and read](https://gitlab.com/gitlab-org/api/client-go/-/commit/ece925e686e8cea22f00d2263e2c845c5b1d0f51) by @kingcrunch ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2158))
- [Add filter to group variables update and delete](https://gitlab.com/gitlab-org/api/client-go/-/commit/72e52c99db72b3fd6200c01d9aa1a72d67a24738) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2169))
- [Add support for group releases API](https://gitlab.com/gitlab-org/api/client-go/-/commit/4c519f881c7ad7decaa80de47ef861d8803da5dc) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2162))
- [Add description to personal access token APIs](https://gitlab.com/gitlab-org/api/client-go/-/commit/390a3caceaba82f2cf351f129ca78050c6a83217) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2165))
- [Add description to group access token APIs](https://gitlab.com/gitlab-org/api/client-go/-/commit/23a6b28a8ebe475067b8da47646c737af8efaf1a) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2166))
- [Add description to project access token APIs](https://gitlab.com/gitlab-org/api/client-go/-/commit/bb10e8c656627f4d4781e82da1004b2d7f3a3bda) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2167))
- [Add 'username' support to AddProjectMemberOptions](https://gitlab.com/gitlab-org/api/client-go/-/commit/82645d9d45e889d22d20d502de12f8ccb573744b) by @sy-be ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2163))
- [Update Group Hooks to add missing options and fix documentation links](https://gitlab.com/gitlab-org/api/client-go/-/commit/380a7809d2997f78e16419a0b337059e7a234532) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2159))
##### Breaking Change (1 change)
- [Fix return value of CreateMergeRequestDependency to return a single...](https://gitlab.com/gitlab-org/api/client-go/-/commit/a17c2255e18d05fcb7216ec750ae525994aaf221) by @llxp ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2174))
##### Features (1 change)
- [Add support for project security settings API](https://gitlab.com/gitlab-org/api/client-go/-/commit/2826180657895a6bc511d251dd421ebaa473af39) by @heidi.berry ([merge request](https://gitlab.com/gitlab-org/api/client-go/-/merge_requests/2157))
---
### Configuration
📅 **Schedule**: Branch creation - "* 0-3 * * *" (UTC), Automerge - "* 0-3 * * *" (UTC).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7260
Reviewed-by: Earl Warren
Co-authored-by: Renovate Bot
Co-committed-by: Renovate Bot
---
go.mod | 6 +++---
go.sum | 12 ++++++------
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/go.mod b/go.mod
index 819b1ee351..4fcdbe30c5 100644
--- a/go.mod
+++ b/go.mod
@@ -99,8 +99,8 @@ require (
github.com/yohcop/openid-go v1.0.1
github.com/yuin/goldmark v1.7.8
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc
- gitlab.com/gitlab-org/api/client-go v0.123.0
- go.uber.org/mock v0.4.0
+ gitlab.com/gitlab-org/api/client-go v0.126.0
+ go.uber.org/mock v0.5.0
golang.org/x/crypto v0.36.0
golang.org/x/image v0.25.0
golang.org/x/net v0.37.0
@@ -269,7 +269,7 @@ require (
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
golang.org/x/mod v0.24.0 // indirect
- golang.org/x/time v0.9.0 // indirect
+ golang.org/x/time v0.10.0 // indirect
golang.org/x/tools v0.31.0 // indirect
google.golang.org/api v0.203.0 // indirect
google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53 // indirect
diff --git a/go.sum b/go.sum
index 30fa071418..2d1587ec93 100644
--- a/go.sum
+++ b/go.sum
@@ -1452,8 +1452,8 @@ github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCR
github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
-gitlab.com/gitlab-org/api/client-go v0.123.0 h1:W3LZ5QNyiSCJA0Zchkwz8nQIUzOuDoSWMZtRDT5DjPI=
-gitlab.com/gitlab-org/api/client-go v0.123.0/go.mod h1:Jh0qjLILEdbO6z/OY94RD+3NDQRUKiuFSFYozN6cpKM=
+gitlab.com/gitlab-org/api/client-go v0.126.0 h1:VV5TdkF6pMbEdFGvbR2CwEgJwg6qdg1u3bj5eD2tiWk=
+gitlab.com/gitlab-org/api/client-go v0.126.0/go.mod h1:bYC6fPORKSmtuPRyD9Z2rtbAjE7UeNatu2VWHRf4/LE=
go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI=
go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
@@ -1491,8 +1491,8 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
-go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
-go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
+go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
+go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
@@ -1839,8 +1839,8 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
-golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4=
+golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
From 30b438ff84242c6bfe3e3bab177dc811b4d009d8 Mon Sep 17 00:00:00 2001
From: viceice
Date: Tue, 18 Mar 2025 07:52:00 +0000
Subject: [PATCH 18/32] chore(renovate): add `yamllint` to automerge (#7262)
Only used for linting, so safe for automerge. Also sort list alphabetically.
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7262
Reviewed-by: Earl Warren
Co-authored-by: viceice
Co-committed-by: viceice
---
renovate.json | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/renovate.json b/renovate.json
index f3fcd3d5fc..d3bf8c875c 100644
--- a/renovate.json
+++ b/renovate.json
@@ -137,6 +137,8 @@
"@playwright/**",
"@stoplight/spectral-cli",
"@stylistic/**",
+ "@vitejs/plugin-vue",
+ "@vue/test-utils",
"djlint",
"github.com/editorconfig-checker/editorconfig-checker/v2/cmd/editorconfig-checker",
"github.com/golangci/golangci-lint/cmd/golangci-lint",
@@ -148,8 +150,7 @@
"mvdan.cc/gofumpt",
"updates",
"vite-string-plugin",
- "@vue/test-utils",
- "@vitejs/plugin-vue"
+ "yamllint"
],
"automerge": true
},
From 316682f17b9b1eec83815c26092b82a18407dcea Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Tue, 18 Mar 2025 14:18:00 +0000
Subject: [PATCH 19/32] chore(dependency): upgrade gof3 v3.10.6 (#7258)
cherry-pick from the forgefriends fork, except for the F3 API for mirroring which is a functional change that is not safe enough to introduce in Forgejo.
Refs: https://code.forgejo.org/forgefriends/forgefriends/commit/3aad1f4e641c4fbbff8c0ced65337b32782d805d
---
The motivation is to keep up-to-date with the rather large refactor of gof3. The changes are syntactic only and test is provided by the compliance suite.
Co-authored-by: limiting-factor
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7258
Reviewed-by: Michael Kriese
---
go.mod | 2 +-
go.sum | 4 ++--
services/f3/driver/asset.go | 5 +++--
services/f3/driver/comment.go | 5 +++--
services/f3/driver/common.go | 3 ++-
services/f3/driver/container.go | 8 ++++----
services/f3/driver/forge.go | 10 ++++++----
services/f3/driver/issue.go | 5 +++--
services/f3/driver/label.go | 5 +++--
services/f3/driver/milestone.go | 5 +++--
services/f3/driver/organization.go | 5 +++--
services/f3/driver/organizations.go | 5 +++--
services/f3/driver/project.go | 5 +++--
services/f3/driver/projects.go | 7 ++++---
services/f3/driver/pullrequest.go | 10 ++++++----
services/f3/driver/reaction.go | 5 +++--
services/f3/driver/release.go | 5 +++--
services/f3/driver/repository.go | 7 ++++---
services/f3/driver/review.go | 5 +++--
services/f3/driver/reviewcomment.go | 5 +++--
services/f3/driver/root.go | 5 +++--
services/f3/driver/tests/new.go | 6 +++---
services/f3/driver/topic.go | 5 +++--
services/f3/driver/tree.go | 5 +++--
services/f3/driver/user.go | 7 ++++---
services/f3/driver/users.go | 5 +++--
26 files changed, 84 insertions(+), 60 deletions(-)
diff --git a/go.mod b/go.mod
index 4fcdbe30c5..ce1718c0a3 100644
--- a/go.mod
+++ b/go.mod
@@ -5,7 +5,7 @@ go 1.24
toolchain go1.24.1
require (
- code.forgejo.org/f3/gof3/v3 v3.10.4
+ code.forgejo.org/f3/gof3/v3 v3.10.6
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251
code.forgejo.org/forgejo/levelqueue v1.0.0
code.forgejo.org/forgejo/reply v1.0.2
diff --git a/go.sum b/go.sum
index 2d1587ec93..3c3733c219 100644
--- a/go.sum
+++ b/go.sum
@@ -610,8 +610,8 @@ cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoIS
cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw=
-code.forgejo.org/f3/gof3/v3 v3.10.4 h1:NOkw8lG3PhgYykdR5pJ19KFLdYmRFVII43YBSNKtpvk=
-code.forgejo.org/f3/gof3/v3 v3.10.4/go.mod h1:aQSlSGpISIf016g1dBrmm16h53WUKjCR7nSCuoO8dq8=
+code.forgejo.org/f3/gof3/v3 v3.10.6 h1:Ru/Iz+pqM8IPi7atUHE7+q7v3O3DRbYgMFqrFTsO1m8=
+code.forgejo.org/f3/gof3/v3 v3.10.6/go.mod h1:K6lQCWQIyN/5rjP/OJL9fMA6fd++satndE20w/I6Kss=
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 h1:HTZl3CBk3ABNYtFI6TPLvJgGKFIhKT5CBk0sbOtkDKU=
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:PphB88CPbx601QrWPMZATeorACeVmQlyv3u+uUMbSaM=
code.forgejo.org/forgejo/act v1.23.1 h1:4LU7u3FE380DicHz1oZ4ohsWU9I527OHeslVHnr9eP4=
diff --git a/services/f3/driver/asset.go b/services/f3/driver/asset.go
index 6759cc645c..61e571d1b6 100644
--- a/services/f3/driver/asset.go
+++ b/services/f3/driver/asset.go
@@ -20,6 +20,7 @@ import (
"code.gitea.io/gitea/services/attachment"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -131,7 +132,7 @@ func (o *asset) Patch(ctx context.Context) {
}
}
-func (o *asset) Put(ctx context.Context) generic.NodeID {
+func (o *asset) Put(ctx context.Context) f3_id.NodeID {
node := o.GetNode()
o.Trace("%s", node.GetID())
@@ -154,7 +155,7 @@ func (o *asset) Put(ctx context.Context) generic.NodeID {
}
o.Trace("asset created %d", o.forgejoAsset.ID)
- return generic.NewNodeID(o.forgejoAsset.ID)
+ return f3_id.NewNodeID(o.forgejoAsset.ID)
}
func (o *asset) Delete(ctx context.Context) {
diff --git a/services/f3/driver/comment.go b/services/f3/driver/comment.go
index 0c10fd744d..166bfcd328 100644
--- a/services/f3/driver/comment.go
+++ b/services/f3/driver/comment.go
@@ -14,6 +14,7 @@ import (
"code.gitea.io/gitea/modules/timeutil"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -95,7 +96,7 @@ func (o *comment) Patch(ctx context.Context) {
}
}
-func (o *comment) Put(ctx context.Context) generic.NodeID {
+func (o *comment) Put(ctx context.Context) f3_id.NodeID {
node := o.GetNode()
o.Trace("%s", node.GetID())
@@ -105,7 +106,7 @@ func (o *comment) Put(ctx context.Context) generic.NodeID {
panic(err)
}
o.Trace("comment created %d", o.forgejoComment.ID)
- return generic.NewNodeID(o.forgejoComment.ID)
+ return f3_id.NewNodeID(o.forgejoComment.ID)
}
func (o *comment) Delete(ctx context.Context) {
diff --git a/services/f3/driver/common.go b/services/f3/driver/common.go
index 104f91c977..4c5dfd8b1a 100644
--- a/services/f3/driver/common.go
+++ b/services/f3/driver/common.go
@@ -7,6 +7,7 @@ package driver
import (
"context"
+ f3_kind "code.forgejo.org/f3/gof3/v3/kind"
"code.forgejo.org/f3/gof3/v3/tree/generic"
)
@@ -37,7 +38,7 @@ func (o *common) getPageSize() int {
return o.getTreeDriver().GetPageSize()
}
-func (o *common) getKind() generic.Kind {
+func (o *common) getKind() f3_kind.Kind {
return o.GetNode().GetKind()
}
diff --git a/services/f3/driver/container.go b/services/f3/driver/container.go
index 153044416e..1ca47ef285 100644
--- a/services/f3/driver/container.go
+++ b/services/f3/driver/container.go
@@ -8,8 +8,8 @@ import (
"context"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
- "code.forgejo.org/f3/gof3/v3/tree/generic"
)
type container struct {
@@ -30,7 +30,7 @@ func (o *container) FromFormat(content f3.Interface) {
func (o *container) Get(context.Context) bool { return true }
-func (o *container) Put(ctx context.Context) generic.NodeID {
+func (o *container) Put(ctx context.Context) f3_id.NodeID {
return o.upsert(ctx)
}
@@ -38,6 +38,6 @@ func (o *container) Patch(ctx context.Context) {
o.upsert(ctx)
}
-func (o *container) upsert(context.Context) generic.NodeID {
- return generic.NewNodeID(o.getKind())
+func (o *container) upsert(context.Context) f3_id.NodeID {
+ return f3_id.NewNodeID(o.getKind())
}
diff --git a/services/f3/driver/forge.go b/services/f3/driver/forge.go
index a4bcf61231..c232882753 100644
--- a/services/f3/driver/forge.go
+++ b/services/f3/driver/forge.go
@@ -11,6 +11,8 @@ import (
user_model "code.gitea.io/gitea/models/user"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
+ f3_kind "code.forgejo.org/f3/gof3/v3/kind"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
"code.forgejo.org/f3/gof3/v3/util"
@@ -19,16 +21,16 @@ import (
type forge struct {
generic.NullDriver
- ownersKind map[string]generic.Kind
+ ownersKind map[string]f3_kind.Kind
}
func newForge() generic.NodeDriverInterface {
return &forge{
- ownersKind: make(map[string]generic.Kind),
+ ownersKind: make(map[string]f3_kind.Kind),
}
}
-func (o *forge) getOwnersKind(ctx context.Context, id string) generic.Kind {
+func (o *forge) getOwnersKind(ctx context.Context, id string) f3_kind.Kind {
kind, ok := o.ownersKind[id]
if !ok {
user, err := user_model.GetUserByID(ctx, util.ParseInt(id))
@@ -50,7 +52,7 @@ func (o *forge) getOwnersPath(ctx context.Context, id string) f3_tree.Path {
func (o *forge) Equals(context.Context, generic.NodeInterface) bool { return true }
func (o *forge) Get(context.Context) bool { return true }
-func (o *forge) Put(context.Context) generic.NodeID { return generic.NewNodeID("forge") }
+func (o *forge) Put(context.Context) f3_id.NodeID { return f3_id.NewNodeID("forge") }
func (o *forge) Patch(context.Context) {}
func (o *forge) Delete(context.Context) {}
func (o *forge) NewFormat() f3.Interface { return &f3.Forge{} }
diff --git a/services/f3/driver/issue.go b/services/f3/driver/issue.go
index 371ff9d45a..7e10f3a9db 100644
--- a/services/f3/driver/issue.go
+++ b/services/f3/driver/issue.go
@@ -17,6 +17,7 @@ import (
issue_service "code.gitea.io/gitea/services/issue"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -210,7 +211,7 @@ func updateIssueLabels(ctx context.Context, issueID int64, labels []*issues_mode
}
}
-func (o *issue) Put(ctx context.Context) generic.NodeID {
+func (o *issue) Put(ctx context.Context) f3_id.NodeID {
node := o.GetNode()
o.Trace("%s", node.GetID())
@@ -232,7 +233,7 @@ func (o *issue) Put(ctx context.Context) generic.NodeID {
updateIssueLabels(ctx, o.forgejoIssue.ID, o.forgejoIssue.Labels)
o.Trace("issue created %d/%d", o.forgejoIssue.ID, o.forgejoIssue.Index)
- return generic.NewNodeID(o.forgejoIssue.Index)
+ return f3_id.NewNodeID(o.forgejoIssue.Index)
}
func (o *issue) Delete(ctx context.Context) {
diff --git a/services/f3/driver/label.go b/services/f3/driver/label.go
index aef0d0256d..509a69cf71 100644
--- a/services/f3/driver/label.go
+++ b/services/f3/driver/label.go
@@ -13,6 +13,7 @@ import (
issues_model "code.gitea.io/gitea/models/issues"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -86,7 +87,7 @@ func (o *label) Patch(ctx context.Context) {
}
}
-func (o *label) Put(ctx context.Context) generic.NodeID {
+func (o *label) Put(ctx context.Context) f3_id.NodeID {
node := o.GetNode()
o.Trace("%s", node.GetID())
@@ -95,7 +96,7 @@ func (o *label) Put(ctx context.Context) generic.NodeID {
panic(err)
}
o.Trace("label created %d", o.forgejoLabel.ID)
- return generic.NewNodeID(o.forgejoLabel.ID)
+ return f3_id.NewNodeID(o.forgejoLabel.ID)
}
func (o *label) Delete(ctx context.Context) {
diff --git a/services/f3/driver/milestone.go b/services/f3/driver/milestone.go
index f133d37f7a..e57fee95a7 100644
--- a/services/f3/driver/milestone.go
+++ b/services/f3/driver/milestone.go
@@ -15,6 +15,7 @@ import (
"code.gitea.io/gitea/modules/timeutil"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -122,7 +123,7 @@ func (o *milestone) Patch(ctx context.Context) {
}
}
-func (o *milestone) Put(ctx context.Context) generic.NodeID {
+func (o *milestone) Put(ctx context.Context) f3_id.NodeID {
node := o.GetNode()
o.Trace("%s", node.GetID())
@@ -131,7 +132,7 @@ func (o *milestone) Put(ctx context.Context) generic.NodeID {
panic(err)
}
o.Trace("milestone created %d", o.forgejoMilestone.ID)
- return generic.NewNodeID(o.forgejoMilestone.ID)
+ return f3_id.NewNodeID(o.forgejoMilestone.ID)
}
func (o *milestone) Delete(ctx context.Context) {
diff --git a/services/f3/driver/organization.go b/services/f3/driver/organization.go
index 76b240068d..8e818a231a 100644
--- a/services/f3/driver/organization.go
+++ b/services/f3/driver/organization.go
@@ -13,6 +13,7 @@ import (
user_model "code.gitea.io/gitea/models/user"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -81,7 +82,7 @@ func (o *organization) Patch(ctx context.Context) {
}
}
-func (o *organization) Put(ctx context.Context) generic.NodeID {
+func (o *organization) Put(ctx context.Context) f3_id.NodeID {
node := o.GetNode()
o.Trace("%s", node.GetID())
@@ -94,7 +95,7 @@ func (o *organization) Put(ctx context.Context) generic.NodeID {
panic(err)
}
- return generic.NewNodeID(o.forgejoOrganization.ID)
+ return f3_id.NewNodeID(o.forgejoOrganization.ID)
}
func (o *organization) Delete(ctx context.Context) {
diff --git a/services/f3/driver/organizations.go b/services/f3/driver/organizations.go
index 98c4c1497d..adebdbbe95 100644
--- a/services/f3/driver/organizations.go
+++ b/services/f3/driver/organizations.go
@@ -12,6 +12,7 @@ import (
org_model "code.gitea.io/gitea/models/organization"
user_model "code.gitea.io/gitea/models/user"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
)
@@ -36,13 +37,13 @@ func (o *organizations) ListPage(ctx context.Context, page int) generic.Children
return f3_tree.ConvertListed(ctx, o.GetNode(), f3_tree.ConvertToAny(organizations...)...)
}
-func (o *organizations) GetIDFromName(ctx context.Context, name string) generic.NodeID {
+func (o *organizations) GetIDFromName(ctx context.Context, name string) f3_id.NodeID {
organization, err := org_model.GetOrgByName(ctx, name)
if err != nil {
panic(fmt.Errorf("GetOrganizationByName: %v", err))
}
- return generic.NewNodeID(organization.ID)
+ return f3_id.NewNodeID(organization.ID)
}
func newOrganizations() generic.NodeDriverInterface {
diff --git a/services/f3/driver/project.go b/services/f3/driver/project.go
index c2a2df38c4..2400663426 100644
--- a/services/f3/driver/project.go
+++ b/services/f3/driver/project.go
@@ -14,6 +14,7 @@ import (
repo_service "code.gitea.io/gitea/services/repository"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -121,7 +122,7 @@ func (o *project) Patch(ctx context.Context) {
}
}
-func (o *project) Put(ctx context.Context) generic.NodeID {
+func (o *project) Put(ctx context.Context) f3_id.NodeID {
node := o.GetNode()
o.Trace("%s", node.GetID())
@@ -166,7 +167,7 @@ func (o *project) Put(ctx context.Context) generic.NodeID {
o.forgejoProject = repo
o.Trace("project created %d", o.forgejoProject.ID)
}
- return generic.NewNodeID(o.forgejoProject.ID)
+ return f3_id.NewNodeID(o.forgejoProject.ID)
}
func (o *project) Delete(ctx context.Context) {
diff --git a/services/f3/driver/projects.go b/services/f3/driver/projects.go
index a2dabc3f95..fb447f3f01 100644
--- a/services/f3/driver/projects.go
+++ b/services/f3/driver/projects.go
@@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
)
@@ -19,18 +20,18 @@ type projects struct {
container
}
-func (o *projects) GetIDFromName(ctx context.Context, name string) generic.NodeID {
+func (o *projects) GetIDFromName(ctx context.Context, name string) f3_id.NodeID {
owner := f3_tree.GetOwnerName(o.GetNode())
forgejoProject, err := repo_model.GetRepositoryByOwnerAndName(ctx, owner, name)
if repo_model.IsErrRepoNotExist(err) {
- return generic.NilID
+ return f3_id.NilID
}
if err != nil {
panic(fmt.Errorf("error GetRepositoryByOwnerAndName(%s, %s): %v", owner, name, err))
}
- return generic.NewNodeID(forgejoProject.ID)
+ return f3_id.NewNodeID(forgejoProject.ID)
}
func (o *projects) ListPage(ctx context.Context, page int) generic.ChildrenSlice {
diff --git a/services/f3/driver/pullrequest.go b/services/f3/driver/pullrequest.go
index 466b4bd576..b8cb06c4d5 100644
--- a/services/f3/driver/pullrequest.go
+++ b/services/f3/driver/pullrequest.go
@@ -18,6 +18,8 @@ import (
issue_service "code.gitea.io/gitea/services/issue"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
+ f3_path "code.forgejo.org/f3/gof3/v3/path"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -51,7 +53,7 @@ func (o *pullRequest) repositoryToReference(ctx context.Context, repository *rep
if repository == nil {
panic("unexpected nil repository")
}
- forge := o.getTree().GetRoot().GetChild(generic.NewNodeID(f3_tree.KindForge)).GetDriver().(*forge)
+ forge := o.getTree().GetRoot().GetChild(f3_id.NewNodeID(f3_tree.KindForge)).GetDriver().(*forge)
owners := forge.getOwnersPath(ctx, fmt.Sprintf("%d", repository.OwnerID))
return f3_tree.NewRepositoryReference(owners.String(), repository.OwnerID, repository.ID)
}
@@ -61,7 +63,7 @@ func (o *pullRequest) referenceToRepository(reference *f3.Reference) int64 {
if reference.Get() == "../../repository/vcs" {
project = f3_tree.GetProjectID(o.GetNode())
} else {
- p := f3_tree.ToPath(generic.PathAbsolute(o.GetNode().GetCurrentPath().String(), reference.Get()))
+ p := f3_tree.ToPath(f3_path.PathAbsolute(generic.NewElementNode, o.GetNode().GetCurrentPath().String(), reference.Get()))
o.Trace("%v %v", o.GetNode().GetCurrentPath().String(), p)
_, project = p.OwnerAndProjectID()
}
@@ -237,7 +239,7 @@ func (o *pullRequest) GetPullRequestRef() string {
return fmt.Sprintf("refs/pull/%s/head", o.GetNativeID())
}
-func (o *pullRequest) Put(ctx context.Context) generic.NodeID {
+func (o *pullRequest) Put(ctx context.Context) f3_id.NodeID {
node := o.GetNode()
o.Trace("%s", node.GetID())
@@ -289,7 +291,7 @@ func (o *pullRequest) Put(ctx context.Context) generic.NodeID {
}
o.Trace("pullRequest created %d/%d", o.forgejoPullRequest.ID, o.forgejoPullRequest.Index)
- return generic.NewNodeID(o.forgejoPullRequest.Index)
+ return f3_id.NewNodeID(o.forgejoPullRequest.Index)
}
func (o *pullRequest) Delete(ctx context.Context) {
diff --git a/services/f3/driver/reaction.go b/services/f3/driver/reaction.go
index 0dc486c729..4f12fa41db 100644
--- a/services/f3/driver/reaction.go
+++ b/services/f3/driver/reaction.go
@@ -13,6 +13,7 @@ import (
user_model "code.gitea.io/gitea/models/user"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -87,7 +88,7 @@ func (o *reaction) Patch(ctx context.Context) {
}
}
-func (o *reaction) Put(ctx context.Context) generic.NodeID {
+func (o *reaction) Put(ctx context.Context) f3_id.NodeID {
o.Error("%v", o.forgejoReaction.User)
sess := db.GetEngine(ctx)
@@ -115,7 +116,7 @@ func (o *reaction) Put(ctx context.Context) generic.NodeID {
panic(err)
}
o.Trace("reaction created %d", o.forgejoReaction.ID)
- return generic.NewNodeID(o.forgejoReaction.ID)
+ return f3_id.NewNodeID(o.forgejoReaction.ID)
}
func (o *reaction) Delete(ctx context.Context) {
diff --git a/services/f3/driver/release.go b/services/f3/driver/release.go
index e937f84d05..86490e8b02 100644
--- a/services/f3/driver/release.go
+++ b/services/f3/driver/release.go
@@ -17,6 +17,7 @@ import (
release_service "code.gitea.io/gitea/services/release"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -115,7 +116,7 @@ func (o *release) Patch(ctx context.Context) {
}
}
-func (o *release) Put(ctx context.Context) generic.NodeID {
+func (o *release) Put(ctx context.Context) f3_id.NodeID {
node := o.GetNode()
o.Trace("%s", node.GetID())
@@ -133,7 +134,7 @@ func (o *release) Put(ctx context.Context) generic.NodeID {
panic(err)
}
o.Trace("release created %d", o.forgejoRelease.ID)
- return generic.NewNodeID(o.forgejoRelease.ID)
+ return f3_id.NewNodeID(o.forgejoRelease.ID)
}
func (o *release) Delete(ctx context.Context) {
diff --git a/services/f3/driver/repository.go b/services/f3/driver/repository.go
index 21f826e551..118d5f2f2a 100644
--- a/services/f3/driver/repository.go
+++ b/services/f3/driver/repository.go
@@ -11,6 +11,7 @@ import (
"code.forgejo.org/f3/gof3/v3/f3"
helpers_repository "code.forgejo.org/f3/gof3/v3/forges/helpers/repository"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
)
@@ -57,7 +58,7 @@ func (o *repository) Get(ctx context.Context) bool {
return o.h.Get(ctx)
}
-func (o *repository) Put(ctx context.Context) generic.NodeID {
+func (o *repository) Put(ctx context.Context) f3_id.NodeID {
return o.upsert(ctx)
}
@@ -65,10 +66,10 @@ func (o *repository) Patch(ctx context.Context) {
o.upsert(ctx)
}
-func (o *repository) upsert(ctx context.Context) generic.NodeID {
+func (o *repository) upsert(ctx context.Context) f3_id.NodeID {
o.Trace("%s", o.GetNativeID())
o.h.Upsert(ctx, o.f)
- return generic.NewNodeID(o.f.Name)
+ return f3_id.NewNodeID(o.f.Name)
}
func (o *repository) SetFetchFunc(fetchFunc func(ctx context.Context, destination string, internalRefs []string)) {
diff --git a/services/f3/driver/review.go b/services/f3/driver/review.go
index a3c074bd63..d180ea96be 100644
--- a/services/f3/driver/review.go
+++ b/services/f3/driver/review.go
@@ -14,6 +14,7 @@ import (
"code.gitea.io/gitea/modules/timeutil"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -134,7 +135,7 @@ func (o *review) Patch(ctx context.Context) {
}
}
-func (o *review) Put(ctx context.Context) generic.NodeID {
+func (o *review) Put(ctx context.Context) f3_id.NodeID {
node := o.GetNode()
o.Trace("%s", node.GetID())
@@ -153,7 +154,7 @@ func (o *review) Put(ctx context.Context) generic.NodeID {
panic(err)
}
o.Trace("review created %d", o.forgejoReview.ID)
- return generic.NewNodeID(o.forgejoReview.ID)
+ return f3_id.NewNodeID(o.forgejoReview.ID)
}
func (o *review) Delete(ctx context.Context) {
diff --git a/services/f3/driver/reviewcomment.go b/services/f3/driver/reviewcomment.go
index 8e13d86b63..7ba0e15802 100644
--- a/services/f3/driver/reviewcomment.go
+++ b/services/f3/driver/reviewcomment.go
@@ -15,6 +15,7 @@ import (
"code.gitea.io/gitea/modules/timeutil"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -115,7 +116,7 @@ func (o *reviewComment) Patch(ctx context.Context) {
}
}
-func (o *reviewComment) Put(ctx context.Context) generic.NodeID {
+func (o *reviewComment) Put(ctx context.Context) f3_id.NodeID {
node := o.GetNode()
o.Trace("%s", node.GetID())
@@ -125,7 +126,7 @@ func (o *reviewComment) Put(ctx context.Context) generic.NodeID {
panic(err)
}
o.Trace("reviewComment created %d", o.forgejoReviewComment.ID)
- return generic.NewNodeID(o.forgejoReviewComment.ID)
+ return f3_id.NewNodeID(o.forgejoReviewComment.ID)
}
func (o *reviewComment) Delete(ctx context.Context) {
diff --git a/services/f3/driver/root.go b/services/f3/driver/root.go
index 0e8a67faf3..f4a6e6a7ca 100644
--- a/services/f3/driver/root.go
+++ b/services/f3/driver/root.go
@@ -8,6 +8,7 @@ import (
"context"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
"code.forgejo.org/f3/gof3/v3/tree/generic"
)
@@ -33,8 +34,8 @@ func (o *root) ToFormat() f3.Interface {
func (o *root) Get(context.Context) bool { return true }
-func (o *root) Put(context.Context) generic.NodeID {
- return generic.NilID
+func (o *root) Put(context.Context) f3_id.NodeID {
+ return f3_id.NilID
}
func (o *root) Patch(context.Context) {
diff --git a/services/f3/driver/tests/new.go b/services/f3/driver/tests/new.go
index 2e3dfc3c95..dc6ac437e6 100644
--- a/services/f3/driver/tests/new.go
+++ b/services/f3/driver/tests/new.go
@@ -9,8 +9,8 @@ import (
driver_options "code.gitea.io/gitea/services/f3/driver/options"
+ f3_kind "code.forgejo.org/f3/gof3/v3/kind"
"code.forgejo.org/f3/gof3/v3/options"
- "code.forgejo.org/f3/gof3/v3/tree/generic"
forge_test "code.forgejo.org/f3/gof3/v3/tree/tests/f3/forge"
)
@@ -22,8 +22,8 @@ func (o *forgeTest) NewOptions(t *testing.T) options.Interface {
return newTestOptions(t)
}
-func (o *forgeTest) GetExceptions() []generic.Kind {
- return []generic.Kind{}
+func (o *forgeTest) GetExceptions() []f3_kind.Kind {
+ return []f3_kind.Kind{}
}
func (o *forgeTest) GetNonTestUsers() []string {
diff --git a/services/f3/driver/topic.go b/services/f3/driver/topic.go
index 16b2eb3142..eeb387cf93 100644
--- a/services/f3/driver/topic.go
+++ b/services/f3/driver/topic.go
@@ -12,6 +12,7 @@ import (
repo_model "code.gitea.io/gitea/models/repo"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -79,14 +80,14 @@ func (o *topic) Patch(ctx context.Context) {
}
}
-func (o *topic) Put(ctx context.Context) generic.NodeID {
+func (o *topic) Put(ctx context.Context) f3_id.NodeID {
sess := db.GetEngine(ctx)
if _, err := sess.Insert(o.forgejoTopic); err != nil {
panic(err)
}
o.Trace("topic created %d", o.forgejoTopic.ID)
- return generic.NewNodeID(o.forgejoTopic.ID)
+ return f3_id.NewNodeID(o.forgejoTopic.ID)
}
func (o *topic) Delete(ctx context.Context) {
diff --git a/services/f3/driver/tree.go b/services/f3/driver/tree.go
index 0302ed74ae..2377d3794d 100644
--- a/services/f3/driver/tree.go
+++ b/services/f3/driver/tree.go
@@ -10,6 +10,7 @@ import (
forgejo_options "code.gitea.io/gitea/services/f3/driver/options"
+ f3_kind "code.forgejo.org/f3/gof3/v3/kind"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
)
@@ -24,7 +25,7 @@ func (o *treeDriver) Init() {
o.NullTreeDriver.Init()
}
-func (o *treeDriver) Factory(ctx context.Context, kind generic.Kind) generic.NodeDriverInterface {
+func (o *treeDriver) Factory(ctx context.Context, kind f3_kind.Kind) generic.NodeDriverInterface {
switch kind {
case f3_tree.KindForge:
return newForge()
@@ -88,7 +89,7 @@ func (o *treeDriver) Factory(ctx context.Context, kind generic.Kind) generic.Nod
return newRepositories()
case f3_tree.KindRepository:
return newRepository(ctx)
- case generic.KindRoot:
+ case f3_kind.KindRoot:
return newRoot(o.GetTree().(f3_tree.TreeInterface).NewFormat(kind))
default:
panic(fmt.Errorf("unexpected kind %s", kind))
diff --git a/services/f3/driver/user.go b/services/f3/driver/user.go
index 221b06e834..0ba6cbb7c6 100644
--- a/services/f3/driver/user.go
+++ b/services/f3/driver/user.go
@@ -14,6 +14,7 @@ import (
user_service "code.gitea.io/gitea/services/user"
"code.forgejo.org/f3/gof3/v3/f3"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
f3_util "code.forgejo.org/f3/gof3/v3/util"
@@ -96,9 +97,9 @@ func (o *user) Get(ctx context.Context) bool {
func (o *user) Patch(context.Context) {
}
-func (o *user) Put(ctx context.Context) generic.NodeID {
+func (o *user) Put(ctx context.Context) f3_id.NodeID {
if user := getSystemUserByName(o.forgejoUser.Name); user != nil {
- return generic.NewNodeID(user.ID)
+ return f3_id.NewNodeID(user.ID)
}
o.forgejoUser.LowerName = strings.ToLower(o.forgejoUser.Name)
@@ -111,7 +112,7 @@ func (o *user) Put(ctx context.Context) generic.NodeID {
panic(err)
}
- return generic.NewNodeID(o.forgejoUser.ID)
+ return f3_id.NewNodeID(o.forgejoUser.ID)
}
func (o *user) Delete(ctx context.Context) {
diff --git a/services/f3/driver/users.go b/services/f3/driver/users.go
index 92ed0bcbc5..59b10fc51d 100644
--- a/services/f3/driver/users.go
+++ b/services/f3/driver/users.go
@@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/models/db"
user_model "code.gitea.io/gitea/models/user"
+ f3_id "code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
)
@@ -34,13 +35,13 @@ func (o *users) ListPage(ctx context.Context, page int) generic.ChildrenSlice {
return f3_tree.ConvertListed(ctx, o.GetNode(), f3_tree.ConvertToAny(users...)...)
}
-func (o *users) GetIDFromName(ctx context.Context, name string) generic.NodeID {
+func (o *users) GetIDFromName(ctx context.Context, name string) f3_id.NodeID {
user, err := user_model.GetUserByName(ctx, name)
if err != nil {
panic(fmt.Errorf("GetUserByName: %v", err))
}
- return generic.NewNodeID(user.ID)
+ return f3_id.NewNodeID(user.ID)
}
func newUsers() generic.NodeDriverInterface {
From e033967eee22fd45b5f5b9b419cbfe3fa5e89163 Mon Sep 17 00:00:00 2001
From: forgejo-release-manager
Date: Wed, 19 Mar 2025 07:01:17 +0000
Subject: [PATCH 20/32] chore(release-notes): Forgejo v7.0.14 (#7266)
https://codeberg.org/forgejo/forgejo/milestone/9819
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7266
Reviewed-by: Earl Warren
Co-authored-by: forgejo-release-manager
Co-committed-by: forgejo-release-manager
---
release-notes-published/7.0.14.md | 14 ++++++++++++++
1 file changed, 14 insertions(+)
create mode 100644 release-notes-published/7.0.14.md
diff --git a/release-notes-published/7.0.14.md b/release-notes-published/7.0.14.md
new file mode 100644
index 0000000000..b7e85d8184
--- /dev/null
+++ b/release-notes-published/7.0.14.md
@@ -0,0 +1,14 @@
+
+
+
+
+## Release notes
+
+- Bug fixes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7143) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7145)): consider public issues for project boards
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7038) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7049)): the rootless image version label is not set
+- Included for completeness but not worth a release note
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6299) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7233)): chore: Make Forgejo build with go1.24
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7081): Update golang packages to v1.23 (v7.0/forgejo) (minor)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7051): Update https://code.forgejo.org/forgejo/forgejo-build-publish action to v5.3.4 (v7.0/forgejo)
+
From 2cd9872b105f31a7084fe6326e9fa6f55a24c2b7 Mon Sep 17 00:00:00 2001
From: fauno
Date: Wed, 19 Mar 2025 11:28:55 +0000
Subject: [PATCH 21/32] Include platform information on rubygems compact index
API #6507 (#7257)
Per #6507, platform information was missing from the rubygems package registry, so binary gems where not served correctly. This change adds the platform information when necessary.
Co-authored-by: f
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7257
Reviewed-by: Gusted
Co-authored-by: fauno
Co-committed-by: fauno
---
routers/api/packages/rubygems/rubygems.go | 23 +++
.../integration/api_packages_rubygems_test.go | 179 ++++++++++++++++++
2 files changed, 202 insertions(+)
diff --git a/routers/api/packages/rubygems/rubygems.go b/routers/api/packages/rubygems/rubygems.go
index dfefe2c4fb..28f584b391 100644
--- a/routers/api/packages/rubygems/rubygems.go
+++ b/routers/api/packages/rubygems/rubygems.go
@@ -105,9 +105,11 @@ func ServePackageInfo(ctx *context.Context) {
ctx, ctx.Package.Owner.ID, packages_model.TypeRubyGems, packageName)
if err != nil {
apiError(ctx, http.StatusInternalServerError, err)
+ return
}
if len(versions) == 0 {
apiError(ctx, http.StatusNotFound, fmt.Sprintf("Could not find package %s", packageName))
+ return
}
result, err := buildInfoFileForPackage(ctx, versions)
@@ -135,6 +137,7 @@ func ServeVersionsFile(ctx *context.Context) {
ctx, ctx.Package.Owner.ID, packages_model.TypeRubyGems, pack.Name)
if err != nil {
apiError(ctx, http.StatusInternalServerError, err)
+ return
}
if len(versions) == 0 {
// No versions left for this package, we should continue.
@@ -144,6 +147,20 @@ func ServeVersionsFile(ctx *context.Context) {
fmt.Fprintf(result, "%s ", pack.Name)
for i, v := range versions {
result.WriteString(v.Version)
+
+ pd, err := packages_model.GetPackageDescriptor(ctx, v)
+ if err != nil {
+ apiError(ctx, http.StatusInternalServerError, err)
+ return
+ }
+
+ metadata := pd.Metadata.(*rubygems_module.Metadata)
+
+ if metadata.Platform != "ruby" {
+ result.WriteString("_")
+ result.WriteString(metadata.Platform)
+ }
+
if i != len(versions)-1 {
result.WriteString(",")
}
@@ -152,6 +169,7 @@ func ServeVersionsFile(ctx *context.Context) {
info, err := buildInfoFileForPackage(ctx, versions)
if err != nil {
apiError(ctx, http.StatusInternalServerError, err)
+ return
}
checksum := md5.Sum([]byte(*info))
@@ -413,6 +431,11 @@ func buildRequirementStringFromVersion(ctx *context.Context, version *packages_m
additionalRequirements.WriteString(",rubygems:")
writeRequirements(metadata.RequiredRubygemsVersion, additionalRequirements)
}
+
+ if metadata.Platform != "ruby" {
+ return fmt.Sprintf("%s-%s %s|%s", version.Version, metadata.Platform, dependencyRequirements, additionalRequirements), nil
+ }
+
return fmt.Sprintf("%s %s|%s", version.Version, dependencyRequirements, additionalRequirements), nil
}
diff --git a/tests/integration/api_packages_rubygems_test.go b/tests/integration/api_packages_rubygems_test.go
index eb3dc0e7f2..0ec9b9321b 100644
--- a/tests/integration/api_packages_rubygems_test.go
+++ b/tests/integration/api_packages_rubygems_test.go
@@ -201,6 +201,137 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==`)
holaChecksum := fmt.Sprintf("%x", sha256.Sum256(holaGemContent))
+ binaryPackageName := "debug_inspector"
+ binaryPackageVersion := "0.0.3"
+ binaryRubyGemsRequirements := "ruby:~> 3.1.0"
+ binaryGemContent, _ := base64.StdEncoding.DecodeString(`bWV0YWRhdGEuZ3oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA0NDQAMDAwMDAw
+MAAwMDAwMDAwADAwMDAwMDAxMTM0ADE0NDQyNjI3NzcyADAxMzQ1NAAgMAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHdoZWVsAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwADAwMDAw
+MDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf
+iwgA+i+LZAIDxVRbb9MwFH73rzB9KTzksnYrkyUmKm1CRaqECuIBhCInOU28xRdsZ7Sa4LdznN7W
+bExcHkgi5ficz+d852JHUUSf2TZfJzq/hsKzNyAZe2+gEEtRcC+0IopLYLSEvK0yoRzavLbkFqxD
+K3tk+8eNiVC6B6VxGo+JabhfaisZXZ1Psslp1AjVriLZuobw1tfaOkYi+lbXis65sPR5zpVwHuxS
+gCpfBJC28LUVFhjJhSqFZRT/pADrs6LmAmN9/kJK7pHyKD15GaVnUXpO05R1X5zuHvqJlGDQK6hC
+QBf3YSaXO8Qak9nUQQolPDiPii0TCco/VobFwYzgIziGC5oI38HFq0G3CMunarl59hUdng1R6dcG
+ObESbqHRZhvKWLDQAHdoWvLGwaET2RGJ/0K6BFdYYXynmNIFbqbfLDcGLMXhoL4GOl/M6ChO+0NH
+p+9mBCQXTWjXtUXJvq7COi60JLCCovU8b7CdYQpg5UGFwPul5ZktdZEtxQ6zkdAbEg8ySour6eX8
+KpZlkPkNbNU9LnEFMohoQcdJz5qgrtBqGdscAY3I+4BfGpJtsQKg1hIMr7CNtffGsSSphK/bPGSb
+7I5G3wFpRIFpb7Kazz4QCZ7jgeCM3n0nRjsfsJ43TSbBueCedEXRXU82Zdm2PTPc150jZLpTlllo
+ePbEBXA8RP0R6gbox8WA/N747OOM45M4PSYRevCPRHaT/AdEhumQHJ+jULEHdMbxOB5NiBOVEqrK
+bmDNiLt/sx6gp8S1UnK7/qsTEa6jeyP9E+HiLnPUBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGF0
+YS50YXIuZ3oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA0NDQAMDAwMDAwMAAw
+MDAwMDAwADAwMDAwMDA1MzMzADE0NDQyNjI3NzcyADAxMzM3NwAgMAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwADAwMDAwMDAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfiwgA
++i+LZAID7Fp7U9tIEs/f+hR94m79KCMTnleuZfcMCNCtsSnbJJsiOSNLY3uCLGn1CMvl8dnv16OH
+sQnZvatdbjfFFBU0M/2e7p7uISdiPpGeePZ7jo3nGxu729vPNrKx+hubW8+eb29vb+5u7u3tbQJ+
+c3dr4xltPHuEkcaJHUGUm5kQ3hfgfml/Vbk/yYiDNHIE6bMkCeNWsxml49upmMdGEE11TePPUDjq
+gyqRfS0q2rOn8fWMvtk+OjONufv/i//tnZ3te/G/ufMU/48xXDFOpyPpc5QnQUSXf7k8SKXn0iCx
+kzR+Uy0SQxLZ72S87kjODM2x7cs4EVFzBd+I302/H0e278z25zZD1P5bEjVtf3lo2qhNfeQluons
+MBQRTSBoMhPkixs661u0aWyQovL6jibtc2ukaUOAXa1wuKJDEj8nwo9l4JPtuwxLNyISoBLLqS9c
+tTqGIRIC38sfAunMJA3s2HbthUJTmczSseEE8+Z18LzWgFAypjAK3oKPhs+38C6yCclTTqRjJ8wv
+mBBD3QTRtaFp9Xq3NzQHrXod3zTkHU/CgNEtzZFtY0pjwSiFukoVWtISs8IKxkaD6nU3ID9IFGZy
+l2CQJrF0FTlFZir9KcUySZVgcb1uQISe790q4WIKFnSpL35KZcQIMuGN1I/TMAyiBLbC2UhIeiM9
+jyIRpzAaRLIhxHoQatpFbE+Fts5D066urviK0SJFT1Bl5WwqmrZGvVD4uaZO4Cc4Kyye23EMZleu
+UyHJwkFO20nkO5FxG3uBc62xn7w4a7WOGNsq3TJgiu/pg+t80IjWaGw713BH3HzAytSnaiSSNMKH
+DXJRZN+yoYazSNhuq3VQILRanaA4yTGfc1wDRVCJaZ9cxygpj0rKmmJ5G6TkgPRUJNAtTGZMHsnH
+uaZJZM8F7Ie1K6ZkxPLfuGgzsmpiJHIOE+NkP0jWQOkgfZcPBGTkOlAd2/M4OBSxhTJ0UMApcQlO
+40uvpoiELLFCGOXUqrKm5fRlLH76ReKFvWHqJEod1neAoxU+TPtlhkz+DjfHw/l+lt0qooJkTCLh
+u9pH9ilNO4SjwB0yP2NPO4+CsYfyhflDoDg7ZCcDI2hhJ3SZRXAW0csBXaQnCNiRDnKFWJCuclY5
+s4aU79SYfXgbyeksoapTo01cYev4Z4uq/wxmCCNbMqFzEc1lrLIOPHiGhIPkMkW2RBQ1oKxQsenM
+7GgqkEwCeOItIeHFytkSW/o4Ic2GEuFtlhRAJg4myY2NUOKUBcsEjrQ5Kt3ASecC2ipf5SIfLo40
+olUGOUalppi4wvY4hDjFFFvKGZEvOJ6TSKpzbQDI8VL2Eq3Y9uRc5hwYXVkgZqJIPg0lZ4PmgSsn
+/FsotcJ07Ml41tBcyaTHaYLFmBeVLRusRxNnFgukE1Dg1JInwEI6BQMuWsgGTXITKb43s2C+rAlM
+NIGzgqVwlboBTKY4Ku8EFQafBJ4X3HCYwENcqZyllV0f9jhAjnHKA0ZuhaiZCCrfL04134pncF8a
+Cy0zGPhyhrqjTsTsEft+ImF7TqPKOVfUxPUwPDVp0Dsevmz3TbIGdN7vvbCOzCOqtAeYVxr00hqe
+9i6GBIh+uzt8Rb1jandf0Q9W96ihmT+e983BgHp9ss7OO5Z51CCre9i5OLK6J3QAPFw/1LHgzCA6
+7BEzzElZJvCOtTOzf3iKafvA6ljDVw06toZdpnkMom06b/eH1uFFp92n84v+eW9ggv0RyHat7nEf
+XMwzszs0NKuLNTJfYEKD03ano1i1LyB9X8l32Dt/1bdOTod02uscmVg8MCFZ+6BjZqy6r7TDTts6
+a9BR+6x9YiqsHqj0FVgu3ctTUy2BXxs/h0Or12WbHPa6wz6mDW3Y6w9L1JfWwGxQu28N2CDH/R7I
+szmB0VNEgNc1MypsapZaK08EIKzFxcBcyHJktjugNWDku8dn/CEbpz6KjN/7AYDr/72dnYfq/63t
+3b2V+n9rY/Op/3+U8deWgVJuJicJVVAnVhaFGTf7TccTtr9Y1FeqteY7ZF6kLn0FLcGtkdjxNao5
+10P5htKoP8YNPZHTVgsRdWydXFaOOuaPw8ob3AORcABxDDc0xM8hEusotJNZVS1g18etXx2Njq2O
+ORrVasgCvYMDs2/k2bWq1+vNurH2XrH6qDdILXwqPtbqxZfhBdPyO9CZktnuLugAvXmPVrmYI5fz
+QG+o0mQxyr1PdwEz/gu08dv7kq3VjfrD5AxXTJZohO64wBxNvFvuFBSB5aVS1WjsQFmNY73VGuJs
+hjgbA+1EtcUnVVN1ZcJ1ZWLACWL69lvSeUdXS/w1ygqI7JQ6uLkvFYASZ8RfYKK/UeC4urhOASwq
+QqGW4CbjAO1IvsRlm4ZWyyF9MAtuqPQi9hlq5VNIBeQQTcs9vyswWrT2frnSb7Ve4OpAtv6o32UT
+pShQIGVc8IBFbW5U9r+jyxbqvRBqNUiZ442Ww4Tome7I4AW2qqNXZZE+qgrAsrHiGemMth5BMuXY
+H5uw6GqPuyTbWPXbfPGjBrcjFAiFkLlcmRDODPRIL8myM6yGo56BZnJwn8V9LgqaCZ9OucG+QSqy
+l9cWMyekRRCQYTTxw2roec29kL6i6KShkr9squNKoUG+q8RSQs1hmwl9xiaLoPsflK0sdKpwzeqk
+gpuOe+LqaF1qIJFwNYa2vLB0JIpFOESLHztLiXmS+sX26kEuMyvgC+h1b+EGK5jrD3uuoQRTQmfS
+3ZWtlHTZfXg79OxkEsDC/GrL7U2ALqzQkMXKnJ2NBFeP5gz2ZlnRjNhDMhv5c/ByaIk518f3BChN
+q/gseUBJv65UvWvDe3HBZXaYAhG0EZxLpHldEV86NOU7VcWhVrjIkYwu9YzbG0PYzkylvGn2x48P
+ed4tjKDYrb3Pdz9mYcGCLbzpq3n/feCEH/P99/nzvZ2V+m+X/yT0VP89wlij9fo63NoJ+G5rUZpM
+1v/Oa2VFd68sq+SXwQO1IHrSslbTtBMxb7UGgCgfQA31jInoiznuYoOrOw6w/Xu3vLpQjaIa2KcH
+8qWCstNkFkRcoFzq5ZMLVYtXnIlE1NZUgRIbYm5LT0G+jfAZ/WPKC/zqkwPMgrkI7SnXK/pn3nof
+ernO5I3T+ZxfW4H7wLP10pP18ot1RoLzXyTDJFO7JKn2sjqsGPt0BcHIi9fV+pURh55MqvprX68p
+8DIl75M6ivN83mr1Lw5eZeYob21lk89dtXeqiMxC+WMNECpn1rCSHYHrjlzxTnhByO9O+A5hdLjW
+La5n6UtO33COynf7tFP5urLon3d8+bQfpf/f2MH3cv7f29p4yv+PdP9PaILaeTTPH4IQyirj819M
+sg78bSD9B3pxNJhnOZ7Okxu9Ru8/TLKCamKovulvl3nB2nrtv06EMwtI79qubahU8rGo+CY0j+Ro
+83usYSJ94X5f5RQ1MrsnVtes0Tff0J057e9nHY6ODcVObeZXAu1/oua/NpsZcSJN3iFfPlXMr+cT
+Tl1OJFBblhao3vubVE0TXsyWWbbU15DCPteI/VZx/2v//8/zvdX439l9iv/HGYt3u7Gj3ud+1ZOd
+NhZT6d+JJf3hZj5v7jqB7ZpRFERZTD7dvH/Y+C8K+d/0/v/i///b2V29/zf3nuL/UcY8cFNPrLRW
+COzyIiV9w9gwtvSngv1pPI2n8TS+qvEfAAAA//8DAME4UCsAMAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjaGVja3N1bXMu
+eWFtbC5negAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDQ0NAAwMDAwMDAwADAwMDAwMDAA
+MDAwMDAwMDA0NTAAMTQ0NDI2Mjc3NzIAMDE0NjIyACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAAMDAwMDAwMAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+LCAD6L4tkAgNl
+kD2yFEAIhPM9xV5grWH4f5mZuSeAAYxMrBd5escNNaOrmuajX6/X4/u3r5vl4/F8/uzPqPiMLz9+
+fzwJjNOXQnXMQG2UxSyqlbBnU0v7VVtpLZeNBsO8dMgBO+ncvHfWZ/x6500p68qBNVRwl5Y5AJep
+Z0LobkCdNR5XnVkeiyDF0sM7kf5yMuz/ODmDGF2Sz+6oMt5mMb5zT/PQkcM3NesOZYI5MzsADNzo
+PbhIKiAsZCrqa5IcQ7ZAG6Ktw+UXT1dIYIeTph5BaF20//2TSsE1OfAscfPUe1zJLiSagTIZUCLe
+5lCp02ap4MA5xT7iRbhh9Tbqi3MpZBBIvGtOlF/vuf8dWJs5tNWlSy6ajvbt1R9/AA8NE1rUAQAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==`)
+ binaryChecksum := fmt.Sprintf("%x", sha256.Sum256(binaryGemContent))
+
root := fmt.Sprintf("/api/packages/%s/rubygems", user.Name)
uploadFile := func(t *testing.T, content []byte, expectedStatus int) {
@@ -234,6 +365,8 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==`)
pb, err := packages.GetBlobByID(db.DefaultContext, pfs[0].BlobID)
require.NoError(t, err)
assert.Equal(t, int64(4608), pb.Size)
+
+ assert.Equal(t, "ruby", pd.Metadata.(*rubygems.Metadata).Platform)
})
t.Run("UploadExists", func(t *testing.T) {
@@ -322,6 +455,33 @@ gAAAAP//MS06Gw==`)
sep, holaPackageVersion, holaPackageDependency, holaChecksum, holaRubyGemsRequirements)
assert.Equal(t, expected, resp.Body.String())
})
+
+ t.Run("UploadBinary", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ uploadFile(t, binaryGemContent, http.StatusCreated)
+
+ pvs, err := packages.GetVersionsByPackageName(db.DefaultContext, user.ID, packages.TypeRubyGems, binaryPackageName)
+ require.NoError(t, err)
+
+ pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0])
+ require.NoError(t, err)
+
+ assert.Equal(t, binaryPackageName, pd.Package.Name)
+ assert.Equal(t, "x86_64-linux-musl", pd.Metadata.(*rubygems.Metadata).Platform)
+ })
+
+ t.Run("BinaryPackageInfo", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ req := NewRequest(t, "GET", fmt.Sprintf("%s/info/%s", root, binaryPackageName)).
+ AddBasicAuth(user.Name)
+ resp := MakeRequest(t, req, http.StatusOK)
+ expected := fmt.Sprintf("%s\n%s-x86_64-linux-musl |checksum:%s,%s\n",
+ sep, binaryPackageVersion, binaryChecksum, binaryRubyGemsRequirements)
+ assert.Equal(t, expected, resp.Body.String())
+ })
+
t.Run("Versions", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
@@ -334,12 +494,16 @@ gAAAAP//MS06Gw==`)
holaInfoReq := NewRequest(t, "GET", fmt.Sprintf("%s/info/%s", root, holaPackageName)).
AddBasicAuth(user.Name)
holaInfoResp := MakeRequest(t, holaInfoReq, http.StatusOK)
+ binaryInfoReq := NewRequest(t, "GET", fmt.Sprintf("%s/info/%s", root, binaryPackageName)).
+ AddBasicAuth(user.Name)
+ binaryInfoResp := MakeRequest(t, binaryInfoReq, http.StatusOK)
// expected := fmt.Sprintf("%s\n%s %s %x\n",
// sep, packageName, packageVersion, md5.Sum(infoResp.Body.Bytes()))
lines := versionsResp.Body.String()
assert.ElementsMatch(t, strings.Split(lines, "\n"), []string{
sep,
+ fmt.Sprintf("%s %s_x86_64-linux-musl %x", binaryPackageName, binaryPackageVersion, md5.Sum(binaryInfoResp.Body.Bytes())),
fmt.Sprintf("%s %s %x", packageName, packageVersion, md5.Sum(infoResp.Body.Bytes())),
fmt.Sprintf("%s %s %x", holaPackageName, holaPackageVersion, md5.Sum(holaInfoResp.Body.Bytes())),
"",
@@ -361,6 +525,21 @@ gAAAAP//MS06Gw==`)
MakeRequest(t, req, http.StatusOK)
})
+ t.Run("DeleteBinary", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ body := bytes.Buffer{}
+ writer := multipart.NewWriter(&body)
+ writer.WriteField("gem_name", binaryPackageName)
+ writer.WriteField("version", binaryPackageVersion)
+ writer.Close()
+
+ req := NewRequestWithBody(t, "DELETE", fmt.Sprintf("%s/api/v1/gems/yank", root), &body).
+ SetHeader("Content-Type", writer.FormDataContentType()).
+ AddBasicAuth(user.Name)
+ MakeRequest(t, req, http.StatusOK)
+ })
+
t.Run("Delete", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
From 72ee7f3b006f8cb5c1031a5607c87618e0609242 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Wed, 19 Mar 2025 16:45:42 +0000
Subject: [PATCH 22/32] fix: consider issues in repository accessible via
`access` table (#7270)
- Consider the following scenario: a private repository in an organization with a team that has no specific access to that repository. Members of that team are still able to visit the repository because of entries in the `access` table.
- Consider this specific scenario for the gathering of issues for project tables.
- Unit test added
- Resolves forgejo/forgejo#7217
- Ref: forgejo/forgejo#6843
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7270
Reviewed-by: Earl Warren
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Gusted
Co-committed-by: Gusted
---
.../TestPrivateRepoProjects/access.yml | 5 ++
.../TestPrivateRepoProjects/project.yml | 11 ++++
.../TestPrivateRepoProjects/project_board.yml | 8 +++
.../TestPrivateRepoProjects/project_issue.yml | 11 ++++
models/issues/issue_project_test.go | 54 +++++++++++++++++++
models/issues/issue_search.go | 3 ++
6 files changed, 92 insertions(+)
create mode 100644 models/fixtures/TestPrivateRepoProjects/access.yml
create mode 100644 models/fixtures/TestPrivateRepoProjects/project.yml
create mode 100644 models/fixtures/TestPrivateRepoProjects/project_board.yml
create mode 100644 models/fixtures/TestPrivateRepoProjects/project_issue.yml
diff --git a/models/fixtures/TestPrivateRepoProjects/access.yml b/models/fixtures/TestPrivateRepoProjects/access.yml
new file mode 100644
index 0000000000..4149e34b0b
--- /dev/null
+++ b/models/fixtures/TestPrivateRepoProjects/access.yml
@@ -0,0 +1,5 @@
+-
+ id: 1001
+ user_id: 29
+ repo_id: 3
+ mode: 1
diff --git a/models/fixtures/TestPrivateRepoProjects/project.yml b/models/fixtures/TestPrivateRepoProjects/project.yml
new file mode 100644
index 0000000000..f66e4c8676
--- /dev/null
+++ b/models/fixtures/TestPrivateRepoProjects/project.yml
@@ -0,0 +1,11 @@
+-
+ id: 1001
+ title: Org project that contains private issues
+ owner_id: 3
+ repo_id: 0
+ is_closed: false
+ creator_id: 2
+ board_type: 1
+ type: 3
+ created_unix: 1738000000
+ updated_unix: 1738000000
diff --git a/models/fixtures/TestPrivateRepoProjects/project_board.yml b/models/fixtures/TestPrivateRepoProjects/project_board.yml
new file mode 100644
index 0000000000..9829cf7e27
--- /dev/null
+++ b/models/fixtures/TestPrivateRepoProjects/project_board.yml
@@ -0,0 +1,8 @@
+-
+ id: 1001
+ project_id: 1001
+ title: Triage
+ creator_id: 2
+ default: true
+ created_unix: 1738000000
+ updated_unix: 1738000000
diff --git a/models/fixtures/TestPrivateRepoProjects/project_issue.yml b/models/fixtures/TestPrivateRepoProjects/project_issue.yml
new file mode 100644
index 0000000000..3e8c1dca9e
--- /dev/null
+++ b/models/fixtures/TestPrivateRepoProjects/project_issue.yml
@@ -0,0 +1,11 @@
+-
+ id: 1001
+ issue_id: 6
+ project_id: 1001
+ project_board_id: 1001
+
+-
+ id: 1002
+ issue_id: 15
+ project_id: 1001
+ project_board_id: 1001
diff --git a/models/issues/issue_project_test.go b/models/issues/issue_project_test.go
index e28b52128e..d724922946 100644
--- a/models/issues/issue_project_test.go
+++ b/models/issues/issue_project_test.go
@@ -117,3 +117,57 @@ func TestPrivateIssueProjects(t *testing.T) {
})
})
}
+
+func TestPrivateRepoProjects(t *testing.T) {
+ defer tests.AddFixtures("models/fixtures/TestPrivateRepoProjects/")()
+ require.NoError(t, unittest.PrepareTestDatabase())
+
+ org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
+ orgProject := unittest.AssertExistsAndLoadBean(t, &project.Project{ID: 1001, OwnerID: org.ID})
+ column := unittest.AssertExistsAndLoadBean(t, &project.Column{ID: 1001, ProjectID: orgProject.ID})
+
+ t.Run("Partial access", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ user29 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29})
+
+ issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user29, org, optional.None[bool]())
+ require.NoError(t, err)
+ assert.Len(t, issueList, 1)
+ assert.EqualValues(t, 6, issueList[0].ID)
+
+ issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, user29, org, optional.None[bool]())
+ require.NoError(t, err)
+ assert.EqualValues(t, 1, issuesNum)
+
+ issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user29, org, optional.Some(true))
+ require.NoError(t, err)
+ assert.EqualValues(t, 0, issuesNum)
+
+ issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user29, org, optional.Some(false))
+ require.NoError(t, err)
+ assert.EqualValues(t, 1, issuesNum)
+ })
+
+ t.Run("Full access", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
+
+ issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user2, org, optional.None[bool]())
+ require.NoError(t, err)
+ assert.Len(t, issueList, 2)
+ assert.EqualValues(t, 15, issueList[0].ID)
+ assert.EqualValues(t, 6, issueList[1].ID)
+
+ issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.None[bool]())
+ require.NoError(t, err)
+ assert.EqualValues(t, 2, issuesNum)
+
+ issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(true))
+ require.NoError(t, err)
+ assert.EqualValues(t, 0, issuesNum)
+
+ issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(false))
+ require.NoError(t, err)
+ assert.EqualValues(t, 2, issuesNum)
+ })
+}
diff --git a/models/issues/issue_search.go b/models/issues/issue_search.go
index 56c219af39..6592f3708c 100644
--- a/models/issues/issue_search.go
+++ b/models/issues/issue_search.go
@@ -341,6 +341,9 @@ func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *organizati
builder.Or(
repo_model.UserOrgUnitRepoCond(repoIDstr, userID, org.ID, unitType), // team member repos
repo_model.UserOrgPublicUnitRepoCond(userID, org.ID), // user org public non-member repos, TODO: check repo has issues
+ builder.And(
+ builder.In("issue.repo_id", builder.Select("id").From("repository").Where(builder.Eq{"owner_id": org.ID})),
+ repo_model.UserAccessRepoCond(repoIDstr, userID)), // user can access org repo in a unit independent way
),
)
}
From 5a7af0dae2ef1c7d18ea5ac53ae8682d9d0c28df Mon Sep 17 00:00:00 2001
From: Codeberg Translate
Date: Thu, 20 Mar 2025 14:55:14 +0000
Subject: [PATCH 23/32] i18n: update of translations from Codeberg Translate
Co-authored-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Baempaieo
Co-authored-by: Codeberg Translate
Co-authored-by: Edgarsons
Co-authored-by: EssGeeEich
Co-authored-by: Juno Takano
Co-authored-by: Zughy
Co-authored-by: banaanihillo
Co-authored-by: httpsterio
Co-authored-by: ozgur
Co-authored-by: tacaly
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/fi/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/da/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fi/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/it/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/lv/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/pt_BR/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ru/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/tr/
Translation: Forgejo/forgejo
Translation: Forgejo/forgejo-next
---
options/locale/locale_da.ini | 538 +++++++++++++++++++++++++-
options/locale/locale_fi-FI.ini | 35 +-
options/locale/locale_it-IT.ini | 62 +--
options/locale/locale_lv-LV.ini | 18 +-
options/locale/locale_pt-BR.ini | 36 +-
options/locale/locale_ru-RU.ini | 4 +-
options/locale/locale_tr-TR.ini | 8 +-
options/locale_next/locale_fi-FI.json | 9 +-
8 files changed, 640 insertions(+), 70 deletions(-)
diff --git a/options/locale/locale_da.ini b/options/locale/locale_da.ini
index 4a64cb858b..87bd4dae2b 100644
--- a/options/locale/locale_da.ini
+++ b/options/locale/locale_da.ini
@@ -58,7 +58,7 @@ your_profile = Profil
your_starred = Stjernemarkeret
your_settings = Indstillinger
passcode = Passcode
-repository = Repository
+repository = Depot
new_org.title = Ny organisation
new_repo.link = Nyt repository
new_migrate.link = Ny migration
@@ -109,7 +109,7 @@ artifacts = Artefakter
archived = Arkiveret
concept_system_global = Global
concept_user_individual = Individuel
-concept_code_repository = Repository
+concept_code_repository = Depot
concept_user_organization = Organisation
show_timestamps = Vis tidsstempler
show_log_seconds = Vis sekunder
@@ -2086,9 +2086,449 @@ activity.period.monthly = 1 måned
activity.period.halfweekly = 3 dage
activity.period.quarterly = 3 måneder
activity.period.semiyearly = 6 måneder
+activity.title.prs_1 = %d pull-anmodning
+activity.title.prs_merged_by = %s flettet af %s
+contributors.contribution_type.commits = Commits
+contributors.contribution_type.additions = Tilføjelser
+contributors.contribution_type.deletions = Sletninger
+settings = Indstillinger
+settings.federation_settings = Føderationsindstillinger
+settings.hooks = Webhooks
+activity.title.issues_created_by = %s oprettet af %s
+activity.new_issue_label = Åbnet
+activity.active_issues_count_n = %d aktive problemer
+activity.closed_issue_label = Lukket
+activity.commit = Commit aktivitet
+settings.collaboration = Samarbejdspartnere
+activity.git_stats_commit_n = %d commits
+activity.git_stats_files_changed_1 = er ændret
+activity.git_stats_files_changed_n = har ændret
+activity.git_stats_additions = og der har været
+settings.collaboration.admin = Administrator
+settings.collaboration.write = Skriv
+settings.federation_not_enabled = Føderation er ikke aktiveret på din instans.
+settings.mirror_settings.docs.pull_mirror_instructions = For at opsætte et pull-spejl, se venligst:
+settings.mirror_settings.docs.more_information_if_disabled = Du kan finde ud af mere om push and pull spejle her:
+activity.git_stats_deletion_1 = %d sletning
+activity.git_stats_pushed_n = havde pushed
+activity.title.unresolved_conv_1 = %d uafsluttet samtale
+activity.title.unresolved_conv_n = %d uafsluttede samtaler
+activity.git_stats_pushed_1 = har pushed
+contributors.contribution_type.filter_label = Bidrags type:
+settings.options = Depot
+settings.desc = Indstillinger er, hvor du kan administrere indstillingerne for depotet
+settings.collaboration.read = Læs
+settings.collaboration.owner = Ejer
+settings.collaboration.undefined = Udefineret
+settings.githooks = Git hooks
+settings.basic_settings = Grundlæggende indstillinger
+settings.mirror_settings.docs.disabled_push_mirror.instructions = Konfigurer dit projekt til automatisk at trække commits, tags og branches fra et andet depot.
+activity.title.prs_opened_by = %s foreslået af %s
+activity.merged_prs_label = Flettet
+activity.merged_prs_count_n = Flettede pull-anmodninger
+activity.title.prs_n = %d pull-anmodninger
+activity.opened_prs_label = Foreslået
+activity.active_issues_count_1 = %d aktivt problem
+activity.new_issues_count_1 = Nyt problem
+activity.new_issues_count_n = Nye problemer
+activity.git_stats_commit_1 = %d commit
+settings.federation_apapiurl = Føderations-URL for dette depot. Kopiér og indsæt dette i Federation Settings af et andet lager som en URL for et Følgende Depot.
+settings.mirror_settings.docs = Konfigurer dit depot til automatisk at synkronisere commits, tags og branches med et andet depot.
+settings.mirror_settings.docs.disabled_pull_mirror.instructions = Indstil dit projekt til automatisk at skubbe commits, tags og branches til et andet depot. Pull-spejle er blevet deaktiveret af din webstedsadministrator.
+settings.mirror_settings.docs.doc_link_pull_section = afsnittet "Trækker fra et fjerndepot" i dokumentationen.
+settings.mirror_settings.docs.pulling_remote_title = Trækker fra et fjerndepot
+settings.mirror_settings.mirrored_repository = Spejlet depot
+settings.mirror_settings.pushed_repository = Pushed depot
+settings.mirror_settings = Spejl indstillinger
+activity.closed_issues_count_n = Lukkede problemer
+activity.title.issues_1 = %d problem
+activity.title.issues_n = %d problemer
+activity.title.issues_closed_from = %s lukket af %s
+activity.closed_issues_count_1 = Lukket problem
+settings.federation_following_repos = URL'er for følgende depoter. Adskilt af ";", ingen mellemrum.
+settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = Lige nu kan dette kun gøres i menuen "Ny migration". For mere information, kontakt venligst:
+settings.mirror_settings.docs.disabled_push_mirror.info = Push-spejle er blevet deaktiveret af din webstedsadministrator.
+settings.mirror_settings.docs.no_new_mirrors = Dit depot spejler ændringer til eller fra et andet depot. Husk på, at du ikke kan oprette nye spejle på nuværende tidspunkt.
+settings.mirror_settings.docs.can_still_use = Selvom du ikke kan ændre eksisterende spejle eller oprette nye, kan du stadig bruge dit eksisterende spejle.
+settings.mirror_settings.docs.doc_link_title = Hvordan spejler jeg depoter?
+activity.active_prs_count_1 = %d aktiv pull-anmodning
+activity.active_prs_count_n = %d aktive pull-anmodninger
+activity.merged_prs_count_1 = Sammenflettet pull-anmodning
+activity.opened_prs_count_1 = Foreslået pull anmodning
+activity.opened_prs_count_n = Foreslåede pull-anmodninger
+activity.title.user_n = %d brugere
+activity.title.user_1 = %d bruger
+activity.published_prerelease_label = Før-udgivelse
+activity.published_tag_label = Tag
+activity.no_git_activity = Der har ikke været nogen commit-aktivitet i denne periode.
+activity.git_stats_exclude_merges = Med undtagelse af fletninger,
+activity.git_stats_author_1 = %d forfatter
+activity.git_stats_author_n = %d forfattere
+activity.git_stats_addition_1 = %d tilføjelse
+activity.git_stats_deletion_n = %d sletninger
+activity.git_stats_and_deletions = og
+activity.git_stats_addition_n = %d tilføjelser
+settings.event_repository = Depot
+activity.unresolved_conv_desc = Disse nyligt ændrede problemer og pull-anmodninger er ikke blevet løst endnu.
+activity.git_stats_push_to_branch = til %s og
+activity.git_stats_push_to_all_branches = til alle grene.
+activity.git_stats_on_default_branch = På %s,
+activity.git_stats_file_1 = %d fil
+activity.git_stats_file_n = %d filer
+settings.mirror_settings.push_mirror.remote_url = Git-URL for fjerndepot
+settings.external_tracker_url = Eksternt problem tracker URL
+settings.admin_enable_health_check = Aktiver depot sundheds checks (git fsck)
+settings.external_tracker_url_desc = Besøgende omdirigeres til den eksterne problemsporings-URL, når de klikker på problemer-fanen.
+settings.mirror_settings.push_mirror.none = Der er ikke konfigureret push-spejle
+settings.mirror_settings.push_mirror.add = Tilføj push spejl
+settings.mirror_settings.push_mirror.edit_sync_time = Rediger spejlsynkroniseringsinterval
+settings.mirror_settings.last_update = Sidste opdatering
+settings.update_settings = Gem indstillinger
+settings.admin_settings = Administratorindstillinger
+settings.tracker_issue_style.regexp_pattern_desc = Den første fangede gruppe vil blive brugt i stedet for {index}.
+settings.actions_desc = Aktiver integrerede CI/CD-pipelines med Forgejo Actions
+settings.reindex_requested = Genindeks anmodet
+settings.external_wiki_url = Ekstern wiki-URL
+settings.tracker_issue_style = Eksternt problem tracker Nummerformat
+settings.tracker_issue_style.alphanumeric = Alfanumerisk
+settings.tracker_issue_style.regexp = Regulært udtryk
+settings.pulls_desc = Aktiver depot pull-anmodninger
+settings.pulls.default_allow_edits_from_maintainers = Tillad som standard redigeringer fra vedligeholdere
+settings.admin_code_indexer = Kodeindekserer
+settings.admin_indexer_unindexed = Uindekseret
+settings.admin_enable_close_issues_via_commit_in_any_branch = Luk et problem via en commit lavet i en ikke-standard filial
+settings.mirror_settings.direction = Retning
+settings.mirror_settings.direction.pull = Pull
+settings.mirror_settings.direction.push = Push
+settings.event_push = Push
+settings.units.units = Enheder
+settings.mirror_settings.push_mirror.copy_public_key = Kopier offentlig nøgle
+settings.update_mirror_settings = Opdater spejlindstillinger
+settings.wiki_desc = Aktiver depot wiki
+settings.use_internal_wiki = Brug indbygget wiki
+settings.use_external_wiki = Brug ekstern wiki
+settings.external_wiki_url_desc = Besøgende omdirigeres til den eksterne wiki-URL, når de klikker på wiki-fanen.
+settings.issues_desc = Aktiver depotproblemsporing
+settings.use_internal_issue_tracker = Brug indbygget problem tracker
+settings.use_external_issue_tracker = Brug ekstern problemsporing
+settings.tracker_url_format = Eksternt problem tracker URL-format
+settings.tracker_url_format_error = Det eksterne problemsporings-URL-format er ikke en gyldig URL.
+settings.external_tracker_url_error = Den eksterne problemsporings-URL er ikke en gyldig URL.
+settings.external_wiki_url_error = Den eksterne wiki-URL er ikke en gyldig URL.
+settings.reindex_button = Tilføj til genindekskø
+settings.mirror_settings.push_mirror.none_ssh = Intet
+settings.sync_mirror = Synkroniser nu
+settings.pull_mirror_sync_in_progress = Trækker ændringer fra remote %s i øjeblikket.
+settings.pull_mirror_sync_quota_exceeded = Kvoten overskredet, ingen ændringer.
+settings.push_mirror_sync_in_progress = Pusher ændringer til remote %s i øjeblikket.
+settings.branches.switch_default_branch = Skift standardgren
+settings.branches.update_default_branch = Opdater standardgren
+settings.branches.add_new_rule = Tilføj ny regel
+settings.advanced_settings = Avancerede indstillinger
+settings.wiki_globally_editable = Tillad enhver at redigere wikien
+settings.tracker_issue_style.numeric = Numerisk
+settings.tracker_issue_style.regexp_pattern = Regulært udtryksmønster
+settings.allow_only_contributors_to_track_time = Lad kun bidragydere spore tid
+settings.pulls.enable_autodetect_manual_merge = Aktiver automatisk manuel fletning (Bemærk: I nogle særlige tilfælde kan fejlvurderinger forekomme)
+settings.pulls.ignore_whitespace = Ignorer mellemrum for konflikter
+settings.projects_desc = Aktiver depot-projekter
+settings.admin_stats_indexer = Kode statistik indekserer
+settings.tracker_url_format_desc = Brug pladsholderne {user}, {repo} og {index} til brugernavn, depotnavn og problemindeks.
+settings.enable_timetracker = Aktiver tidsregistrering
+settings.releases_desc = Aktiver depotudgivelser
+settings.packages_desc = Aktiver depotpakkeregistrering
+settings.danger_zone = Farezone
+settings.pulls.default_delete_branch_after_merge = Slet pull request-gren efter fletning som standard
+settings.default_update_style_desc = Standard opdateringsstil, der bruges til at opdatere pull-anmodninger, der ligger bag basisgrenen.
+settings.event_push_desc = Git push til et depot.
+settings.site = Websted
+settings.admin_indexer_commit_sha = Sidste indekserede commit
+settings.pulls.allow_rebase_update = Aktiver opdatering af pull request-gren ved rebase
+settings.trust_model.default = Standard tillidsmodel
+settings.transfer_desc = Overfør dette depot til en bruger eller til en organisation, som du har administratorrettigheder til.
+settings.enter_repo_name = Indtast ejer- og depotnavnet nøjagtigt som vist:
+settings.convert_notices_1 = Denne handling vil konvertere spejlet til et almindeligt depot og kan ikke fortrydes.
+settings.transfer.success = Overførsel af depot var vellykket.
+settings.convert_fork_confirm = Konverter depot
+settings.convert_fork_succeed = Forken er omdannet til et almindeligt depot.
+settings.transfer_abort = Annullere overførsel
+settings.transfer_abort_invalid = Du kan ikke annullere en ikke-eksisterende depotoverførsel.
+settings.transfer_abort_success = Depot overførslen til %s blev annulleret.
+settings.transfer_perform = Udfør overførslen
+settings.wiki_rename_branch_main_desc = Omdøb grenen, der bruges internt af Wiki, til "%s". Denne ændring er permanent og kan ikke fortrydes.
+settings.trust_model.collaboratorcommitter.long = Collaborator+Committer: Stol på underskrifter fra samarbejdspartnere, der matcher forpligteren
+settings.wiki_delete = Slet wiki-data
+settings.wiki_delete_notices_1 = - Dette vil permanent slette og deaktivere depot-wikien for %s.
+settings.wiki_branch_rename_failure = Det lykkedes ikke at normalisere depotwikiens filialnavn.
+settings.add_collaborator_duplicate = Samarbejdspartneren er allerede føjet til dette depot.
+settings.add_collaborator_owner = Kan ikke tilføje en ejer som samarbejdspartner.
+settings.collaborator_deletion = Fjern Samarbejdspartner
+settings.collaborator_deletion_desc = Fjernelse af en samarbejdspartner vil tilbagekalde deres adgang til dette depot. Vil du fortsætte?
+settings.add_team_duplicate = Teamet har allerede depotet
+settings.add_collaborator_blocked_our = Samarbejdspartneren kan ikke tilføjes, fordi depots ejer har blokeret dem.
+settings.add_collaborator_blocked_them = Samarbejdspartneren kan ikke tilføjes, fordi de har blokeret depot ejeren.
+settings.delete_collaborator = Slet
+settings.trust_model.collaboratorcommitter = Samarbejdspartner+Committer
+settings.convert_confirm = Konverter depot
+settings.trust_model = Signatur tillidsmodel
+settings.trust_model.collaborator.desc = Gyldige signaturer fra samarbejdspartnere af dette depot vil blive markeret som "pålidelige" - (uanset om de matcher committeren eller ej). Ellers vil gyldige signaturer blive markeret som "upålidelige", hvis signaturen matcher committeren og "umatchede", hvis ikke.
+settings.wiki_rename_branch_main = Normaliser Wiki-grenens navn
+settings.wiki_rename_branch_main_notices_1 = Denne handling KAN IKKE fortrydes.
+settings.wiki_deletion_success = Depot-wiki-dataene er blevet slettet.
+settings.delete_notices_1 = - Denne handling KAN IKKE fortrydes.
+settings.delete = Slet dette depot
+settings.deletion_success = Depotet er blevet slettet.
+settings.add_collaborator_success = Samarbejdspartneren er tilføjet.
+settings.transfer_in_progress = Der er i øjeblikket en igangværende overførsel. Annuller det, hvis du vil overføre dette depot til en anden bruger.
+settings.transfer_notices_3 = - Hvis depotet er privat og overføres til en individuel bruger, sikrer denne handling, at brugeren har mindst læsetilladelse (og ændrer tilladelser, hvis det er nødvendigt).
+settings.transfer_started = Dette depot er blevet markeret til overførsel og afventer bekræftelse fra "%s"
+settings.signing_settings = Indstillinger for signering af bekræftelse
+settings.trust_model.committer.long = Committer: Stol på signaturer, der matcher committers (dette matcher GitHub og vil tvinge Forgejo underskrevne commits til at have Forgejo som committer)
+settings.trust_model.committer.desc = Gyldige signaturer vil kun blive markeret som "trusted", hvis de matcher committeren, ellers vil de blive markeret "unmatched". Dette tvinger Forgejo til at være committer på underskrevne commits med den faktiske committer markeret som Co-authored-by: og Co-committed-by: trailer i commit. Forgejo-nøglen skal matche en bruger i databasen.
+settings.delete_notices_fork_1 = - Forks af dette depot bliver uafhængige efter sletning.
+settings.remove_collaborator_success = Samarbejdspartneren er blevet fjernet.
+settings.remove_team_success = Teamets adgang til depotet er blevet fjernet.
+settings.delete_notices_2 = - Denne handling vil permanent slette %s-depotet, inklusive kode, problemer, kommentarer, wiki-data og samarbejdspartnerindstillinger.
+settings.convert_succeed = Spejlet er blevet omdannet til et almindeligt depot.
+settings.convert_fork_desc = Du kan konvertere denne gaffel til et almindeligt depot. Dette kan ikke fortrydes.
+settings.convert_fork_notices_1 = Denne operation vil konvertere forken til et almindeligt depot og kan ikke fortrydes.
+settings.transfer.rejected = Depotoverførsel blev afvist.
+settings.transfer.title = Overfør ejerskab
+settings.transfer.button = Overfør ejerskab
+settings.transfer.modal.title = Overfør ejerskab
+settings.confirmation_string = Bekræftelsesstreng
+settings.transfer_owner = Nye ejer
+settings.transfer_notices_2 = - Du beholder adgangen til depotet, hvis du overfører det til en organisation, som du (med)ejer.
+settings.transfer_succeed = Depotet er blevet overført.
+settings.transfer_quota_exceeded = Den nye ejer (%s) er over kvoten. Depotet er ikke blevet overført.
+settings.trust_model.collaborator = Samarbejdspartner
+settings.trust_model.collaborator.long = Samarbejdspartner: Tillid til underskrifter fra samarbejdspartnere
+settings.trust_model.default.desc = Brug standard depottillidsmodellen til denne installation.
+settings.wiki_rename_branch_main_notices_2 = Dette vil permanent omdøbe den interne gren af %s' depot wiki. Eksisterende checkouts skal opdateres.
+settings.confirm_wiki_branch_rename = Omdøb wiki-grenen
+settings.confirm_wiki_delete = Slet wiki-data
+settings.delete_desc = Sletning af et depot er permanent og kan ikke fortrydes.
+settings.confirm_delete = Slet depot
+settings.add_collaborator = Tilføj samarbejdspartner
+settings.update_settings_success = Depotingsindstillingerne er blevet opdateret.
+settings.update_settings_no_unit = Depotet bør tillade mindst en form for interaktion.
+settings.add_collaborator_inactive_user = Kan ikke tilføje en inaktiv bruger som samarbejdspartner.
+settings.add_team_success = Teamet har nu adgang til depotet.
+settings.change_team_permission_tip = Teamets tilladelse er angivet på teamindstillingssiden og kan ikke ændres pr. depot
+settings.delete_team_tip = Dette team har adgang til alle depoter og kan ikke fjernes
+settings.org_not_allowed_to_be_collaborator = Organisationer kan ikke tilføjes som samarbejdspartner.
+settings.change_team_access_not_allowed = Ændring af teamadgang til depot er begrænset til organisationsejeren
+settings.team_not_in_organization = Teamet er ikke i samme organisation som depotet
+settings.add_webhook = Tilføj webhook
+settings.new_owner_has_same_repo = Den nye ejer har allerede et depot med samme navn. Vælg venligst et andet navn.
+settings.new_owner_blocked_doer = Den nye ejer har blokeret dig.
+settings.convert_desc = Du kan konvertere dette spejl til et almindeligt depot. Dette kan ikke fortrydes.
+settings.convert = Konverter til et almindeligt depot
+settings.transfer_notices_1 = - Du mister adgangen til depotet, hvis du overfører det til en individuel bruger.
+settings.wiki_delete_desc = Sletning af depot wiki-data er permanent og kan ikke fortrydes.
+settings.trust_model.committer = Committer
+settings.trust_model.collaboratorcommitter.desc = Gyldige signaturer fra samarbejdspartnere af dette depot vil blive markeret som "pålidelige", hvis de matcher committeren. Ellers vil gyldige signaturer blive markeret som "upålidelige", hvis signaturen matcher committeren og "umatchede" ellers. Dette vil tvinge Forgejo til at blive markeret som committer på underskrevne commits med den faktiske committer markeret som Co-Authored-By: og Co-Committed-By: trailer i commit. Forgejo-nøglen skal matche en bruger i databasen.
+settings.add_team = Tilføj team
+settings.convert_fork = Konverter til almindeligt depot
+settings.wiki_branch_rename_success = Depot-wikiens filialnavn er blevet normaliseret.
+settings.add_webhook.invalid_channel_name = Webhook-kanalnavnet må ikke være tomt og må ikke kun indeholde et #-tegn.
+settings.webhook_deletion = Fjern webhook
+settings.hooks_desc = Webhooks foretager automatisk HTTP POST-anmodninger til en server, når visse Forgejo-hændelser udløses. Læs mere i webhooks-guiden.
+settings.add_webhook.invalid_path = Sti må ikke indeholde en del, der er "." eller ".." eller den tomme streng. Det kan ikke starte eller slutte med en skråstreg.
+settings.webhook_deletion_desc = Fjernelse af en webhook sletter dens indstillinger og leveringshistorik. Vil du fortsætte?
+settings.event_pull_request_assign = Tildeling
+settings.event_delete = Slet
+settings.event_delete_desc = Gren eller tag slettet.
+settings.event_fork = Fork
+settings.event_release_desc = Udgivelse offentliggjort, opdateret eller slettet i et depot.
+settings.event_pull_request_comment_desc = Pull-anmodning om kommentar oprettet, redigeret eller slettet.
+settings.event_pull_request_review = Anmeldelser
+settings.event_push_only = Push events
+settings.event_header_pull_request = Træk anmodnings events
+settings.event_pull_request_milestone_desc = Milepæl tilføjet, fjernet eller ændret.
+settings.event_pull_request_label_desc = Pull-anmodnings etiketter tilføjet eller fjernet.
+settings.slack_icon_url = Icon URL
+settings.discord_icon_url.exceeds_max_length = Ikonets URL skal være mindre end eller lig med 2048 tegn
+settings.event_desc = Trigger på:
+settings.event_send_everything = Alle events
+settings.event_choose = Tilpassede begivenheder…
+settings.web_hook_name_msteams = Microsoft Teams
+settings.web_hook_name_feishu = Feishu / Lark Suite
+settings.web_hook_name_feishu_only = Feishu
+settings.event_issue_label_desc = Problem etiketter tilføjet eller fjernet.
+settings.event_issue_milestone = Milepæle
+settings.event_pull_request_comment = Kommentarer
+settings.event_pull_request_assign_desc = Pull-anmodning tildelt eller ikke tildelt.
+settings.protect_status_check_matched = Matchet
+branch.deletion_success = Gren "%s" er blevet slettet.
+branch.deletion_failed = Kunne ikke slette grenen "%s".
+settings.event_create_desc = Gren eller tag oprettet.
+settings.event_header_repository = Depot events
+settings.event_create = Opret
+settings.event_pull_request = Modifikation
+settings.event_pull_request_desc = Pull-anmodning åbnet, lukket, genåbnet eller redigeret.
+settings.event_issue_assign = Tildeling
+settings.event_issues_desc = Problem åbnet, lukket, genåbnet eller redigeret.
+settings.event_issue_comment_desc = Problem kommentar oprettet, redigeret eller slettet.
+settings.webhook_deletion_success = Webhook er blevet fjernet.
+settings.web_hook_name_telegram = Telegram
+settings.webhook.headers = Headers
+settings.webhook.response = Svar
+settings.webhook.request = Anmod
+settings.event_pull_request_sync = Synkroniseret
+settings.slack_color = Farve
+settings.event_issues = Modifikation
+settings.event_issue_assign_desc = Problem tildelt eller ikke tildelt.
+settings.event_issue_milestone_desc = Milepæl tilføjet, fjernet eller ændret.
+settings.event_issue_comment = Kommentarer
+settings.event_repository_desc = Depot oprettet eller slettet.
+settings.event_header_issue = Problem events
+settings.event_fork_desc = Depot forked.
+branch.delete_head = Slet
+branch.delete = Slet gren "%s"
+branch.delete_html = Slet gren
+branch.delete_desc = Sletning af en gren er permanent. Selvom den slettede gren kan fortsætte med at eksistere i kort tid, før den rent faktisk bliver fjernet, KAN den i de fleste tilfælde IKKE fortrydes. Vil du fortsætte?
+settings.event_pull_request_milestone = Milepæle
+settings.webhook.test_delivery = Test levering
+settings.webhook.test_delivery_desc = Test denne webhook med en falsk begivenhed.
+settings.webhook.test_delivery_desc_disabled = For at teste denne webhook med en falsk begivenhed skal du aktivere den.
+settings.update_webhook = Opdatere webhook
+settings.discord_icon_url = Icon URL
+settings.web_hook_name_wechatwork = WeCom (Wechat Work)
+settings.web_hook_name_packagist = Packagist
+settings.packagist_username = Packagist brugernavn
+settings.packagist_api_token = API token
+settings.web_hook_name_matrix = Matrix
+settings.web_hook_name_larksuite_only = Lark Suite
+settings.update_hook_success = Webhook er blevet opdateret.
+settings.sourcehut_builds.secrets_helper = Giv jobbet adgang til byggehemmelighederne (kræver SECRETS:RO-bevillingen)
+settings.sourcehut_builds.access_token_helper = Adgangstoken, der har JOBS:RW-bevilling. Generer et builds.sr.ht-token eller et builds.sr.ht-token med hemmelig adgang på meta.sr.ht.
+settings.protect_approvals_whitelist_enabled_desc = Kun anmeldelser fra hvidlistede brugere eller teams tæller med til de påkrævede godkendelser. Uden hvidliste for godkendelse tæller anmeldelser fra alle med skriveadgang til de påkrævede godkendelser.
+settings.protect_protected_file_patterns_desc = Beskyttede filer må ikke ændres direkte, selvom brugeren har rettigheder til at tilføje, redigere eller slette filer i denne gren. Flere mønstre kan adskilles ved hjælp af semikolon (";"). Se dokumentationen til %[2]s for mønstersyntaks. Eksempler: .drone.yml, /docs/**/*.txt.
+settings.protect_unprotected_file_patterns_desc = Ubeskyttede filer, der må ændres direkte, hvis brugeren har skriveadgang, uden at push-begrænsning. Flere mønstre kan adskilles ved hjælp af semikolon (";"). Se dokumentationen til %[2]s for mønstersyntaks. Eksempler: .drone.yml, /docs/**/*.txt.
+settings.block_rejected_reviews_desc = Fletning vil ikke være mulig, når der anmodes om ændringer af officielle korrekturlæsere, selvom der er tilstrækkelige godkendelser.
+settings.event_pull_request_review_desc = Pull-anmodning godkendt, afvist, eller gennemgå kommentarer tilføjet.
+settings.event_pull_request_review_request_desc = Pull-anmodning gennemgang anmodet eller gennemgang anmodning fjernet.
+settings.event_pull_request_approvals = Pull-anmodningsgodkendelser
+settings.event_pull_request_merge = Pull-anmodning flet
+settings.event_pull_request_enforcement = Håndhævelse
+settings.event_package_desc = Pakke oprettet eller slettet i et depot.
+settings.branch_filter = Gren filter
+settings.branch_filter_desc = Grenhvidliste til push, grenoprettelse og grensletningshændelser, angivet som globmønster. Hvis den er tom eller *, rapporteres hændelser for alle filialer. Se dokumentationen til %[2]s for syntaks. Eksempler: master, {master,release*}.
+settings.active = Aktiv
+settings.active_helper = Oplysninger om udløste hændelser vil blive sendt til denne webhook-URL.
+settings.add_hook_success = Webhook er tilføjet.
+settings.hook_type = Hook type
+settings.slack_token = Token
+settings.slack_domain = Domæne
+settings.add_web_hook_desc = Integrer %s i dit depot.
+settings.graphql_url = GraphQL URL
+settings.dismiss_stale_approvals_desc = Når nye commits, der ændrer indholdet af pull-anmodningen, skubbes til filialen, vil gamle godkendelser blive afvist.
+settings.require_signed_commits_desc = Afvis push til denne gren, hvis de er usignerede eller ikke kan verificeres.
+settings.protect_branch_name_pattern = Beskyttet gren navn mønster
+settings.protect_branch_name_pattern_desc = Beskyttede gren navne mønstre. Se dokumentationen for mønstersyntaks. Eksempler: main, release/**
+settings.block_on_official_review_requests_desc = Sammenlægning vil ikke være mulig, når den har officielle anmodninger om gennemgang, selvom der er tilstrækkelige godkendelser.
+settings.block_outdated_branch = Bloker fletning, hvis pull-anmodning er forældet
+settings.block_outdated_branch_desc = Fletning vil ikke være mulig, når hovedgrenen er bagved basisgrenen.
+settings.tags.protection.pattern = Tag mønster
+settings.slack_channel = Kanal
+settings.web_hook_name_gitea = Gitea
+settings.web_hook_name_forgejo = Forgejo
+settings.web_hook_name_gogs = Gogs
+settings.protect_merge_whitelist_committers = Aktiver flet hvidliste
+settings.protect_merge_whitelist_committers_desc = Tillad kun hvidlistede brugere eller teams at flette pull-anmodninger ind i denne gren.
+settings.protect_status_check_patterns_desc = Indtast mønstre for at angive, hvilke statuskontroller der skal bestå, før grene kan flettes til en gren, der matcher denne regel. Hver linje angiver et mønster. Mønstre må ikke være tomme.
+settings.protect_no_valid_status_check_patterns = Ingen gyldige statuskontrolmønstre.
+settings.protect_required_approvals = Krævede godkendelser
+settings.protect_required_approvals_desc = Tillad kun at flette pull-anmodning med nok positive anmeldelser.
+settings.protect_approvals_whitelist_enabled = Begræns godkendelser til hvidlistede brugere eller teams
+settings.protect_approvals_whitelist_users = Hvidlistede anmeldere
+settings.protect_approvals_whitelist_teams = Hvidlistede hold til anmeldelser
+settings.dismiss_stale_approvals = Afvis forældede godkendelser
+settings.remove_protected_branch_failed = Fjernelse af grenbeskyttelsesreglen "%s" mislykkedes.
+settings.protected_branch_deletion = Slet grenbeskyttelse
+settings.protected_branch_deletion_desc = Deaktivering af grenbeskyttelse giver brugere med skrivetilladelse mulighed for at push til grenen. Vil du fortsætte?
+settings.enforce_on_admins_desc = Depotadministratorer kan ikke omgå denne regel.
+settings.block_rejected_reviews = Bloker fletning på afviste anmeldelser
+settings.block_on_official_review_requests = Bloker fletning på officielle anmodninger om gennemgang
+settings.protected_branch_required_rule_name = Påkrævet regelnavn
+settings.protected_branch_duplicate_rule_name = Der er allerede en regel for dette sæt af grene
+settings.tags.protection.allowed = Tilladt
+settings.tags.protection.allowed.users = Tilladte brugere
+settings.event_pull_request_sync_desc = Gren opdateres automatisk med målgren.
+settings.event_pull_request_review_request = Gennemse forespørgsler
+settings.web_hook_name_discord = Discord
+settings.web_hook_name_dingtalk = DingTalk
+settings.protect_check_status_contexts_desc = Kræv statustjek for at bestå før fletning. Når det er aktiveret, skal commits først skubbes til en anden gren, derefter flettes eller skubbes direkte til en gren, der matcher denne regel, efter statustjek er bestået. Hvis ingen kontekster matches, skal den sidste commit være vellykket uanset kontekst.
+settings.protect_check_status_contexts_list = Statustjek fundet i den sidste uge for dette depot
+settings.protect_protected_file_patterns = Beskyttede filmønstre (adskilt med semikolon ";")
+settings.protect_unprotected_file_patterns = Ubeskyttede filmønstre (adskilt med semikolon ";")
+settings.update_protect_branch_success = Filialbeskyttelse for reglen "%s" er blevet opdateret.
+settings.default_branch_desc = Vælg en standardlagergren for pull-anmodninger og kode commits:
+settings.default_merge_style_desc = Standard flettestil
+settings.no_protected_branch = Der er ingen beskyttede grene.
+settings.edit_protected_branch = Redigere
+settings.protected_branch_required_approvals_min = Påkrævede godkendelser kan ikke være negative.
+settings.tags.protection = Tag beskyttelse
+release.edit = Redigere
+settings.event_package = Pakke
+settings.authorization_header_desc = Vil blive inkluderet som autorisationshoved for anmodninger, når de er til stede. Eksempler: %s.
+settings.delete_webhook = Fjern webhook
+settings.recent_deliveries = Seneste leverancer
+settings.deploy_key_deletion_desc = Fjernelse af en deploy nøgle vil tilbagekalde dens adgang til dette depot. Vil du fortsætte?
+settings.merge_style_desc = Flettestil
+settings.choose_branch = Vælg en gren…
+settings.tags = Tags
+settings.protected_branch = Gren beskyttelse
+settings.protected_branch.save_rule = Gem regel
+settings.protect_whitelist_teams = Hvidlistede hold til at skubbe
+settings.protect_patterns = Mønstre
+settings.web_hook_name_slack = Slack
+settings.packagist_package_url = Packagist-pakke-URL
+settings.web_hook_name_sourcehut_builds = SourceHut Builds
+settings.sourcehut_builds.manifest_path = Build manifest sti
+settings.sourcehut_builds.visibility = Jobsynlighed
+settings.sourcehut_builds.secrets = Hemmeligheder
+settings.authorization_header = Autorisationshoved
+settings.deploy_keys = Deploy nøgler
+settings.add_deploy_key = Tilføj deploy nøgle
+settings.deploy_key_desc = Deploy nøgler har skrivebeskyttet pull-adgang til depotet.
+settings.is_writable = Aktiver skriveadgang
+settings.is_writable_info = Tillad denne deploy nøgle at skubbe til depotet.
+settings.no_deploy_keys = Der er ingen deploy nøgler endnu.
+settings.key_been_used = En deploy nøgle med identisk indhold er allerede i brug.
+settings.key_name_used = En deploy nøgle med identisk navn er allerede i brug.
+settings.add_key_success = Deploy nøglen "%s" er blevet tilføjet.
+settings.deploy_key_deletion = Slet deploy nøglen
+settings.deploy_key_deletion_success = Deploy nøglen er blevet slettet.
+settings.branches = Grene
+settings.protected_branch.delete_rule = Slet regel
+settings.branch_protection = Beskyttelsesregler for grenen "%s"
+settings.protect_new_rule = Opret en ny gren beskyttelsesregel
+settings.protect_disable_push = Deaktiver push
+settings.protect_disable_push_desc = Ingen push vil være tilladt til denne gren.
+settings.protect_enable_push = Aktiver push
+settings.protect_enable_push_desc = Enhver med skriveadgang får lov til at pushe til denne gren (men ikke tvinge push).
+settings.protect_enable_merge = Aktiver fletning
+settings.protect_enable_merge_desc = Enhver med skriveadgang får lov til at flette pull-anmodningerne ind i denne gren.
+settings.protect_whitelist_committers = Hvidliste begrænset push
+settings.protect_whitelist_committers_desc = Kun hvidlistede brugere eller hold vil få lov til at pushe til denne gren (men ikke tvinge push).
+settings.protect_whitelist_deploy_keys = Whitelist deploy nøgler med skriveadgang til push.
+settings.protect_whitelist_users = Hvidlistede brugere til at skubbe
+settings.protect_merge_whitelist_users = Hvidlistede brugere til fletning
+settings.protect_merge_whitelist_teams = Hvidlistede hold til fletning
+settings.protect_check_status_contexts = Aktiver statuskontrol
+settings.protect_status_check_patterns = Statuskontrolmønstre
+settings.protect_invalid_status_check_pattern = Ugyldigt statuskontrolmønster: "%s".
+settings.ignore_stale_approvals = Ignorer forældede godkendelser
+settings.ignore_stale_approvals_desc = Tæl ikke godkendelser, der er foretaget på ældre commits (gamle anmeldelser) med, hvor mange godkendelser PR'en har. Irrelevant, hvis uaktuelle anmeldelser allerede er afvist.
+settings.require_signed_commits = Kræv underskrevne commits
+settings.remove_protected_branch_success = Grenbeskyttelse for reglen "%s" er blevet fjernet.
+settings.enforce_on_admins = Håndhæv denne regel for depotadministratorer
[notification]
watching = Overvåger
+read = Læs
[action]
watched_repo = begyndte at overvåge %[2]s
@@ -2100,6 +2540,27 @@ teams = Teams
members = Medlemmer
org_desc = Beskrivelse
team_desc = Beskrivelse
+teams.read_access = Læs
+members.owner = Ejer
+settings.options = Organisation
+settings.full_name = Fulde navn
+teams.settings = Indstillinger
+teams.no_desc = Dette team har ingen beskrivelse
+teams.write_access = Skriv
+teams.admin_access = Administrator adgang
+teams.admin_access_helper = Medlemmer kan trække og skubbe til teamdepoter og tilføje samarbejdspartnere til dem.
+settings = Indstillinger
+settings.repoadminchangeteam = Depotsadministrator kan tilføje og fjerne adgang for teams
+settings.visibility.public = Offentlig
+settings.visibility.private = Privat (kun synlig for organisationsmedlemmer)
+settings.visibility.limited_shortname = Begrænset
+settings.visibility.limited = Begrænset (kun synlig for brugere, der er logget ind)
+settings.visibility.private_shortname = Privat
+settings.website = Websted
+settings.location = Lokation
+settings.permission = Tilladelser
+settings.visibility = Synlighed
+members.remove = Slet
[admin]
orgs.members = Medlemmer
@@ -2110,14 +2571,87 @@ emails.filter_sort.name = Brugernavn
notices.desc = Beskrivelse
config.db_user = Brugernavn
users.name = Brugernavn
+emails.activated = Aktiveret
+packages.repository = Depot
+config.mailer_enabled = Aktiveret
+emails.filter_sort.email = Email
+auths.name = Navn
+config.mailer_name = Navn
+auths.enabled = Aktiveret
+config_settings = Indstillinger
+config.ssh_enabled = Aktiveret
+config.lfs_enabled = Aktiveret
+monitor.name = Navn
+config.oauth_enabled = Aktiveret
+orgs.name = Navn
+repos.owner = Ejer
+packages.name = Navn
+packages.owner = Ejer
+notices.type_1 = Depot
+config.db_name = Navn
+users.full_name = Fulde navn
+users.activated = Aktiveret
+repos.name = Navn
+monitor.queue.name = Navn
+repos.private = Privat
+config.default_enable_timetracking = Aktiver tidsregistrering som standard
+config.enable_timetracking = Aktiver tidsregistrering
+config.default_allow_only_contributors_to_track_time = Lad kun bidragydere spore tid
+config.allow_dots_in_usernames = Tillad brugere at bruge prikker i deres brugernavne. Påvirker ikke eksisterende konti.
+auths.oauth2_icon_url = Icon URL
+users.edit = Redigere
+users.auth_source = Godkendelseskilde
[packages]
arch.version.description = Beskrivelse
container.labels = Etiketter
+rubygems.dependencies.development = Udviklingsafhængigheder
+conan.details.repository = Depot
+conan.registry = Konfigurer dette register fra kommandolinjen:
+rubygems.dependencies.runtime = Kørselsafhængigheder
+rubygems.install = For at installere pakken ved hjælp af gem skal du køre følgende kommando:
+debian.repository = Depot info
+npm.details.tag = Tag
+chef.install = For at installere pakken skal du køre følgende kommando:
+alpine.repository.architectures = Arkitekturer
+composer.dependencies.development = Udviklingsafhængigheder
+alt.repository.multiple_groups = Denne pakke er tilgængelig i flere grupper.
+owner.settings.cleanuprules.enabled = Aktiveret
+helm.registry = Konfigurer dette register fra kommandolinjen:
+alt.registry.install = For at installere pakken skal du køre følgende kommando:
+helm.install = For at installere pakken skal du køre følgende kommando:
+alt.repository.architectures = Arkitekturer
+swift.registry = Konfigurer dette register fra kommandolinjen:
+npm.dependencies.bundle = Samlede afhængigheder
+debian.registry = Konfigurer dette register fra kommandolinjen:
+cran.install = For at installere pakken skal du køre følgende kommando:
+debian.install = For at installere pakken skal du køre følgende kommando:
+pub.install = For at installere pakken ved hjælp af Dart skal du køre følgende kommando:
+pypi.requires = Kræver Python
+nuget.registry = Konfigurer dette register fra kommandolinjen:
+debian.repository.distributions = Fordelinger
+debian.repository.components = Komponenter
+debian.repository.architectures = Arkitekturer
+rpm.repository.multiple_groups = Denne pakke er tilgængelig i flere grupper.
+rubygems.install2 = eller føj det til Gemfilen:
+npm.dependencies.development = Udviklingsafhængigheder
+npm.dependencies.peer = Peer-afhængigheder
+npm.dependencies.optional = Valgfrie afhængigheder
+rpm.registry = Konfigurer dette register fra kommandolinjen:
+rpm.install = For at installere pakken skal du køre følgende kommando:
+alpine.install = For at installere pakken skal du køre følgende kommando:
+alpine.repository = Depot info
+pypi.install = For at installere pakken ved hjælp af pip skal du køre følgende kommando:
+rpm.repository = Depot info
+rpm.repository.architectures = Arkitekturer
+alt.registry = Konfigurer dette register fra kommandolinjen:
+alt.repository = Depot info
[actions]
runners.description = Beskrivelse
runners.labels = Etiketter
+runners.name = Navn
+runners.task_list.repository = Depot
[tool]
1d = 1 dag
diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini
index 9c011b7fd1..11b2b3eb0c 100644
--- a/options/locale/locale_fi-FI.ini
+++ b/options/locale/locale_fi-FI.ini
@@ -291,7 +291,7 @@ mailer_password=SMTP-salasana
register_confirm=Vaadi sähköpostinvahvistus rekisteröinnin edellytykseksi
mail_notify=Ota sähköposti-ilmoitukset käyttöön
server_service_title=Palvelimen ja kolmansien osapuolten palveluiden asetukset
-offline_mode=Ota käyttöön lokaali tila
+offline_mode=Ota käyttöön paikallinen tila
offline_mode.description=Poista kolmannen osapuolen sisällönjakeluverkot ja tarjoa kaikki resurssit paikallisesti.
disable_gravatar=Poista Gravatar käytöstä
disable_gravatar.description=Poista Gravatar- tai muiden kolmansien osapuolien avatar-lähteet käytöstä. Oletuskuvia käytetään käyttäjien avatareissa, elleivät he uloslataa omaa avatariaan ilmentymään.
@@ -479,6 +479,7 @@ password_pwned_err = Pyyntöä HaveIBeenPwned-palveluun ei voitu suorittaa
authorization_failed_desc = Valtuus epäonnistui, koska havaitsimme virheellisen pyynnön. Ota yhteys sen sovelluksen ylläpitäjään, jota yritit valtuuttaa.
oauth.signin.error = Valtuuspyynnön käsittelyssä tapahtui virhe. Jos virhe toistuu, ota yhteys sivuston ylläpitoon.
disable_forgot_password_mail_admin = Tilin palautus on käytössä vain, jos sähköposti on määritetty. Aseta sähköposti, jotta tilin palauttaminen on mahdollista ottaa käyttöön.
+prohibit_login_desc = Tilinne on estetty kanssakäymästä tämän instanssin kanssa. Ota yhteys instanssin järjestelmävalvojaan pääsyn uudelleenmahdollistamiseksi.
[mail]
view_it_on=Näytä %s
@@ -541,6 +542,9 @@ primary_mail_change.text_1 = Tilisi ensisijaiseksi sähköpostiosoitteeksi asete
team_invite.text_1 = %[1]s on kutsunut sinut liittymään tiimiin %[2]s organisaatiossa %[3]s.
issue_assigned.pull = @%[1]s osoitti sinulle vetopyynnön %[2]s repossa %[3]s.
issue_assigned.issue = @%[1]s osoitti sinulle ongelman %[2]s repossa %[3]s.
+register_notify.text_1 = tämä on %s:n rekistöröitymisen vahvistussähköposti!
+reset_password.text = jos tämä oli sinun toimestasi, ole hyvä ja klikkaa oheista linkkiä palauttaaksesi tilisi %s sisällä:
+totp_disabled.no_2fa = Muita kaksivaiheisen tunnistautumisen menetelmiä ei ole konfiguroituna, joten et tarvitse kaksivaiheista tunnistautumista kirjautuaaksesi tilillesi.
@@ -2124,6 +2128,7 @@ tree_path_not_found_commit = Polkua %[1]s ei ole olemassa kommitissa %[2]s
archive.pull.noreview = Tämä repo on arkistoitu. Et voi katselmoida vetopyyntöjä.
tree_path_not_found_tag = Polkua %[1]s ei ole olemassa tagissa %[2]s
transfer.no_permission_to_accept = Sinulla ei ole oikeutta hyväksyä tätä siirtoa.
+settings.web_hook_name_feishu = Feishu / Lark Suite
@@ -2931,30 +2936,30 @@ normal_file = Tavallinen tiedosto
directory = Kansio
[search]
-search = Hae...
+search = Hae…
type_tooltip = Haun tyyppi
fuzzy_tooltip = Sisällytä tulokset, jotka myös melkein vastaavat hakusanaa
regexp = RegExp
regexp_tooltip = Tulkitse hakutermi säännöllisenä lausekkeena
-package_kind = Etsi paketteja...
+package_kind = Etsi paketteja…
exact = Täsmällinen
exact_tooltip = Sisällytä vain täsmälleen hakusanaa vastaavat tulokset
-team_kind = Etsi ryhmiä...
-code_kind = Etsi koodia...
+team_kind = Etsi tiimejä…
+code_kind = Etsi koodia…
code_search_unavailable = Koodihaku ei tällä hetkellä ole saatavilla. Ota yhteyttä järjestelmänvalvojaan.
union = yhdistelmähaku
-union_tooltip = Sisällytä minkä tahansa yksittäisen avainsanan kanssa täsmänneet tulokset
-project_kind = Etsi projekteja...
+union_tooltip = Sisällytä tulokset, jotka vastaavat minkä tahansa välilyönnillä erotetuista avainsanoista
+project_kind = Etsi projekteja…
no_results = Hakutuloksia ei löytynyt.
keyword_search_unavailable = Avainsanahaku ei tällä hetkellä ole saatavilla. Ota yhteyttä järjestelmänvalvojaan.
-repo_kind = Etsi repositorioita...
-user_kind = Etsi käyttäjiä...
-org_kind = Etsi organisaatioita...
-branch_kind = Etsi haaroja...
-issue_kind = Etsi ongelmia...
+repo_kind = Etsi repositorioita…
+user_kind = Etsi käyttäjiä…
+org_kind = Etsi organisaatioita…
+branch_kind = Etsi haaroja…
+issue_kind = Etsi ongelmia…
milestone_kind = Etsi merkkipaaluja...
-pull_kind = Etsi pull-vetoja...
-commit_kind = Etsi kommitteja...
+pull_kind = Etsi pull-vetoja…
+commit_kind = Etsi kommitteja…
fuzzy = Sumea
-runner_kind = Etsi ajajia...
+runner_kind = Etsi ajajia…
code_search_by_git_grep = Nykyiset koodin hakutulokset pohjautuvat komentoon "git grep". Parempia tuloksia on mahdollista saada, jos sivuston ylläpitäjä ottaa käyttöön koodin indeksoijan.
diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini
index 30f8d7836b..ace0decdbb 100644
--- a/options/locale/locale_it-IT.ini
+++ b/options/locale/locale_it-IT.ini
@@ -166,6 +166,7 @@ new_migrate.title = Nuova migrazione
new_org.title = Nuova organizzazione
new_migrate.link = Nuova migrazione
new_org.link = Nuova organizzazione
+copy_path = Copia percorso
[aria]
footer.links = Collegamenti
@@ -199,6 +200,15 @@ buttons.enable_monospace_font = Attiva font monospace
buttons.disable_monospace_font = Disattiva font monospace
buttons.indent.tooltip = Annida elementi di un livello
buttons.unindent.tooltip = Disannida elementi di un livello
+buttons.new_table.tooltip = Aggiungi tabella
+table_modal.header = Aggiungi tabella
+table_modal.placeholder.header = Intestazione
+table_modal.placeholder.content = Contenuto
+table_modal.label.rows = File
+table_modal.label.columns = Colonne
+link_modal.header = Aggiungi collegamento
+link_modal.url = Url
+link_modal.description = Descrizione
[filter]
string.asc = A - Z
@@ -1400,8 +1410,8 @@ issues.new.open_projects=Apri progetti
issues.new.closed_projects=Progetti chiusi
issues.new.no_items=Nessun elemento
issues.new.milestone=Traguardo
-issues.new.no_milestone=Nessuna pietra miliare
-issues.new.clear_milestone=Milestone pulita
+issues.new.no_milestone=Nessun traguardo
+issues.new.clear_milestone=Rimuovi traguardo
issues.new.open_milestone=Traguardi aperti
issues.new.closed_milestone=Traguardi chiusi
issues.new.assignees=Assegnatari
@@ -1429,7 +1439,7 @@ issues.remove_labels=rimosso le %s etichette %s
issues.add_remove_labels=aggiunto %s e rimosso %s etichette %s
issues.add_milestone_at=`aggiunta alle pietre miliari %s %s`
issues.add_project_at=`aggiunto questo al progetto %s %s`
-issues.change_milestone_at=`pietra miliare modificata da %s a %s %s`
+issues.change_milestone_at=`ha modificato il traguardo da %s a %s %s`
issues.change_project_at=`ha modificato il progetto da %s a %s %s`
issues.remove_milestone_at=`rimossa dalle pietre miliari %s %s`
issues.remove_project_at=`rimosso questo dal progetto %s %s`
@@ -1477,8 +1487,8 @@ issues.filter_sort.fewestforks=Minor numero di fork
issues.action_open=Apri
issues.action_close=Chiuso
issues.action_label=Etichetta
-issues.action_milestone=Pietra Miliare
-issues.action_milestone_no_select=Nessuna pietra miliare
+issues.action_milestone=Traguardo
+issues.action_milestone_no_select=Nessun Traguardo
issues.action_assignee=Assegnatario
issues.action_assignee_no_select=Nessun assegnatario
issues.opened_by=aperta %[1]s da %[3]s
@@ -1626,7 +1636,7 @@ issues.dependency.blocks_short=Blocchi
issues.dependency.blocked_by_short=Dipende da
issues.dependency.remove_header=Rimuovi Dipendenza
issues.dependency.issue_remove_text=Questo rimuoverà la dipendenza da questa issue. Continuare?
-issues.dependency.pr_remove_text=Questo rimuoverà la dipendenza da questa pull request. Continuare?
+issues.dependency.pr_remove_text=Questo rimuoverà la dipendenza da questa richiesta di modifica. Continuare?
issues.dependency.setting=Abilita le dipendenze per segnalazioni e richieste di modifica
issues.dependency.add_error_same_issue=Non si può fare dipendere una segnalazione da se stessa.
issues.dependency.add_error_dep_issue_not_exist=La segnalazione dalla quale dipende non esiste.
@@ -1671,7 +1681,7 @@ issues.reference_link=Riferimento: %s
compare.compare_base=base
compare.compare_head=confronta
-pulls.desc=Attiva pull request e revisioni di codice.
+pulls.desc=Attiva richieste di modifica e revisioni del codice.
pulls.new=Nuova richiesta di modifica
pulls.view=Visualizza richiesta di modifica
pulls.compare_changes=Nuova richiesta di modifica
@@ -1698,17 +1708,17 @@ pulls.change_target_branch_at=`cambiato il ramo di destinazione da %s a <
pulls.tab_conversation=Conversazione
pulls.tab_commits=Commit
pulls.tab_files=File modificati
-pulls.reopen_to_merge=Riapri questa pull request per effettuare l'unione.
-pulls.cant_reopen_deleted_branch=Questa richiesta di modifica non può essere riaperta perché il ramo è stato eliminato.
+pulls.reopen_to_merge=Riapri questa richiesta di modifica per poter fondere.
+pulls.cant_reopen_deleted_branch=Questa richiesta di modifica non può essere riaperta in quanto il ramo è stato eliminato.
pulls.merged=Unito
pulls.manually_merged=Unito manualmente
pulls.is_closed=La richiesta di modifica è stata chiusa.
-pulls.title_wip_desc=`Inizia il titolo con %s per evitare che la pull request venga unita accidentalmente.`
-pulls.cannot_merge_work_in_progress=Questa pull request è contrassegnata come un lavoro in corso.
+pulls.title_wip_desc=`Inizia il titolo con %s per evitare che la richiesta di modifica venga fusa accidentalmente.`
+pulls.cannot_merge_work_in_progress=Questa richiesta di modifica è contrassegnata come lavori in corso.
pulls.still_in_progress=Ancora in corso?
pulls.add_prefix=Aggiungi prefisso %s
pulls.remove_prefix=Rimuovi il prefisso %s
-pulls.data_broken=Questa pull request è rovinata a causa di informazioni mancanti del fork.
+pulls.data_broken=Questa richiesta di modifica è rovinata a causa di informazioni mancanti riguardo la derivazione.
pulls.files_conflicted=Questa richiesta di modifica va in conflitto con il ramo di destinazione.
pulls.is_checking=Verifica dei conflitti di fusione in corso. Riprova tra qualche istante.
pulls.is_ancestor=Questo ramo è già incluso nel ramo di destinazione. Non c'è nulla da fondere.
@@ -1716,8 +1726,8 @@ pulls.is_empty=Le modifiche di questo ramo sono già nel ramo di destinazione. Q
pulls.required_status_check_failed=Alcuni controlli richiesti non hanno avuto successo.
pulls.required_status_check_missing=Mancano alcuni controlli richiesti.
pulls.required_status_check_administrator=Come amministratore, puoi ancora unire questa pull request.
-pulls.can_auto_merge_desc=La pull request può essere unita automaticamente.
-pulls.cannot_auto_merge_desc=Questa pull request non può essere unita automaticamente a causa di conflitti.
+pulls.can_auto_merge_desc=La richiesta di modifica può essere unita automaticamente.
+pulls.cannot_auto_merge_desc=Questa richiesta di modifica non può essere unita automaticamente a causa di conflitti.
pulls.cannot_auto_merge_helper=Unire manualmente per risolvere i conflitti.
pulls.num_conflicting_files_1=%d file in conflitto
pulls.num_conflicting_files_n=%d file in conflitto
@@ -1729,20 +1739,20 @@ pulls.waiting_count_1=%d in attesa di revisione
pulls.waiting_count_n=%d in attesa di revisione
pulls.wrong_commit_id=l'ID del commit deve essere un ID del commit nel ramo di destinazione
-pulls.no_merge_desc=Questa pull request non può essere unita perché tutte le opzioni di merge del repository sono disattivate.
+pulls.no_merge_desc=Questa richiesta di modifica non può essere fusa perché tutte le opzioni di fusione del repositorio sono disattivate.
pulls.no_merge_helper=Attiva le opzioni di merge nelle impostazioni del repository o unisci la pull request manualmente.
pulls.no_merge_wip=Questa pull request non può essere unita perché è contrassegnata come un lavoro in corso.
pulls.no_merge_not_ready=Questa pull request non è pronta per il merge, controlla lo stato della revisione e i controlli di stato.
-pulls.no_merge_access=Non sei autorizzato ad effettuare il merge su questa pull request.
-pulls.merge_pull_request=Crea commit unito
-pulls.rebase_merge_pull_request=Ricostruisci poi manda avanti
-pulls.rebase_merge_commit_pull_request=Ricostruisci quindi crea commit unito
+pulls.no_merge_access=Non sei autorizzatə a fondere questa richiesta di modifica.
+pulls.merge_pull_request=Crea commit di fusione
+pulls.rebase_merge_pull_request=Ricostruisci e avanti veloce
+pulls.rebase_merge_commit_pull_request=Ricostruisci e crea commit di fusione
pulls.squash_merge_pull_request=Crea commit mescolato
pulls.merge_manually=Unito manualmente
pulls.merge_commit_id=L'ID del commit di merge
pulls.require_signed_wont_sign=Il ramo richiede commit firmati ma questa fusione non verrà firmata
-pulls.invalid_merge_option=Non puoi utilizzare questa opzione di merge per questa pull request.
+pulls.invalid_merge_option=Non è possibile utilizzare l'opzione di fusione selezionata per questa richiesta di modifica.
pulls.merge_conflict=Unione non riuscita: C'è stato un conflitto durante l'operazione. Suggerimento: Prova una strategia diversa
pulls.merge_conflict_summary=Messaggio d'errore
pulls.rebase_conflict=Merge non riuscito: c'è stato un conflitto durante il rebase dell'commit: %[1]s. Suggerimento: Prova una strategia diversa
@@ -1771,7 +1781,7 @@ pulls.reopened_at=`ha riaperto questa richiesta di modifica šeit, lai uzsāktu jaunu sesiju.
invalid_password=Parole neatbilst tai, kas tika izmantota konta izveidošanas laikā.
reset_password_helper=Atjaunot paroli
-reset_password_wrong_user=Tu esi pieteicies kā %s, bet konta atkopes saite ir paredzēta %s
+reset_password_wrong_user=Tu pieteicies kā %s, bet konta atkopes saite ir paredzēta %s
password_too_short=Paroles garums nevar būt mazāks par %d rakstzīmēm.
non_local_account=Ārējie konti nevar mainīt paroli, izmantojot, Forgejo saskarni.
verify=Apliecināt
@@ -463,8 +463,8 @@ openid_connect_desc=Izvēlētais OpenID URI ir nezināms. Tas ir jāasasaista ar
openid_register_title=Izveidot jaunu kontu
openid_register_desc=Izvēlētais OpenID URI ir nezināms. Tas ir jāasasaista ar jaunu kontu šeit.
openid_signin_desc=Jāievada OpenID URI. Piemēram, anna.openid.example.org vai https://openid.example.org/anna.
-disable_forgot_password_mail=Konta atkopšana ir atspējota, jo nav uzstādīta e-pasta izsūtīšana. Lūgums sazināties ar vietnes pārvaldītāju.
-disable_forgot_password_mail_admin=Kontu atkope ir pieejama tikai tad, kad ir veikta e-pasta servera iestatīšana. Lūgums iestatīt e-pasta serveri, lai iespējotu kontu atkopi.
+disable_forgot_password_mail=Konta atkope ir atspējota, jo nav iestatīta e-pasta izsūtīšana. Lūgums sazināties ar vietnes pārvaldītāju.
+disable_forgot_password_mail_admin=Kontu atkope ir pieejama tikai tad, kad ir veikta e-pasta servera iestatīšana. Lūgums iestatīt e-pasta serveri, lai varētu iespējot kontu atkopi.
email_domain_blacklisted=Nav atļauts reģistrēties ar šādu e-pasta adresi.
authorize_application=Pilnvarot lietotni
authorize_redirect_notice=Notiks pārvirzīšana uz %s, ja pilnvaroši šo lietotni.
@@ -982,7 +982,7 @@ revoke_oauth2_grant_description=Šīs trešās puses lietotnes piekļuves atsauk
revoke_oauth2_grant_success=Piekļuve sekmīgi atsaukta.
twofa_desc=Lai aizsargātu savu kontu no paroļu zādzības, var izmantot viedtālruni vai citu ierīci, lai saņemtu laikā balstītas vienreiz izmantojamas paroles ("TOTP").
-twofa_recovery_tip=Ja ierīce tiks pazaudēta, būs iespējams izmantot vienreizējas izmantošanas atkopšanas atslēgu, lai atgūtu piekļuvi savam kontam.
+twofa_recovery_tip=Ja ierīce tiks pazaudēta, būs iespējams izmantot vienreizējas izmantošanas atkopes atslēgu, lai atgūtu piekļuvi savam kontam.
twofa_is_enrolled=Kontam šobrīd ir ieslēgta divpakāpju pieteikšanās.
twofa_not_enrolled=Kontam šobrīd nav ieslēgta divpakāpju pieteikšanās.
twofa_disable=Atspējot divpakāpju pieteikšanos
@@ -991,13 +991,13 @@ twofa_scratch_token_regenerated=Vienreizējā pilnvara tagad ir %s. Tā ir jāgl
twofa_enroll=Ieslēgt divpakāpju pieteikšanos
twofa_disable_note=Ja nepieciešams, divpakāpju pieteikšanos var atslēgt.
twofa_disable_desc=Divpakāpju pieteikšanās atspējošana padarīs kontu mazāk drošu. Turpināt?
-regenerate_scratch_token_desc=Ja atkopšanas atslēga ir pazaudēta vai tā jau ir izmantota, lai pieteiktos, to var atiestatīt šeit.
+regenerate_scratch_token_desc=Ja atkopes atslēga ir pazaudēta vai tā jau ir izmantota, lai pieteiktos, to var atiestatīt šeit.
twofa_disabled=Divpakāpju pieteikšanās tika atspējota.
scan_this_image=Šis attēls ir jānolasa ar autentificēšanās lietotni:
or_enter_secret=Vai jāievada noslēpums: %s
then_enter_passcode=Pēc tam jāievada lietotnē attēlotais piekļuves kods:
passcode_invalid=Piekļuves kods ir nepareizs. Jāmēģina vēlreiz.
-twofa_enrolled=Kontam tika ieslēgta divpakāpju pieteikšanās. Vienreiz izmantojamā atkopšanas atslēga (%s) ir jāglabā drošā vietā, jo tā vairs netiks rādīta.
+twofa_enrolled=Kontam tika ieslēgta divpakāpju pieteikšanās. Vienreiz izmantojamā atkopes atslēga (%s) ir jāglabā drošā vietā, jo tā vairs netiks rādīta.
twofa_failed_get_secret=Neizdevās ielādēt noslēpumu.
webauthn_desc=Drošības atslēgas ir ierīces, kas satur kriptogrāfiskas atslēgas. Tās var tikt izmantotas divpakāpju apliecināšanai. Drošības atslēgām ir jāatbilst WebAuthn autentificētāja standartam.
@@ -2795,7 +2795,7 @@ settings.transfer.modal.title = Nodot īpašumtiesības
settings.mirror_settings.push_mirror.copy_public_key = Ievietot publisko atslēgu starpliktuvē
pulls.agit_explanation = Izveidots ar AGit darbplūsmu. AGit ļauj līdzalībniekiem ieteikt izmaiņas ar "git push" bez atzarojuma vai jauna zara izveidošanas.
settings.wiki_rename_branch_main_notices_1 = Šo darbību NEVAR atsaukt.
-release.download_count_few = %s lejupielādes
+release.download_count_few = %s lejupielādes/žu
settings.rename_branch_failed_protected = Nevar pārdēvēt zaru %s, jo tas ir aizsargāts zars.
release.type_external_asset = Ārējs līdzeklis
release.hide_archive_links = Paslēpt automātiski izveidotos arhīvus
@@ -3439,7 +3439,7 @@ config.require_sign_in_view=Pieprasīt pieteikšanos, lai apskatītu saturu
config.mail_notify=Iespējot e-pasta paziņojumus
config.enable_captcha=Iespējot drošības kodu
config.active_code_lives=Aktivēšanas koda derīguma laiks
-config.reset_password_code_lives=Atkopšanas koda derīguma laiks
+config.reset_password_code_lives=Atkopes koda derīguma laiks
config.default_keep_email_private=Pēc noklusējuma slēpt e-pasta adreses
config.default_allow_create_organization=Pēc noklusējuma ļaut apvienību izveidošanu
config.enable_timetracking=Iespējot laika uzskaiti
diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini
index 7098481fee..0ae55b98e1 100644
--- a/options/locale/locale_pt-BR.ini
+++ b/options/locale/locale_pt-BR.ini
@@ -1087,6 +1087,10 @@ quota.sizes.assets.attachments.releases = Anexos de release
quota.sizes.assets.artifacts = Artefatos
quota.sizes.assets.packages.all = Pacotes
quota.sizes.wiki = Wiki
+regenerate_token = Regenerar
+regenerate_token_success = O token foi regenerado. Aplicações que usam este token não terão mais acesso à sua conta e precisam ser atualizadas com o novo token.
+access_token_regeneration = Regenerar token de acesso
+access_token_regeneration_desc = Regenerar um token de acesso irá revogar o acesso a essa conta para as aplicações que estiverem utilizando este token. Isto não pode ser desfeito. Continuar?
[repo]
owner=Proprietário
@@ -1164,7 +1168,7 @@ forks=Forks
reactions_more=e %d mais
unit_disabled=O administrador do site desabilitou esta seção do repositório.
language_other=Outra
-adopt_search=Digite o nome de usuário para pesquisar por repositórios órfãos... (deixe em branco para encontrar todos)
+adopt_search=Digite o nome de usuário para pesquisar por repositórios órfãos… (deixe em branco para encontrar todos)
adopt_preexisting_label=Adotar arquivos
adopt_preexisting=Adotar arquivos pré-existentes
adopt_preexisting_content=Criar repositório a partir de %s
@@ -1242,7 +1246,7 @@ migrate.migrate_items_options=Um Token de Acesso é necessário para migrar iten
migrated_from=Migrado de %[2]s
migrated_from_fake=Migrado de %[1]s
migrate.migrate=Migrar de %s
-migrate.migrating=Migrando a partir de %s ...
+migrate.migrating=Migrando de %s …
migrate.migrating_failed=Migração a partir de %s falhou.
migrate.migrating_failed.error=Falha ao migrar: %s
migrate.migrating_failed_no_addr=A migração falhou.
@@ -2489,7 +2493,7 @@ settings.lfs_invalid_locking_path=Caminho inválido: %s
settings.lfs_invalid_lock_directory=Não é possível bloquear o diretório: %s
settings.lfs_lock_already_exists=O bloqueio já existe: %s
settings.lfs_lock=Bloqueio
-settings.lfs_lock_path=Caminho de arquivo para bloquear...
+settings.lfs_lock_path=Caminho de arquivo para travar…
settings.lfs_locks_no_locks=Sem bloqueios
settings.lfs_lock_file_no_exist=Arquivo bloqueado não existe no branch padrão
settings.lfs_force_unlock=Forçar desbloqueio
@@ -2901,9 +2905,11 @@ pulls.editable = Editável
pulls.editable_explanation = Este pull request permite edições de mantenedores. Voçê pode contribuir diretamenta para ele.
issues.reopen.blocked_by_user = Você não pode reabrir este issue porque você foi bloqueado pelo dono do repositório ou pelo criador deste issue.
pulls.comment.blocked_by_user = Você não pode comentar neste pull request porque você foi bloqueado pelo dono do repositório ou pelo autor do pull request.
+issues.filter_no_results = Nenhum resultado
+issues.filter_no_results_placeholder = Tente ajustar seus filtros de pesquisa.
[graphs]
-component_loading = Carregando %s...
+component_loading = Carregando %s…
component_loading_failed = Não foi possível carregar o(a) %s
component_loading_info = Pode demorar um pouco…
contributors.what = contribuições
@@ -4005,33 +4011,33 @@ executable_file = Arquivo executável
[search]
-org_kind = Buscar organizações...
-team_kind = Buscar equipes...
-code_kind = Buscar código...
-user_kind = Buscar usuários...
+org_kind = Buscar organizações…
+team_kind = Buscar equipes…
+code_kind = Buscar código…
+user_kind = Buscar usuários…
no_results = Nenhum resultado encontrado.
keyword_search_unavailable = A busca por palavras-chave não está disponível. Entre em contato com o administrador.
-package_kind = Buscar pacotes...
-project_kind = Buscar projetos...
-search = Buscar...
+package_kind = Buscar pacotes…
+project_kind = Buscar projetos…
+search = Buscar…
fuzzy = Aproximada
fuzzy_tooltip = Inclui resultados que se aproximam dos termos de busca
match = Correspondente
match_tooltip = Inclui apenas os resultados que correspondem exatamente aos termos de busca
-repo_kind = Buscar repositórios...
+repo_kind = Buscar repositórios…
type_tooltip = Tipo de busca
code_search_by_git_grep = Os resultados atuais da pesquisa de código são fornecidos por "git grep". Pode haver melhores resultados se o administrador do site ativar o indexador de código.
branch_kind = Buscar ramos…
commit_kind = Buscar commits…
-runner_kind = Pesquisar runners...
+runner_kind = Buscar runners…
code_search_unavailable = A pesquisa de código não está disponível no momento. Entre em contato com o administrador do site.
milestone_kind = Pesquisar marcos...
union_tooltip = Incluir resultados que correspondam a quaisquer palavras-chave separadas por espaços em branco
union = União
exact = Exato
exact_tooltip = Incluir apenas resultados que correspondam exatamente ao termo de pesquisa
-issue_kind = Pesquisar problemas...
-pull_kind = Pesquisar pulls...
+issue_kind = Buscar issues…
+pull_kind = Buscar pulls…
regexp_tooltip = Interpretar o termo de busca como uma expressão regular
regexp = RegExp
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index 2f95f9a95c..5830a32285 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -155,7 +155,7 @@ filter.public = Публичные
filter.private = Частные
filter.is_archived = Архивированные
filter.not_mirror = Не зеркала
-more_items = Больше элементов
+more_items = Больше разделов
invalid_data = Неверные данные: %v
copy_generic = Копировать в буфер обмена
test = Проверить
@@ -4060,7 +4060,7 @@ filepreview.lines = Строки с %[1]d по %[2]d в %[3]s
filepreview.truncated = Предпросмотр был обрезан
[translation_meta]
-test = forgejo =)
+test = Forgejo!
[repo.permissions]
code.write = Запись: отправка изменений в репозиторий, создание веток и тегов.
diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini
index 29acc94832..186f8b3b50 100644
--- a/options/locale/locale_tr-TR.ini
+++ b/options/locale/locale_tr-TR.ini
@@ -56,7 +56,7 @@ organization=Organizasyon
mirror=Yansı
new_repo=Yeni Depo
new_migrate=Yeni Göç
-new_mirror=Yeni Yansı
+new_mirror=Yeni yansıma
new_fork=Yeni Depo Çatalı
new_org=Yeni Organizasyon
new_project=Yeni proje
@@ -76,7 +76,7 @@ collaborative=İşbirlikçi
forks=Çatallar
activities=Etkinlikler
-pull_requests=Değişiklik İstekleri
+pull_requests=Değişiklik istekleri
issues=Konular
milestones=Kilometre Taşları
@@ -112,7 +112,7 @@ preview=Önizleme
loading=Yükleniyor…
error=Hata
-error404=Ulaşmaya çalıştığınız sayfa mevcut değil veya görüntüleme yetkiniz yok.
+error404=Ulaşmaya çalıştığınız sayfa mevcut değil ,kaldırılmış veya görüntüleme yetkiniz yok.
go_back=Geri Git
never=Asla
@@ -146,7 +146,7 @@ filter = Filtrele
filter.not_archived = Arşivlenmemiş
filter.clear = Filtreleri Temizle
filter.is_archived = Arşivlenmiş
-filter.is_mirror = Yansılaştırılmış
+filter.is_mirror = Yansılar
filter.is_fork = Çatallar
filter.not_fork = Çatallanmayanlar
filter.not_mirror = Yansılanmamış
diff --git a/options/locale_next/locale_fi-FI.json b/options/locale_next/locale_fi-FI.json
index 50ff797eb4..51320bfa8c 100644
--- a/options/locale_next/locale_fi-FI.json
+++ b/options/locale_next/locale_fi-FI.json
@@ -1,5 +1,12 @@
{
"repo.pulls.merged_title_desc": "yhdistetty %[1]d committia lähteestä %[2]s kohteeseen %[3]s %[4]s",
"repo.pulls.title_desc": "haluaa yhdistää %[1]d committia lähteestä %[2]s kohteeseen %[3]s",
- "search.milestone_kind": "Etsi merkkipaaluja..."
+ "search.milestone_kind": "Etsi merkkipaaluja...",
+ "home.welcome.no_activity": "Ei toimintaa",
+ "incorrect_root_url": "Tämä Forgejo-instanssi on määritetty toimimaan osoitteessa \"%s\". Tarkastelet tällä hetkellä Forgejoa eri URL-osoitteen kautta, mikä saattaa aiheuttaa sovelluksen osien toimimattomuutta. Virallinen URL-osoite on Forgejo-ylläpitäjien hallinnoima ROOT_URL-asetus app.ini -tiedostossa.",
+ "themes.names.forgejo-auto": "Forgejo (käyttöjärjestelmän määrittelemä teema)",
+ "home.welcome.activity_hint": "Syötteelläsi ei ole vielä mitään. Toimintasi ja toiminta repositorioissa joita seuraat ilmaantuu tälle sivulle.",
+ "home.explore_repos": "Tutki repositorioita",
+ "home.explore_users": "Tutki käyttäjiä",
+ "home.explore_orgs": "Tutki organisaatioita"
}
From 03c50c54bbf32c89ed3fba660ce07e9bece8afa7 Mon Sep 17 00:00:00 2001
From: Renovate Bot
Date: Fri, 21 Mar 2025 09:07:22 +0000
Subject: [PATCH 24/32] Update module github.com/redis/go-redis/v9 to v9.7.3
(forgejo) (#7279)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7279
Reviewed-by: Gusted
Co-authored-by: Renovate Bot
Co-committed-by: Renovate Bot
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index ce1718c0a3..03b95cf748 100644
--- a/go.mod
+++ b/go.mod
@@ -85,7 +85,7 @@ require (
github.com/opencontainers/image-spec v1.1.1
github.com/pquerna/otp v1.4.0
github.com/prometheus/client_golang v1.21.1
- github.com/redis/go-redis/v9 v9.7.0
+ github.com/redis/go-redis/v9 v9.7.3
github.com/robfig/cron/v3 v3.0.1
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1
github.com/sassoftware/go-rpmutils v0.4.0
diff --git a/go.sum b/go.sum
index 3c3733c219..657b80d4a7 100644
--- a/go.sum
+++ b/go.sum
@@ -1347,8 +1347,8 @@ github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
-github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E=
-github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
+github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM=
+github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rhysd/actionlint v1.6.27 h1:xxwe8YmveBcC8lydW6GoHMGmB6H/MTqUU60F2p10wjw=
From bec2659bfb7db3b2599a0b0f739240eea0abb384 Mon Sep 17 00:00:00 2001
From: Renovate Bot
Date: Fri, 21 Mar 2025 09:56:19 +0000
Subject: [PATCH 25/32] Update mcr.microsoft.com/devcontainers/go Docker tag to
v1.24 (forgejo) (#7281) Co-authored-by: Renovate Bot
Co-committed-by: Renovate Bot
---
.devcontainer/devcontainer.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 4549974afd..f3d30963c7 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -1,6 +1,6 @@
{
"name": "Gitea DevContainer",
- "image": "mcr.microsoft.com/devcontainers/go:1.23-bullseye",
+ "image": "mcr.microsoft.com/devcontainers/go:1.24-bullseye",
"features": {
// installs nodejs into container
"ghcr.io/devcontainers/features/node:1": {
From c5c0948ae5c96a694cc36945c3d9d5dae439bdd0 Mon Sep 17 00:00:00 2001
From: forgejo-release-manager
Date: Fri, 21 Mar 2025 12:32:18 +0000
Subject: [PATCH 26/32] chore(release-notes): Forgejo v10.0.2 (#7280)
https://codeberg.org/forgejo/forgejo/milestone/9818
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7280
Reviewed-by: Earl Warren
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: forgejo-release-manager
Co-committed-by: forgejo-release-manager
---
release-notes-published/10.0.2.md | 37 +++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
create mode 100644 release-notes-published/10.0.2.md
diff --git a/release-notes-published/10.0.2.md b/release-notes-published/10.0.2.md
new file mode 100644
index 0000000000..594614a790
--- /dev/null
+++ b/release-notes-published/10.0.2.md
@@ -0,0 +1,37 @@
+
+
+
+
+## Release notes
+
+- Localization
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7277): update of translations from Codeberg Translate
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7067): update of translations from multiple sources
+- Bug fixes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7251) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7255)): When migrating from a Forgejo version lower than v10, the TOTP secrets found to be corrupted are now transparently removed from the database instead of failing the migration. TOTP is no longer required to login with the associated users. They should be informed because they will need to visit their security settings and configure TOTP again. No other action is required.
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7167) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7178)): replies to pending review comments no longer generate a notification, this was caused by an incomplete determination if the comment was part of the pending review or not
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7143) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7144)): consider public issues for project boards
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7038) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7046)): the rootless Forgejo image version label is not set
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7004) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7018)): do not allow SSH url for migration
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6680) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6930)): `setting.Service.EnableInternalSignIn = false` is disabling forgotten password
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6920) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6929)): show internal login prompt for account linking
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6896) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6915)): enable ssh mirrors in rootless Forgejo images
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6853) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6859)): render link in heading correctly in wiki TOC
+- Included for completeness but not worth a release note
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7284): Update module github.com/redis/go-redis/v9 to v9.7.3 (v10.0/forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7270) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7272)): fix: consider issues in repository accessible via `access` table
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7199) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7202)): fix(api): miss-spelled description, corrected to `public`
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7171) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7177)): fix: revert issue rendering for `` element
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7078) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7079)): chore(ci): ensure the manually cached Go can be run
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6590) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7073)): chore(ci): Get Go binary from GOROOT instead of hardcoded path
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7072): Update module golang.org/x/crypto to v0.35.0 (v10.0/forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7052): Update https://data.forgejo.org/forgejo/forgejo-build-publish action to v5.3.4 (v10.0/forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7003) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7014)): fix: return 404 for empty repositories
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6937) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6976)): fix: delay deleting authorization token
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6953) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6954)): fix: native parsing of ssh certificate key
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6898) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6905)): fix(ui): hide extra PR property labels on title edit
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6866) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6884)): fix: always set stripped slashes on http request
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6851) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6860)): fix(ui): hide 'New migration' button on org pages with migrations disabled (#6850)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6700) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6854)): ui: update language stats layout and click behavior
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/6812): Update dependency go to v1.23.6 (v10.0/forgejo)
+
From 3700db6dd5b6154ee2c641f34eee8a84686c9373 Mon Sep 17 00:00:00 2001
From: Renovate Bot
Date: Sat, 22 Mar 2025 15:51:41 +0000
Subject: [PATCH 27/32] Update module github.com/golang-jwt/jwt/v5 to v5.2.2
[SECURITY] (forgejo) (#7296)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [github.com/golang-jwt/jwt/v5](https://github.com/golang-jwt/jwt) | require | patch | `v5.2.1` -> `v5.2.2` |
---
### jwt-go allows excessive memory allocation during header parsing
[CVE-2025-30204](https://nvd.nist.gov/vuln/detail/CVE-2025-30204) / [GHSA-mh63-6h87-95cp](https://github.com/advisories/GHSA-mh63-6h87-95cp)
More information
#### Details
##### Summary
Function [`parse.ParseUnverified`](https://github.com/golang-jwt/jwt/blob/c035977d9e11c351f4c05dfeae193923cbab49ee/parser.go#L138-L139) currently splits (via a call to [strings.Split](https://pkg.go.dev/strings#Split)) its argument (which is untrusted data) on periods.
As a result, in the face of a malicious request whose _Authorization_ header consists of `Bearer ` followed by many period characters, a call to that function incurs allocations to the tune of O(n) bytes (where n stands for the length of the function's argument), with a constant factor of about 16. Relevant weakness: [CWE-405: Asymmetric Resource Consumption (Amplification)](https://cwe.mitre.org/data/definitions/405.html)
##### Details
See [`parse.ParseUnverified`](https://github.com/golang-jwt/jwt/blob/c035977d9e11c351f4c05dfeae193923cbab49ee/parser.go#L138-L139)
##### Impact
Excessive memory allocation
#### Severity
- CVSS Score: 7.5 / 10 (High)
- Vector String: `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H`
#### References
- [https://github.com/golang-jwt/jwt/security/advisories/GHSA-mh63-6h87-95cp](https://github.com/golang-jwt/jwt/security/advisories/GHSA-mh63-6h87-95cp)
- [https://github.com/golang-jwt/jwt/commit/0951d184286dece21f73c85673fd308786ffe9c3](https://github.com/golang-jwt/jwt/commit/0951d184286dece21f73c85673fd308786ffe9c3)
- [https://github.com/golang-jwt/jwt](https://github.com/golang-jwt/jwt)
This data is provided by [OSV](https://osv.dev/vulnerability/GHSA-mh63-6h87-95cp) and the [GitHub Advisory Database](https://github.com/github/advisory-database) ([CC-BY 4.0](https://github.com/github/advisory-database/blob/main/LICENSE.md)).
---
### Release Notes
golang-jwt/jwt (github.com/golang-jwt/jwt/v5)
### [`v5.2.2`](https://github.com/golang-jwt/jwt/releases/tag/v5.2.2)
[Compare Source](https://github.com/golang-jwt/jwt/compare/v5.2.1...v5.2.2)
#### What's Changed
- Fixed https://github.com/golang-jwt/jwt/security/advisories/GHSA-mh63-6h87-95cp by [@mfridman](https://github.com/mfridman)
- Fixed some typos by [@Ashikpaul](https://github.com/Ashikpaul) in https://github.com/golang-jwt/jwt/pull/382
- build: add go1.22 to ci workflows by [@mfridman](https://github.com/mfridman) in https://github.com/golang-jwt/jwt/pull/383
- Bump golangci/golangci-lint-action from 4 to 5 by [@dependabot](https://github.com/dependabot) in https://github.com/golang-jwt/jwt/pull/387
- Bump golangci/golangci-lint-action from 5 to 6 by [@dependabot](https://github.com/dependabot) in https://github.com/golang-jwt/jwt/pull/389
- chore: bump ci tests to include go1.23 by [@mfridman](https://github.com/mfridman) in https://github.com/golang-jwt/jwt/pull/405
- Fix jwt -show by [@AlexanderYastrebov](https://github.com/AlexanderYastrebov) in https://github.com/golang-jwt/jwt/pull/406
- docs: typo by [@kvii](https://github.com/kvii) in https://github.com/golang-jwt/jwt/pull/407
- Update SECURITY.md by [@oxisto](https://github.com/oxisto) in https://github.com/golang-jwt/jwt/pull/416
- Update `jwt.Parse` example to use `jwt.WithValidMethods` by [@mattt](https://github.com/mattt) in https://github.com/golang-jwt/jwt/pull/425
#### New Contributors
- [@Ashikpaul](https://github.com/Ashikpaul) made their first contribution in https://github.com/golang-jwt/jwt/pull/382
- [@kvii](https://github.com/kvii) made their first contribution in https://github.com/golang-jwt/jwt/pull/407
- [@mattt](https://github.com/mattt) made their first contribution in https://github.com/golang-jwt/jwt/pull/425
**Full Changelog**: https://github.com/golang-jwt/jwt/compare/v5.2.1...v5.2.2
---
### Configuration
📅 **Schedule**: Branch creation - "" (UTC), Automerge - "* 0-3 * * *" (UTC).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7296
Reviewed-by: Earl Warren
Co-authored-by: Renovate Bot
Co-committed-by: Renovate Bot
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 03b95cf748..18381a6e1c 100644
--- a/go.mod
+++ b/go.mod
@@ -53,7 +53,7 @@ require (
github.com/gobwas/glob v0.2.3
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f
github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85
- github.com/golang-jwt/jwt/v5 v5.2.1
+ github.com/golang-jwt/jwt/v5 v5.2.2
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
github.com/google/go-github/v64 v64.0.0
github.com/google/pprof v0.0.0-20241017200806-017d972448fc
diff --git a/go.sum b/go.sum
index 657b80d4a7..b6d508faba 100644
--- a/go.sum
+++ b/go.sum
@@ -985,8 +985,8 @@ github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 h1:UjoPNDAQ5JP
github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85/go.mod h1:fR6z1Ie6rtF7kl/vBYMfgD5/G5B1blui7z426/sj2DU=
github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo=
github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
-github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
-github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
+github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
+github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
From c399b8b135c3503f93c4bc3b1bca90d3ad57fad9 Mon Sep 17 00:00:00 2001
From: Renovate Bot
Date: Sat, 22 Mar 2025 16:13:54 +0000
Subject: [PATCH 28/32] Update module github.com/go-sql-driver/mysql to v1.9.1
(forgejo) (#7293)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql) | require | minor | `v1.8.1` -> `v1.9.1` |
---
### Release Notes
go-sql-driver/mysql (github.com/go-sql-driver/mysql)
### [`v1.9.1`](https://github.com/go-sql-driver/mysql/blob/HEAD/CHANGELOG.md#v191-2025-03-21)
[Compare Source](https://github.com/go-sql-driver/mysql/compare/v1.9.0...v1.9.1)
##### Major Changes
- Add Charset() option. ([#1679](https://github.com/go-sql-driver/mysql/issues/1679))
##### Bugfixes
- go.mod: fix go version format ([#1682](https://github.com/go-sql-driver/mysql/issues/1682))
- Fix FormatDSN missing ConnectionAttributes ([#1619](https://github.com/go-sql-driver/mysql/issues/1619))
### [`v1.9.0`](https://github.com/go-sql-driver/mysql/blob/HEAD/CHANGELOG.md#v190-2025-02-18)
[Compare Source](https://github.com/go-sql-driver/mysql/compare/v1.8.1...v1.9.0)
##### Major Changes
- Implement zlib compression. ([#1487](https://github.com/go-sql-driver/mysql/issues/1487))
- Supported Go version is updated to Go 1.21+. ([#1639](https://github.com/go-sql-driver/mysql/issues/1639))
- Add support for VECTOR type introduced in MySQL 9.0. ([#1609](https://github.com/go-sql-driver/mysql/issues/1609))
- Config object can have custom dial function. ([#1527](https://github.com/go-sql-driver/mysql/issues/1527))
##### Bugfixes
- Fix auth errors when username/password are too long. ([#1625](https://github.com/go-sql-driver/mysql/issues/1625))
- Check if MySQL supports CLIENT_CONNECT_ATTRS before sending client attributes. ([#1640](https://github.com/go-sql-driver/mysql/issues/1640))
- Fix auth switch request handling. ([#1666](https://github.com/go-sql-driver/mysql/issues/1666))
##### Other changes
- Add "filename:line" prefix to log in go-mysql. Custom loggers now show it. ([#1589](https://github.com/go-sql-driver/mysql/issues/1589))
- Improve error handling. It reduces the "busy buffer" errors. ([#1595](https://github.com/go-sql-driver/mysql/issues/1595), [#1601](https://github.com/go-sql-driver/mysql/issues/1601), [#1641](https://github.com/go-sql-driver/mysql/issues/1641))
- Use `strconv.Atoi` to parse max_allowed_packet. ([#1661](https://github.com/go-sql-driver/mysql/issues/1661))
- `rejectReadOnly` option now handles ER_READ_ONLY_MODE (1290) error too. ([#1660](https://github.com/go-sql-driver/mysql/issues/1660))
---
### Configuration
📅 **Schedule**: Branch creation - "* 0-3 * * *" (UTC), Automerge - "* 0-3 * * *" (UTC).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7293
Reviewed-by: Earl Warren
Co-authored-by: Renovate Bot
Co-committed-by: Renovate Bot
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 18381a6e1c..278ee05733 100644
--- a/go.mod
+++ b/go.mod
@@ -47,7 +47,7 @@ require (
github.com/go-git/go-git/v5 v5.13.2
github.com/go-ldap/ldap/v3 v3.4.6
github.com/go-openapi/spec v0.20.14
- github.com/go-sql-driver/mysql v1.8.1
+ github.com/go-sql-driver/mysql v1.9.1
github.com/go-testfixtures/testfixtures/v3 v3.14.0
github.com/go-webauthn/webauthn v0.12.2
github.com/gobwas/glob v0.2.3
diff --git a/go.sum b/go.sum
index b6d508faba..0997cdb85d 100644
--- a/go.sum
+++ b/go.sum
@@ -960,8 +960,8 @@ github.com/go-openapi/swag v0.22.7 h1:JWrc1uc/P9cSomxfnsFSVWoE1FW6bNbrVPmpQYpCcR
github.com/go-openapi/swag v0.22.7/go.mod h1:Gl91UqO+btAM0plGGxHqJcQZ1ZTy6jbmridBTsDy8A0=
github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
-github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
-github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
+github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI=
+github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U=
github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
From 2d54cbc8fdf93ba9f144ac37efb6288f07e66b02 Mon Sep 17 00:00:00 2001
From: Tacaly
Date: Sat, 22 Mar 2025 16:18:54 +0000
Subject: [PATCH 29/32] i18n: make Danish available in UI (#7287)
## Checklist
The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).
### Tests
- I added test coverage for Go changes...
- [ ] in their respective `*_test.go` for unit tests.
- [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
- [ ] in `web_src/js/*.test.js` if it can be unit tested.
- [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).
- I tested via manual method for the changes
- [X] in terminal using the "make" command.
### Documentation
- [x] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [ ] I did not document these changes and I do not expect someone else to do it.
### Release notes
- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title.
## Release notes
- Localization
- [PR](https://codeberg.org/forgejo/forgejo/pulls/7287): i18n: make Danish available in UI
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7287
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Tacaly
Co-committed-by: Tacaly
---
custom/conf/app.example.ini | 4 ++--
modules/setting/i18n.go | 1 +
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini
index 496bec0e24..79793ad47f 100644
--- a/custom/conf/app.example.ini
+++ b/custom/conf/app.example.ini
@@ -2407,8 +2407,8 @@ LEVEL = Info
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; The first locale will be used as the default if user browser's language doesn't match any locale in the list.
-;LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,nds,fr-FR,nl-NL,lv-LV,ru-RU,uk-UA,ja-JP,es-ES,pt-BR,pt-PT,pl-PL,bg,it-IT,fi-FI,fil,eo,tr-TR,cs-CZ,sl,sv-SE,ko-KR,el-GR,fa-IR,hu-HU,id-ID
-;NAMES = English,简体中文,繁體中文(香港),繁體中文(台灣),Deutsch,Plattdüütsch,Français,Nederlands,Latviešu,Русский,Українська,日本語,Español,Português do Brasil,Português de Portugal,Polski,Български,Italiano,Suomi,Filipino,Esperanto,Türkçe,Čeština,Slovenščina,Svenska,한국어,Ελληνικά,فارسی,Magyar nyelv,Bahasa Indonesia
+;LANGS = en-US,zh-CN,zh-HK,zh-TW,da,de-DE,nds,fr-FR,nl-NL,lv-LV,ru-RU,uk-UA,ja-JP,es-ES,pt-BR,pt-PT,pl-PL,bg,it-IT,fi-FI,fil,eo,tr-TR,cs-CZ,sl,sv-SE,ko-KR,el-GR,fa-IR,hu-HU,id-ID
+;NAMES = English,简体中文,繁體中文(香港),繁體中文(台灣),Danish,Deutsch,Plattdüütsch,Français,Nederlands,Latviešu,Русский,Українська,日本語,Español,Português do Brasil,Português de Portugal,Polski,Български,Italiano,Suomi,Filipino,Esperanto,Türkçe,Čeština,Slovenščina,Svenska,한국어,Ελληνικά,فارسی,Magyar nyelv,Bahasa Indonesia
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/modules/setting/i18n.go b/modules/setting/i18n.go
index f4bacea218..c2e5822cf0 100644
--- a/modules/setting/i18n.go
+++ b/modules/setting/i18n.go
@@ -9,6 +9,7 @@ var defaultI18nLangNames = []string{
"zh-CN", "简体中文",
"zh-HK", "繁體中文(香港)",
"zh-TW", "繁體中文(台灣)",
+ "da", "Danish",
"de-DE", "Deutsch",
"nds", "Plattdüütsch",
"fr-FR", "Français",
From cff284fdc30e11c3fde80e3a665cfb46d0ed00e2 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Sat, 22 Mar 2025 16:49:05 +0000
Subject: [PATCH 30/32] fix: use correct input for strip slashes middleware
(#7295)
- The router must use the escaped path in order to ensure correct functionality (at least, that is what they say). However `req.URL.Path` shouldn't be set to the escaped path, which is fixed in this patch.
- Simplify the logic and no longer try to use `rctx.RoutePath`, this is only useful if the middleware was placed after some routing parsing was done.
- Resolves forgejo/forgejo#7294
- Resolves forgejo/forgejo#7292
- Add unit test
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7295
Reviewed-by: Earl Warren
Co-authored-by: Gusted
Co-committed-by: Gusted
---
routers/common/middleware.go | 30 +++++++++++++++---------------
routers/common/middleware_test.go | 26 +++++++++++++++++++-------
services/context/repo.go | 2 +-
3 files changed, 35 insertions(+), 23 deletions(-)
diff --git a/routers/common/middleware.go b/routers/common/middleware.go
index 8d136ef2c7..ee2e504ff1 100644
--- a/routers/common/middleware.go
+++ b/routers/common/middleware.go
@@ -77,27 +77,27 @@ func ProtocolMiddlewares() (handlers []any) {
func stripSlashesMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
- // First of all escape the URL RawPath to ensure that all routing is done using a correctly escaped URL
+ // Ensure that URL.RawPath is always set.
req.URL.RawPath = req.URL.EscapedPath()
- urlPath := req.URL.RawPath
- rctx := chi.RouteContext(req.Context())
- if rctx != nil && rctx.RoutePath != "" {
- urlPath = rctx.RoutePath
- }
-
- sanitizedPath := &strings.Builder{}
- prevWasSlash := false
- for _, chr := range strings.TrimRight(urlPath, "/") {
- if chr != '/' || !prevWasSlash {
- sanitizedPath.WriteRune(chr)
+ sanitize := func(path string) string {
+ sanitizedPath := &strings.Builder{}
+ prevWasSlash := false
+ for _, chr := range strings.TrimRight(path, "/") {
+ if chr != '/' || !prevWasSlash {
+ sanitizedPath.WriteRune(chr)
+ }
+ prevWasSlash = chr == '/'
}
- prevWasSlash = chr == '/'
+ return sanitizedPath.String()
}
- req.URL.Path = sanitizedPath.String()
+ // Sanitize the unescaped path for application logic.
+ req.URL.Path = sanitize(req.URL.Path)
+ rctx := chi.RouteContext(req.Context())
if rctx != nil {
- rctx.RoutePath = req.URL.Path
+ // Sanitize the escaped path for routing.
+ rctx.RoutePath = sanitize(req.URL.RawPath)
}
next.ServeHTTP(resp, req)
})
diff --git a/routers/common/middleware_test.go b/routers/common/middleware_test.go
index 0e111e1261..6126e0afcc 100644
--- a/routers/common/middleware_test.go
+++ b/routers/common/middleware_test.go
@@ -15,9 +15,10 @@ import (
func TestStripSlashesMiddleware(t *testing.T) {
type test struct {
- name string
- expectedPath string
- inputPath string
+ name string
+ expectedPath string
+ expectedNormalPath string
+ inputPath string
}
tests := []test{
@@ -57,9 +58,16 @@ func TestStripSlashesMiddleware(t *testing.T) {
expectedPath: "/repo/migrate",
},
{
- name: "path with encoded slash",
- inputPath: "/user2/%2F%2Frepo1",
- expectedPath: "/user2/%2F%2Frepo1",
+ name: "path with encoded slash",
+ inputPath: "/user2/%2F%2Frepo1",
+ expectedPath: "/user2/%2F%2Frepo1",
+ expectedNormalPath: "/user2/repo1",
+ },
+ {
+ name: "path with space",
+ inputPath: "/assets/css/theme%20cappuccino.css",
+ expectedPath: "/assets/css/theme%20cappuccino.css",
+ expectedNormalPath: "/assets/css/theme cappuccino.css",
},
}
@@ -69,7 +77,11 @@ func TestStripSlashesMiddleware(t *testing.T) {
called := false
r.Get("*", func(w http.ResponseWriter, r *http.Request) {
- assert.Equal(t, tt.expectedPath, r.URL.Path)
+ if tt.expectedNormalPath != "" {
+ assert.Equal(t, tt.expectedNormalPath, r.URL.Path)
+ } else {
+ assert.Equal(t, tt.expectedPath, r.URL.Path)
+ }
rctx := chi.RouteContext(r.Context())
assert.Equal(t, tt.expectedPath, rctx.RoutePath)
diff --git a/services/context/repo.go b/services/context/repo.go
index 8b8359fb70..ff03844c03 100644
--- a/services/context/repo.go
+++ b/services/context/repo.go
@@ -1058,7 +1058,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
if refType == RepoRefLegacy {
// redirect from old URL scheme to new URL scheme
- prefix := strings.TrimPrefix(setting.AppSubURL+strings.ToLower(strings.TrimSuffix(ctx.Req.URL.Path, ctx.PathParamRaw("*"))), strings.ToLower(ctx.Repo.RepoLink))
+ prefix := strings.TrimPrefix(setting.AppSubURL+strings.ToLower(strings.TrimSuffix(ctx.Req.URL.Path, ctx.Params("*"))), strings.ToLower(ctx.Repo.RepoLink))
ctx.Redirect(path.Join(
ctx.Repo.RepoLink,
From dae08c50843fd432b0d95670835e43286ca84819 Mon Sep 17 00:00:00 2001
From: forgejo-release-manager
Date: Sun, 23 Mar 2025 08:50:48 +0000
Subject: [PATCH 31/32] chore(release-notes): Forgejo v10.0.3 (#7311)
https://codeberg.org/forgejo/forgejo/milestone/12777
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7311
Co-authored-by: forgejo-release-manager
Co-committed-by: forgejo-release-manager
---
release-notes-published/10.0.3.md | 13 +++++++++++++
1 file changed, 13 insertions(+)
create mode 100644 release-notes-published/10.0.3.md
diff --git a/release-notes-published/10.0.3.md b/release-notes-published/10.0.3.md
new file mode 100644
index 0000000000..16c6ad872b
--- /dev/null
+++ b/release-notes-published/10.0.3.md
@@ -0,0 +1,13 @@
+
+
+
+
+## Release notes
+
+- Bug fixes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7295) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7306)): fixes a [regression introduced in Forgejo v10.0.2](https://codeberg.org/forgejo/forgejo/pulls/6866/files) which caused unnecessary escaping of URLs. The symptoms were, for instance, a [failure to access theme files when they contain a space](https://codeberg.org/forgejo/forgejo/issues/7294) or [double escaping of links](https://codeberg.org/forgejo/forgejo/issues/7292).
+- Included for completeness but not worth a release note
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7304): Update module golang.org/x/oauth2 to v0.27.0
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7303): Update module golang.org/x/net to v0.36.0
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7302): Update module github.com/golang-jwt/jwt/v5 to v5.2.2
+
From 2e7ccb42ac2abca683d9a947e0b7b9d0be9d908e Mon Sep 17 00:00:00 2001
From: benjidial
Date: Sun, 23 Mar 2025 17:34:29 +0000
Subject: [PATCH 32/32] fix(ui): remove extra `}` in issue dependencies
template (#7313)
Bug showcase:
https://codeberg.org/forgejo/forgejo/attachments/a0c6215c-8274-4b91-b2a2-b14a31a4947e
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7313
Reviewed-by: Earl Warren
Reviewed-by: Beowulf
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: benjidial
Co-committed-by: benjidial
---
templates/repo/issue/view_content/sidebar/dependencies.tmpl | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/templates/repo/issue/view_content/sidebar/dependencies.tmpl b/templates/repo/issue/view_content/sidebar/dependencies.tmpl
index 6a9b651e7d..0be36c03d5 100644
--- a/templates/repo/issue/view_content/sidebar/dependencies.tmpl
+++ b/templates/repo/issue/view_content/sidebar/dependencies.tmpl
@@ -19,8 +19,8 @@
{{range .BlockingDependencies}}