Fix bug when migrating repository (#34182)

This PR fixed a bug which is a regression from #31035
This commit is contained in:
Lunny Xiao
2025-04-13 21:48:03 -07:00
committed by GitHub
parent 8a6df00c53
commit f6474cf2e9
12 changed files with 19 additions and 17 deletions

View File

@ -181,7 +181,7 @@ func Migrate(ctx *context.APIContext) {
IsPrivate: opts.Private || setting.Repository.ForcePrivate, IsPrivate: opts.Private || setting.Repository.ForcePrivate,
IsMirror: opts.Mirror, IsMirror: opts.Mirror,
Status: repo_model.RepositoryBeingMigrated, Status: repo_model.RepositoryBeingMigrated,
}) }, false)
if err != nil { if err != nil {
handleMigrateError(ctx, repoOwner, err) handleMigrateError(ctx, repoOwner, err)
return return

View File

@ -107,7 +107,7 @@ func (g *GiteaLocalUploader) CreateRepo(ctx context.Context, repo *base.Reposito
IsPrivate: opts.Private || setting.Repository.ForcePrivate, IsPrivate: opts.Private || setting.Repository.ForcePrivate,
IsMirror: opts.Mirror, IsMirror: opts.Mirror,
Status: repo_model.RepositoryBeingMigrated, Status: repo_model.RepositoryBeingMigrated,
}) }, false)
} else { } else {
r, err = repo_model.GetRepositoryByID(ctx, opts.MigrateToRepoID) r, err = repo_model.GetRepositoryByID(ctx, opts.MigrateToRepoID)
} }

View File

