2PJph~g|Qq%Ra3ep)$
z6c2+oLUCzQN@fwmo~L{(J~6+WWE+*j%c{_|--yj4
J4*(iHX&$FKd=UTu
literal 0
HcmV?d00001
diff --git a/tests/gitea-repositories-meta/user2/lfs.git/objects/b0/89e97ee59224e8c5676673c096ee4b6a8b9342 b/tests/gitea-repositories-meta/user2/lfs.git/objects/b0/89e97ee59224e8c5676673c096ee4b6a8b9342
new file mode 100644
index 0000000000000000000000000000000000000000..33ab64e7303e418c3270708ab1134aa417e2f8a5
GIT binary patch
literal 123
zcmV->0EGW|0S(H*5yBu406^bVK?4Ti;0Wo4<3N~+k`c_q>dk9EOM54&jlZ4wGg^Pk
zI_EJqrJilx_cE5t`lTiHml{V->eQk)mZL`Fa0{&cO0H=4um~0kgDKW&E&*anhL}S}
d@IcvKG2ohQij0J4Jvc2!`(|>;)QDtA}L>CG-fnfu!AS1h!QiCB1%~E97$q2B!9P
zZ3D>7A7dARSW2DdIR@)3hExzKDq-}jB{E4CSAFnke)BHdfXP)w$0bS?=fzUd*-A>m
zaSci1l$10PoBSBJzQeWu0Z_Lv;<
YW^OVwwC$Of#<1uev@K%(0i~r&qPFu
Date: Thu, 15 Aug 2024 23:59:01 +0800
Subject: [PATCH 3/7] Fix panic of ssh public key page after deletion of auth
source (#31829)
Fix #31730
This PR rewrote the function `PublicKeysAreExternallyManaged` with a
simple test. The new function removed the loop to make it more readable.
(cherry picked from commit b491b2104f83ee8fc4956c099c427b339291b3be)
---
models/asymkey/ssh_key.go | 23 +++++++----------------
models/asymkey/ssh_key_test.go | 10 ++++++++++
2 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/models/asymkey/ssh_key.go b/models/asymkey/ssh_key.go
index a409d8e84..7a18732c3 100644
--- a/models/asymkey/ssh_key.go
+++ b/models/asymkey/ssh_key.go
@@ -229,35 +229,26 @@ func UpdatePublicKeyUpdated(ctx context.Context, id int64) error {
// PublicKeysAreExternallyManaged returns whether the provided KeyID represents an externally managed Key
func PublicKeysAreExternallyManaged(ctx context.Context, keys []*PublicKey) ([]bool, error) {
- sources := make([]*auth.Source, 0, 5)
+ sourceCache := make(map[int64]*auth.Source, len(keys))
externals := make([]bool, len(keys))
-keyloop:
+
for i, key := range keys {
if key.LoginSourceID == 0 {
externals[i] = false
- continue keyloop
+ continue
}
- var source *auth.Source
-
- sourceloop:
- for _, s := range sources {
- if s.ID == key.LoginSourceID {
- source = s
- break sourceloop
- }
- }
-
- if source == nil {
+ source, ok := sourceCache[key.LoginSourceID]
+ if !ok {
var err error
source, err = auth.GetSourceByID(ctx, key.LoginSourceID)
if err != nil {
if auth.IsErrSourceNotExist(err) {
externals[i] = false
- sources[i] = &auth.Source{
+ sourceCache[key.LoginSourceID] = &auth.Source{
ID: key.LoginSourceID,
}
- continue keyloop
+ continue
}
return nil, err
}
diff --git a/models/asymkey/ssh_key_test.go b/models/asymkey/ssh_key_test.go
index e4e81f51c..2625d6ac9 100644
--- a/models/asymkey/ssh_key_test.go
+++ b/models/asymkey/ssh_key_test.go
@@ -12,6 +12,8 @@ import (
"strings"
"testing"
+ "code.gitea.io/gitea/models/db"
+ "code.gitea.io/gitea/models/unittest"
"code.gitea.io/gitea/modules/setting"
"github.com/42wim/sshsig"
@@ -501,3 +503,11 @@ func runErr(t *testing.T, stdin []byte, args ...string) {
t.Fatal("expected error")
}
}
+
+func Test_PublicKeysAreExternallyManaged(t *testing.T) {
+ key1 := unittest.AssertExistsAndLoadBean(t, &PublicKey{ID: 1})
+ externals, err := PublicKeysAreExternallyManaged(db.DefaultContext, []*PublicKey{key1})
+ require.NoError(t, err)
+ assert.Len(t, externals, 1)
+ assert.False(t, externals[0])
+}
From 385718dd78bf0b398091565494828aef2ec85f44 Mon Sep 17 00:00:00 2001
From: Jason Song
Date: Sat, 17 Aug 2024 01:04:54 +0800
Subject: [PATCH 4/7] Avoid returning without written ctx when posting PR
(#31843)
Fix #31625.
If `pull_service.NewPullRequest` return an error which misses each `if`
check, `CompareAndPullRequestPost` will return immediately, since it
doesn't write the HTTP response, a 200 response with empty body will be
sent to clients.
```go
if err := pull_service.NewPullRequest(ctx, repo, pullIssue, labelIDs, attachments, pullRequest, assigneeIDs); err != nil {
if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) {
ctx.Error(http.StatusBadRequest, "UserDoesNotHaveAccessToRepo", err.Error())
} else if git.IsErrPushRejected(err) {
// ...
ctx.JSONError(flashError)
} else if errors.Is(err, user_model.ErrBlockedUser) {
// ...
ctx.JSONError(flashError)
} else if errors.Is(err, issues_model.ErrMustCollaborator) {
// ...
ctx.JSONError(flashError)
}
return
}
```
Not sure what kind of error can cause it to happen, so this PR just
expose it. And we can fix it when users report that creating PRs failed
with error responses.
It's all my guess since I cannot reproduce the problem, but even if it's
not related, the code here needs to be improved.
(cherry picked from commit acd7053e9d4968e8b9812ab379be9027ac8e7771)
Conflicts:
routers/web/repo/pull.go
trivial context conflict
---
routers/web/repo/pull.go | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go
index 56a46f7f0..b372ef140 100644
--- a/routers/web/repo/pull.go
+++ b/routers/web/repo/pull.go
@@ -1524,13 +1524,12 @@ func CompareAndPullRequestPost(ctx *context.Context) {
// instead of 500.
if err := pull_service.NewPullRequest(ctx, repo, pullIssue, labelIDs, attachments, pullRequest, assigneeIDs); err != nil {
- if errors.Is(err, user_model.ErrBlockedByUser) {
+ switch {
+ case errors.Is(err, user_model.ErrBlockedByUser):
ctx.JSONError(ctx.Tr("repo.pulls.blocked_by_user"))
- return
- } else if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) {
+ case repo_model.IsErrUserDoesNotHaveAccessToRepo(err):
ctx.Error(http.StatusBadRequest, "UserDoesNotHaveAccessToRepo", err.Error())
- return
- } else if git.IsErrPushRejected(err) {
+ case git.IsErrPushRejected(err):
pushrejErr := err.(*git.ErrPushRejected)
message := pushrejErr.Message
if len(message) == 0 {
@@ -1547,7 +1546,11 @@ func CompareAndPullRequestPost(ctx *context.Context) {
return
}
ctx.JSONError(flashError)
- return
+ default:
+ // It's an unexpected error.
+ // If it happens, we should add another case to handle it.
+ log.Error("Unexpected error of NewPullRequest: %T %s", err, err)
+ ctx.ServerError("CompareAndPullRequest", err)
}
ctx.ServerError("NewPullRequest", err)
return
From 1dfa11551c1c179bb5b9b4e0257178190a4d331f Mon Sep 17 00:00:00 2001
From: Adrian Hirt <13788379+Adrian-Hirt@users.noreply.github.com>
Date: Sat, 17 Aug 2024 05:34:27 +0200
Subject: [PATCH 5/7] Fix overflowing content in action run log (#31842)
When a long line with characters such as dots is returned by a step in
an action (e.g. by the output of the Ruby on Rails test runner), it
overflows the log container, causing the page to scroll sideways.
This PR adds the CSS `overflow-wrap: anywhere;` to the
`.job-step-section .job-step-logs .job-log-line .log-msg` selector,
which causes such lines to wrap as well
(cherry picked from commit 61aaf3440142d225802e3e9ce3db28bcf71f5a7e)
---
web_src/js/components/RepoActionView.vue | 1 +
1 file changed, 1 insertion(+)
diff --git a/web_src/js/components/RepoActionView.vue b/web_src/js/components/RepoActionView.vue
index c807c7daf..4e8e18e80 100644
--- a/web_src/js/components/RepoActionView.vue
+++ b/web_src/js/components/RepoActionView.vue
@@ -878,6 +878,7 @@ export function initRepositoryActionView() {
word-break: break-all;
white-space: break-spaces;
margin-left: 10px;
+ overflow-wrap: anywhere;
}
/* selectors here are intentionally exact to only match fullscreen */
From a8e25e907c66140961f28ba92403176c816dfb60 Mon Sep 17 00:00:00 2001
From: yp05327 <576951401@qq.com>
Date: Fri, 16 Aug 2024 01:34:24 +0900
Subject: [PATCH 6/7] Add missing repository type filter parameters to pager
(#31832)
Fix #31807
ps: the newly added params's value will be changed.
When the first time you selected the filter, the values of params will
be `0` or `1`
But in pager it will be `true` or `false`.
So do we have `boolToInt` function?
(cherry picked from commit 7092402a2db255ecde2c20574b973fb632c16d2e)
Conflicts:
routers/web/org/home.go
trivial conflict s/pager.AddParam/pager.AddParamString/
---
routers/web/explore/repo.go | 15 +++++++++++++++
routers/web/org/home.go | 18 +++++++++++++++++-
routers/web/user/notification.go | 15 +++++++++++++++
routers/web/user/profile.go | 15 +++++++++++++++
4 files changed, 62 insertions(+), 1 deletion(-)
diff --git a/routers/web/explore/repo.go b/routers/web/explore/repo.go
index 4e880660b..e978385b6 100644
--- a/routers/web/explore/repo.go
+++ b/routers/web/explore/repo.go
@@ -144,6 +144,21 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
pager.AddParam(ctx, "topic", "TopicOnly")
pager.AddParam(ctx, "language", "Language")
pager.AddParamString(relevantReposOnlyParam, fmt.Sprint(opts.OnlyShowRelevant))
+ if archived.Has() {
+ pager.AddParamString("archived", fmt.Sprint(archived.Value()))
+ }
+ if fork.Has() {
+ pager.AddParamString("fork", fmt.Sprint(fork.Value()))
+ }
+ if mirror.Has() {
+ pager.AddParamString("mirror", fmt.Sprint(mirror.Value()))
+ }
+ if template.Has() {
+ pager.AddParamString("template", fmt.Sprint(template.Value()))
+ }
+ if private.Has() {
+ pager.AddParamString("private", fmt.Sprint(private.Value()))
+ }
ctx.Data["Page"] = pager
ctx.HTML(http.StatusOK, opts.TplName)
diff --git a/routers/web/org/home.go b/routers/web/org/home.go
index 71d10f3a4..1e04b72cb 100644
--- a/routers/web/org/home.go
+++ b/routers/web/org/home.go
@@ -4,6 +4,7 @@
package org
import (
+ "fmt"
"net/http"
"path"
"strings"
@@ -154,7 +155,22 @@ func Home(ctx *context.Context) {
pager := context.NewPagination(int(count), setting.UI.User.RepoPagingNum, page, 5)
pager.SetDefaultParams(ctx)
- pager.AddParam(ctx, "language", "Language")
+ pager.AddParamString("language", language)
+ if archived.Has() {
+ pager.AddParamString("archived", fmt.Sprint(archived.Value()))
+ }
+ if fork.Has() {
+ pager.AddParamString("fork", fmt.Sprint(fork.Value()))
+ }
+ if mirror.Has() {
+ pager.AddParamString("mirror", fmt.Sprint(mirror.Value()))
+ }
+ if template.Has() {
+ pager.AddParamString("template", fmt.Sprint(template.Value()))
+ }
+ if private.Has() {
+ pager.AddParamString("private", fmt.Sprint(private.Value()))
+ }
ctx.Data["Page"] = pager
ctx.Data["ShowMemberAndTeamTab"] = ctx.Org.IsMember || len(members) > 0
diff --git a/routers/web/user/notification.go b/routers/web/user/notification.go
index f8b68fb18..dfcaf58e0 100644
--- a/routers/web/user/notification.go
+++ b/routers/web/user/notification.go
@@ -446,6 +446,21 @@ func NotificationWatching(ctx *context.Context) {
// redirect to last page if request page is more than total pages
pager := context.NewPagination(total, setting.UI.User.RepoPagingNum, page, 5)
pager.SetDefaultParams(ctx)
+ if archived.Has() {
+ pager.AddParamString("archived", fmt.Sprint(archived.Value()))
+ }
+ if fork.Has() {
+ pager.AddParamString("fork", fmt.Sprint(fork.Value()))
+ }
+ if mirror.Has() {
+ pager.AddParamString("mirror", fmt.Sprint(mirror.Value()))
+ }
+ if template.Has() {
+ pager.AddParamString("template", fmt.Sprint(template.Value()))
+ }
+ if private.Has() {
+ pager.AddParamString("private", fmt.Sprint(private.Value()))
+ }
ctx.Data["Page"] = pager
ctx.Data["Status"] = 2
diff --git a/routers/web/user/profile.go b/routers/web/user/profile.go
index 24b0db2f1..f4b07da1c 100644
--- a/routers/web/user/profile.go
+++ b/routers/web/user/profile.go
@@ -335,6 +335,21 @@ func prepareUserProfileTabData(ctx *context.Context, showPrivate bool, profileDb
if tab == "activity" {
pager.AddParam(ctx, "date", "Date")
}
+ if archived.Has() {
+ pager.AddParamString("archived", fmt.Sprint(archived.Value()))
+ }
+ if fork.Has() {
+ pager.AddParamString("fork", fmt.Sprint(fork.Value()))
+ }
+ if mirror.Has() {
+ pager.AddParamString("mirror", fmt.Sprint(mirror.Value()))
+ }
+ if template.Has() {
+ pager.AddParamString("template", fmt.Sprint(template.Value()))
+ }
+ if private.Has() {
+ pager.AddParamString("private", fmt.Sprint(private.Value()))
+ }
ctx.Data["Page"] = pager
}
From 0fd22546846764c69e028ceb8b773cdf1c47440d Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Sun, 18 Aug 2024 06:30:08 +0200
Subject: [PATCH 7/7] chore(release-notes): weekly cherry-pick week 2024-34
---
release-notes/4998.md | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 release-notes/4998.md
diff --git a/release-notes/4998.md b/release-notes/4998.md
new file mode 100644
index 000000000..436d5201f
--- /dev/null
+++ b/release-notes/4998.md
@@ -0,0 +1,4 @@
+fix: [commit](https://codeberg.org/forgejo/forgejo/commit/7f1db1df3ee8d620f997b8e70a40c2f48ae96c0f) Show lock owner instead of repo owner on LFS setting page.
+feat: [commit](https://codeberg.org/forgejo/forgejo/commit/ebfdc659d814561f8783094e2eb26738a5500e55) Render plain text file if the LFS object doesn't exist.
+fix: [commit](https://codeberg.org/forgejo/forgejo/commit/9e066c3cad7bb1b30e2def34bd0608aac825cf58) Fix panic of ssh public key page after deletion of auth source.
+fix: [commit](https://codeberg.org/forgejo/forgejo/commit/a8e25e907c66140961f28ba92403176c816dfb60) Add missing repository type filter parameters to pager.