From 8efef06fb10b697ea665fe524453344c4a999d18 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 12 Jun 2024 18:22:01 +0800 Subject: [PATCH] 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 --- modules/repository/branch.go | 1 + release-notes/8.0.0/fix/4149.md | 1 + services/repository/adopt_test.go | 30 ++++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 release-notes/8.0.0/fix/4149.md diff --git a/modules/repository/branch.go b/modules/repository/branch.go index a3fca7c7ce..2bf9930f19 100644 --- a/modules/repository/branch.go +++ b/modules/repository/branch.go @@ -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]{} { diff --git a/release-notes/8.0.0/fix/4149.md b/release-notes/8.0.0/fix/4149.md new file mode 100644 index 0000000000..0947df11a0 --- /dev/null +++ b/release-notes/8.0.0/fix/4149.md @@ -0,0 +1 @@ +git push to an adopted repository fails diff --git a/services/repository/adopt_test.go b/services/repository/adopt_test.go index c1520e01c9..454d9a76b9 100644 --- a/services/repository/adopt_test.go +++ b/services/repository/adopt_test.go @@ -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) +}