@ -205,7 +205,8 @@ func TestIncludesAllRepositoriesTeams(t *testing.T) {
// Create repos. // Create repos.
repoIDs := make([]int64, 0) repoIDs := make([]int64, 0)
for i := 0; i < 3; i++ { for i := 0; i < 3; i++ {
r, err := repo_service.CreateRepositoryDirectly(db.DefaultContext, user, org.AsUser(), repo_service.CreateRepoOptions{Name: fmt.Sprintf("repo-%d", i)}) r, err := repo_service.CreateRepositoryDirectly(db.DefaultContext, user, org.AsUser(),
repo_service.CreateRepoOptions{Name: fmt.Sprintf("repo-%d", i)}, true)
assert.NoError(t, err, "CreateRepository %d", i) assert.NoError(t, err, "CreateRepository %d", i)
if r != nil { if r != nil {
repoIDs = append(repoIDs, r.ID) repoIDs = append(repoIDs, r.ID)
@ -267,7 +268,7 @@ func TestIncludesAllRepositoriesTeams(t *testing.T) {
} }
// Create repo and check teams repositories. // Create repo and check teams repositories.
r, err := repo_service.CreateRepositoryDirectly(db.DefaultContext, user, org.AsUser(), repo_service.CreateRepoOptions{Name: "repo-last"}) r, err := repo_service.CreateRepositoryDirectly(db.DefaultContext, user, org.AsUser(), repo_service.CreateRepoOptions{Name: "repo-last"}, true)
assert.NoError(t, err, "CreateRepository last") assert.NoError(t, err, "CreateRepository last")
if r != nil { if r != nil {
repoIDs = append(repoIDs, r.ID) repoIDs = append(repoIDs, r.ID)

View File

@ -213,7 +213,7 @@ func getOrCreateIndexRepository(ctx context.Context, doer, owner *user_model.Use
if errors.Is(err, util.ErrNotExist) { if errors.Is(err, util.ErrNotExist) {
repo, err = repo_service.CreateRepositoryDirectly(ctx, doer, owner, repo_service.CreateRepoOptions{ repo, err = repo_service.CreateRepositoryDirectly(ctx, doer, owner, repo_service.CreateRepoOptions{
Name: IndexRepositoryName, Name: IndexRepositoryName,
}) }, true)
if err != nil { if err != nil {
return nil, fmt.Errorf("CreateRepository: %w", err) return nil, fmt.Errorf("CreateRepository: %w", err)
} }

View File

@ -199,7 +199,10 @@ func initRepository(ctx context.Context, u *user_model.User, repo *repo_model.Re
} }
// CreateRepositoryDirectly creates a repository for the user/organization. // CreateRepositoryDirectly creates a repository for the user/organization.
func CreateRepositoryDirectly(ctx context.Context, doer, owner *user_model.User, opts CreateRepoOptions) (*repo_model.Repository, error) { // if needsUpdateToReady is true, it will update the repository status to ready when success
func CreateRepositoryDirectly(ctx context.Context, doer, owner *user_model.User,
opts CreateRepoOptions, needsUpdateToReady bool,
) (*repo_model.Repository, error) {
if !doer.CanCreateRepoIn(owner) { if !doer.CanCreateRepoIn(owner) {
return nil, repo_model.ErrReachLimitOfRepo{ return nil, repo_model.ErrReachLimitOfRepo{
Limit: owner.MaxRepoCreation, Limit: owner.MaxRepoCreation,
@ -243,8 +246,6 @@ func CreateRepositoryDirectly(ctx context.Context, doer, owner *user_model.User,
ObjectFormatName: opts.ObjectFormatName, ObjectFormatName: opts.ObjectFormatName,
} }
needsUpdateStatus := opts.Status != repo_model.RepositoryReady
// 1 - create the repository database operations first // 1 - create the repository database operations first
err := db.WithTx(ctx, func(ctx context.Context) error { err := db.WithTx(ctx, func(ctx context.Context) error {
return createRepositoryInDB(ctx, doer, owner, repo, false) return createRepositoryInDB(ctx, doer, owner, repo, false)
@ -318,7 +319,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, owner *user_model.User,
} }
// 7 - update repository status to be ready // 7 - update repository status to be ready
if needsUpdateStatus { if needsUpdateToReady {
repo.Status = repo_model.RepositoryReady repo.Status = repo_model.RepositoryReady
if err = repo_model.UpdateRepositoryCols(ctx, repo, "status"); err != nil { if err = repo_model.UpdateRepositoryCols(ctx, repo, "status"); err != nil {
return nil, fmt.Errorf("UpdateRepositoryCols: %w", err) return nil, fmt.Errorf("UpdateRepositoryCols: %w", err)

View File

@ -25,7 +25,7 @@ func TestCreateRepositoryDirectly(t *testing.T) {
createdRepo, err := CreateRepositoryDirectly(git.DefaultContext, user2, user2, CreateRepoOptions{ createdRepo, err := CreateRepositoryDirectly(git.DefaultContext, user2, user2, CreateRepoOptions{
Name: "created-repo", Name: "created-repo",
}) }, true)
assert.NoError(t, err) assert.NoError(t, err)
assert.NotNil(t, createdRepo) assert.NotNil(t, createdRepo)
@ -44,7 +44,7 @@ func TestCreateRepositoryDirectly(t *testing.T) {
createdRepo2, err := CreateRepositoryDirectly(db.DefaultContext, user2, user2, CreateRepoOptions{ createdRepo2, err := CreateRepositoryDirectly(db.DefaultContext, user2, user2, CreateRepoOptions{
Name: "created-repo", Name: "created-repo",
}) }, true)
assert.Nil(t, createdRepo2) assert.Nil(t, createdRepo2)
assert.Error(t, err) assert.Error(t, err)

View File

@ -47,7 +47,7 @@ type WebSearchResults struct {
// CreateRepository creates a repository for the user/organization. // CreateRepository creates a repository for the user/organization.
func CreateRepository(ctx context.Context, doer, owner *user_model.User, opts CreateRepoOptions) (*repo_model.Repository, error) { func CreateRepository(ctx context.Context, doer, owner *user_model.User, opts CreateRepoOptions) (*repo_model.Repository, error) {
repo, err := CreateRepositoryDirectly(ctx, doer, owner, opts) repo, err := CreateRepositoryDirectly(ctx, doer, owner, opts, true)
if err != nil { if err != nil {
// No need to rollback here we should do this in CreateRepository... // No need to rollback here we should do this in CreateRepository...
return nil, err return nil, err

View File

@ -111,7 +111,7 @@ func CreateMigrateTask(ctx context.Context, doer, u *user_model.User, opts base.
IsPrivate: opts.Private || setting.Repository.ForcePrivate, IsPrivate: opts.Private || setting.Repository.ForcePrivate,
IsMirror: opts.Mirror, IsMirror: opts.Mirror,
Status: repo_model.RepositoryBeingMigrated, Status: repo_model.RepositoryBeingMigrated,
}) }, false)
if err != nil { if err != nil {
task.EndTime = timeutil.TimeStampNow() task.EndTime = timeutil.TimeStampNow()
task.Status = structs.TaskStatusFailed task.Status = structs.TaskStatusFailed

View File

@ -133,7 +133,7 @@ func TestCompareCodeExpand(t *testing.T) {
Readme: "Default", Readme: "Default",
AutoInit: true, AutoInit: true,
DefaultBranch: "main", DefaultBranch: "main",
}) }, true)
assert.NoError(t, err) assert.NoError(t, err)
session := loginUser(t, user1.Name) session := loginUser(t, user1.Name)

View File

@ -48,7 +48,7 @@ func TestMirrorPull(t *testing.T) {
IsPrivate: opts.Private, IsPrivate: opts.Private,
IsMirror: opts.Mirror, IsMirror: opts.Mirror,
Status: repo_model.RepositoryBeingMigrated, Status: repo_model.RepositoryBeingMigrated,
}) }, false)
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, mirrorRepo.IsMirror, "expected pull-mirror repo to be marked as a mirror immediately after its creation") assert.True(t, mirrorRepo.IsMirror, "expected pull-mirror repo to be marked as a mirror immediately after its creation")

View File

@ -40,7 +40,7 @@ func testMirrorPush(t *testing.T, u *url.URL) {
mirrorRepo, err := repo_service.CreateRepositoryDirectly(db.DefaultContext, user, user, repo_service.CreateRepoOptions{ mirrorRepo, err := repo_service.CreateRepositoryDirectly(db.DefaultContext, user, user, repo_service.CreateRepoOptions{
Name: "test-push-mirror", Name: "test-push-mirror",
}) }, true)
assert.NoError(t, err) assert.NoError(t, err)
session := loginUser(t, user.Name) session := loginUser(t, user.Name)

View File

@ -58,7 +58,7 @@ func TestPullView_CodeOwner(t *testing.T) {
AutoInit: true, AutoInit: true,
ObjectFormatName: git.Sha1ObjectFormat.Name(), ObjectFormatName: git.Sha1ObjectFormat.Name(),
DefaultBranch: "master", DefaultBranch: "master",
}) }, true)
assert.NoError(t, err) assert.NoError(t, err)
// add CODEOWNERS to default branch // add CODEOWNERS to default branch