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.
This commit is contained in:
Gusted 2024-12-03 05:29:07 +01:00
parent b525eec82b
commit b500c48fa0
No known key found for this signature in database
GPG key ID: FD821B732837125F
2 changed files with 17 additions and 6 deletions

View file

@ -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
}

View file

@ -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)
}