From 9d1c72ae7c388f7f588c25d249b44cf2a3d633e4 Mon Sep 17 00:00:00 2001 From: kiatt210 <40639725+kiatt210@users.noreply.github.com> Date: Sun, 23 Jun 2024 09:50:10 +0200 Subject: [PATCH 1/3] Fix web notification icon not updated once you read all notifications (#31447) Fix #29065 Remove status filtering from GetUIDsAndNotificationCounts sql. --------- Co-authored-by: kiatt210 Co-authored-by: wxiaoguang (cherry picked from commit 6a96deb5898745d957ffd7860b2b6821c673e907) --- models/activities/notification.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/models/activities/notification.go b/models/activities/notification.go index 8e2b6d6937..09cc640224 100644 --- a/models/activities/notification.go +++ b/models/activities/notification.go @@ -287,13 +287,14 @@ type UserIDCount struct { Count int64 } -// GetUIDsAndNotificationCounts between the two provided times +// GetUIDsAndNotificationCounts returns the unread counts for every user between the two provided times. +// It must return all user IDs which appear during the period, including count=0 for users who have read all. func GetUIDsAndNotificationCounts(ctx context.Context, since, until timeutil.TimeStamp) ([]UserIDCount, error) { - sql := `SELECT user_id, count(*) AS count FROM notification ` + + sql := `SELECT user_id, sum(case when status= ? then 1 else 0 end) AS count FROM notification ` + `WHERE user_id IN (SELECT user_id FROM notification WHERE updated_unix >= ? AND ` + - `updated_unix < ?) AND status = ? GROUP BY user_id` + `updated_unix < ?) GROUP BY user_id` var res []UserIDCount - return res, db.GetEngine(ctx).SQL(sql, since, until, NotificationStatusUnread).Find(&res) + return res, db.GetEngine(ctx).SQL(sql, NotificationStatusUnread, since, until).Find(&res) } // SetIssueReadBy sets issue to be read by given user. From 45181ee9453467b2e9a213888c9018a78894820f Mon Sep 17 00:00:00 2001 From: Royce Remer Date: Fri, 28 Jun 2024 01:42:57 -0700 Subject: [PATCH 2/3] Support legacy _links LFS batch responses (#31513) Support legacy _links LFS batch response. Fixes #31512. This is backwards-compatible change to the LFS client so that, upon mirroring from an upstream which has a batch api, it can download objects whether the responses contain the `_links` field or its successor the `actions` field. When Gitea must fallback to the legacy `_links` field a logline is emitted at INFO level which looks like this: ``` ...s/lfs/http_client.go:188:performOperation() [I] is using a deprecated batch schema response! ``` I've only run `test-backend` with this code, but added a new test to cover this case. Additionally I have a fork with this change deployed which I've confirmed syncs LFS from Gitea<-Artifactory (which has legacy `_links`) as well as from Gitea<-Gitea (which has the modern `actions`). Signed-off-by: Royce Remer (cherry picked from commit df805d6ed0458dbec258d115238fde794ed4d0ce) --- modules/lfs/http_client.go | 4 ++++ modules/lfs/http_client_test.go | 16 ++++++++++++++++ modules/lfs/shared.go | 1 + 3 files changed, 21 insertions(+) diff --git a/modules/lfs/http_client.go b/modules/lfs/http_client.go index f5ddd38b09..7ee2449b0e 100644 --- a/modules/lfs/http_client.go +++ b/modules/lfs/http_client.go @@ -180,6 +180,10 @@ func (c *HTTPClient) performOperation(ctx context.Context, objects []Pointer, dc } } else { link, ok := object.Actions["download"] + if !ok { + // no actions block in response, try legacy response schema + link, ok = object.Links["download"] + } if !ok { log.Debug("%+v", object) return errors.New("missing action 'download'") diff --git a/modules/lfs/http_client_test.go b/modules/lfs/http_client_test.go index 7431132f76..ec90f5375d 100644 --- a/modules/lfs/http_client_test.go +++ b/modules/lfs/http_client_test.go @@ -59,6 +59,17 @@ func lfsTestRoundtripHandler(req *http.Request) *http.Response { }, }, } + } else if strings.Contains(url, "legacy-batch-request-download") { + batchResponse = &BatchResponse{ + Transfer: "dummy", + Objects: []*ObjectResponse{ + { + Links: map[string]*Link{ + "download": {}, + }, + }, + }, + } } else if strings.Contains(url, "valid-batch-request-upload") { batchResponse = &BatchResponse{ Transfer: "dummy", @@ -229,6 +240,11 @@ func TestHTTPClientDownload(t *testing.T) { endpoint: "https://unknown-actions-map.io", expectederror: "missing action 'download'", }, + // case 11 + { + endpoint: "https://legacy-batch-request-download.io", + expectederror: "", + }, } for n, c := range cases { diff --git a/modules/lfs/shared.go b/modules/lfs/shared.go index 80f4fed00d..675d2328b7 100644 --- a/modules/lfs/shared.go +++ b/modules/lfs/shared.go @@ -47,6 +47,7 @@ type BatchResponse struct { type ObjectResponse struct { Pointer Actions map[string]*Link `json:"actions,omitempty"` + Links map[string]*Link `json:"_links,omitempty"` Error *ObjectError `json:"error,omitempty"` } From a2426e2f901ad6bc5b98566ffc6407c5f18d0546 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Sat, 29 Jun 2024 08:03:51 +0200 Subject: [PATCH 3/3] docs(release-notes): week 2024-27 cherry pick --- release-notes/8.0.0/feat/31513.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 release-notes/8.0.0/feat/31513.md diff --git a/release-notes/8.0.0/feat/31513.md b/release-notes/8.0.0/feat/31513.md new file mode 100644 index 0000000000..3c9baf5d70 --- /dev/null +++ b/release-notes/8.0.0/feat/31513.md @@ -0,0 +1 @@ +- add support for LFS server implementations which have batch API responses in an older/deprecated schema