mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 20:36:07 +01:00 
			
		
		
		
	Fix bug when migrating repository (#34182)
This PR fixed a bug which is a regression from #31035
This commit is contained in:
		@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user