From be076c98d4bf09f05bb5f2a548d06acb4877c236 Mon Sep 17 00:00:00 2001
From: Snoweuph <snow+git@euph.email>
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)
+}