From b500c48fa032e4f3cd5f63911ed24a4434639f04 Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 3 Dec 2024 05:29:07 +0100 Subject: [PATCH] feat: avoid sorting for `MakeSelfOnTop` - Although sorting can be used to make the doer the first user of the list, this isn't optimal and can be instead done with a linear search, remove that entry and add the doer to the front of the slice. - Extra unit test added. --- routers/web/repo/helper.go | 12 ++++++------ routers/web/repo/helper_test.go | 11 +++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/routers/web/repo/helper.go b/routers/web/repo/helper.go index 5e1e116018..6fa7579231 100644 --- a/routers/web/repo/helper.go +++ b/routers/web/repo/helper.go @@ -5,7 +5,7 @@ package repo import ( "net/url" - "sort" + "slices" "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/git" @@ -14,12 +14,12 @@ import ( func MakeSelfOnTop(doer *user.User, users []*user.User) []*user.User { if doer != nil { - sort.Slice(users, func(i, j int) bool { - if users[i].ID == users[j].ID { - return false - } - return users[i].ID == doer.ID // if users[i] is self, put it before others, so less=true + doerIndex := slices.IndexFunc(users, func(user *user.User) bool { + return user.ID == doer.ID }) + if doerIndex != -1 { + return slices.Insert(slices.Delete(users, doerIndex, doerIndex+1), 0, doer) + } } return users } diff --git a/routers/web/repo/helper_test.go b/routers/web/repo/helper_test.go index 978758e77f..844ad5bf79 100644 --- a/routers/web/repo/helper_test.go +++ b/routers/web/repo/helper_test.go @@ -23,4 +23,15 @@ func TestMakeSelfOnTop(t *testing.T) { users = MakeSelfOnTop(&user.User{ID: 2}, []*user.User{{ID: 2}, {ID: 1}}) assert.Len(t, users, 2) assert.EqualValues(t, 2, users[0].ID) + + users = MakeSelfOnTop(&user.User{ID: 2}, []*user.User{{ID: 1}}) + assert.Len(t, users, 1) + assert.EqualValues(t, 1, users[0].ID) + + users = MakeSelfOnTop(&user.User{ID: 2}, []*user.User{{ID: 1}, {ID: 2}, {ID: 3}, {ID: 4}}) + assert.Len(t, users, 4) + assert.EqualValues(t, 2, users[0].ID) + assert.EqualValues(t, 1, users[1].ID) + assert.EqualValues(t, 3, users[2].ID) + assert.EqualValues(t, 4, users[3].ID) }