fix(repository): git push to an adopted repository fails

Fix adopt repository has empty object name in database (#31333)

Fix #31330
Fix #31311

A workaround to fix the old database is to update object_format_name to
`sha1` if it's empty or null.

(cherry picked from commit 1968c2222dcf47ebd1697afb4e79a81e74702d31)

With tests services/repository/adopt_test.go
This commit is contained in:
Lunny Xiao 2024-06-12 18:22:01 +08:00 committed by Twenty Panda
parent c984e62378
commit 8efef06fb1
3 changed files with 32 additions and 0 deletions

View file

@ -45,6 +45,7 @@ func SyncRepoBranchesWithRepo(ctx context.Context, repo *repo_model.Repository,
if err != nil {
return 0, fmt.Errorf("UpdateRepository: %w", err)
}
repo.ObjectFormatName = objFmt.Name() // keep consistent with db
allBranches := container.Set[string]{}
{

View file

@ -0,0 +1 @@
git push to an adopted repository fails

View file

@ -10,9 +10,12 @@ import (
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/setting"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestCheckUnadoptedRepositories_Add(t *testing.T) {
@ -83,3 +86,30 @@ func TestListUnadoptedRepositories_ListOptions(t *testing.T) {
assert.Equal(t, 2, count)
assert.Equal(t, unadoptedList[1], repoNames[0])
}
func TestAdoptRepository(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
username := "user2"
unadopted := "unadopted"
assert.NoError(t, unittest.CopyDir(
"../../modules/git/tests/repos/repo1_bare",
path.Join(setting.RepoRootPath, username, unadopted+".git"),
))
opts := db.ListOptions{Page: 1, PageSize: 1}
repoNames, _, err := ListUnadoptedRepositories(db.DefaultContext, "", &opts)
require.NoError(t, err)
require.Contains(t, repoNames, path.Join(username, unadopted))
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
repo, err := AdoptRepository(db.DefaultContext, doer, owner, CreateRepoOptions{
Name: unadopted,
Description: "description",
IsPrivate: false,
AutoInit: true,
})
assert.NoError(t, err)
assert.Equal(t, git.Sha1ObjectFormat.Name(), repo.ObjectFormatName)
}