From 2f0f42272ca3a464b914073aecc71e72701026a0 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Sat, 30 May 2026 13:25:36 +0200 Subject: [PATCH] fix: re-uploading the same avatar doesn't delete it (#12823) Fixes #12822. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/12823 Reviewed-by: Gusted --- services/user/avatar.go | 6 +++--- services/user/avatar_test.go | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/services/user/avatar.go b/services/user/avatar.go index 7ccb5e8c70..e6aef71f0e 100644 --- a/services/user/avatar.go +++ b/services/user/avatar.go @@ -35,15 +35,15 @@ func UploadAvatar(ctx context.Context, u *user_model.User, data []byte) error { return fmt.Errorf("updateUser: %w", err) } - if err := avatarstore.StoreAvatar(u.CustomAvatarRelativePath(), avatarData, img, storage.Avatars); err != nil { - return fmt.Errorf("Failed to store avatar at %s: %w", u.CustomAvatarRelativePath(), err) - } if len(previousAvatar) > 0 { err := avatarstore.DeleteAvatar(previousAvatar, storage.Avatars) if err != nil { return err } } + if err := avatarstore.StoreAvatar(u.CustomAvatarRelativePath(), avatarData, img, storage.Avatars); err != nil { + return fmt.Errorf("Failed to store avatar at %s: %w", u.CustomAvatarRelativePath(), err) + } return committer.Commit() } diff --git a/services/user/avatar_test.go b/services/user/avatar_test.go index 5ed7437f5a..f3be1ec8c8 100644 --- a/services/user/avatar_test.go +++ b/services/user/avatar_test.go @@ -136,4 +136,26 @@ func TestUserReplaceAvatar(t *testing.T) { require.Error(t, err) assert.Nil(t, fi) }) + + t.Run("ReplaceAvatarByItself", func(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + + err := UploadAvatar(db.DefaultContext, user, firstBuff.Bytes()) + require.NoError(t, err) + user = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + firstImageHash := user.Avatar + assert.NotEmpty(t, firstImageHash) + + err = UploadAvatar(db.DefaultContext, user, firstBuff.Bytes()) + require.NoError(t, err) + user = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + secondImageHash := user.Avatar + assert.Equal(t, firstImageHash, secondImageHash) + + // The avatar is still available in storage + fi, err := storage.Avatars.Stat(firstImageHash) + require.NoError(t, err) + assert.NotNil(t, fi) + }) }