From be076c98d4bf09f05bb5f2a548d06acb4877c236 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 21 Dec 2024 20:04:13 +0100 Subject: [PATCH] fix: repo avatar generating (#6338) --- services/repository/avatar.go | 14 ++++++++++++-- services/repository/avatar_test.go | 26 +++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/services/repository/avatar.go b/services/repository/avatar.go index 38c2621bc4..32940a7aa3 100644 --- a/services/repository/avatar.go +++ b/services/repository/avatar.go @@ -8,7 +8,6 @@ import ( "fmt" "io" "strconv" - "strings" "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" @@ -107,7 +106,18 @@ func RemoveRandomAvatars(ctx context.Context) error { // generateAvatar generates the avatar from a template repository func generateAvatar(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error { - generateRepo.Avatar = strings.Replace(templateRepo.Avatar, strconv.FormatInt(templateRepo.ID, 10), strconv.FormatInt(generateRepo.ID, 10), 1) + file, err := storage.RepoAvatars.Open(templateRepo.CustomAvatarRelativePath()) + if err != nil { + return err + } + defer file.Close() + + data, err := io.ReadAll(file) + if err != nil { + return err + } + + generateRepo.Avatar = avatar.HashAvatar(generateRepo.ID, data) if _, err := storage.Copy(storage.RepoAvatars, generateRepo.CustomAvatarRelativePath(), storage.RepoAvatars, templateRepo.CustomAvatarRelativePath()); err != nil { return err } diff --git a/services/repository/avatar_test.go b/services/repository/avatar_test.go index f0fe991de8..b3c498dfc8 100644 --- a/services/repository/avatar_test.go +++ b/services/repository/avatar_test.go @@ -29,7 +29,7 @@ func TestUploadAvatar(t *testing.T) { err := UploadAvatar(db.DefaultContext, repo, buff.Bytes()) require.NoError(t, err) - assert.Equal(t, avatar.HashAvatar(10, buff.Bytes()), repo.Avatar) + assert.Equal(t, avatar.HashAvatar(repo.ID, buff.Bytes()), repo.Avatar) } func TestUploadBigAvatar(t *testing.T) { @@ -62,3 +62,27 @@ func TestDeleteAvatar(t *testing.T) { assert.Equal(t, "", repo.Avatar) } + +func TestTemplateGenerateAvatar(t *testing.T) { + // Generate image + myImage := image.NewRGBA(image.Rect(0, 0, 1, 1)) + var buff bytes.Buffer + png.Encode(&buff, myImage) + + require.NoError(t, unittest.PrepareTestDatabase()) + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10}) + + // Upload Avatar + err := UploadAvatar(db.DefaultContext, repo, buff.Bytes()) + require.NoError(t, err) + assert.Equal(t, avatar.HashAvatar(repo.ID, buff.Bytes()), repo.Avatar) + + // Generate the Avatar for Another Repo + genRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 11}) + err = generateAvatar(db.DefaultContext, repo, genRepo) + require.NoError(t, err) + assert.Equal(t, avatar.HashAvatar(genRepo.ID, buff.Bytes()), genRepo.Avatar) + + // Make sure The 2 Hashes are not the same + assert.NotEqual(t, repo.Avatar, genRepo.Avatar) +}