mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Fix bug when migrate from API (#8631)
* fix bug when migrate from API * fix test * fix test * improve * fix error message
This commit is contained in:
		
				
					committed by
					
						 techknowlogick
						techknowlogick
					
				
			
			
				
	
			
			
			
						parent
						
							55bdc9aa38
						
					
				
				
					commit
					f02138a148
				
			| @@ -334,7 +334,7 @@ func testAPIRepoMigrateConflict(t *testing.T, u *url.URL) { | |||||||
| 		resp := httpContext.Session.MakeRequest(t, req, http.StatusConflict) | 		resp := httpContext.Session.MakeRequest(t, req, http.StatusConflict) | ||||||
| 		respJSON := map[string]string{} | 		respJSON := map[string]string{} | ||||||
| 		DecodeJSON(t, resp, &respJSON) | 		DecodeJSON(t, resp, &respJSON) | ||||||
| 		assert.Equal(t, respJSON["message"], "The repository with the same name already exists.") | 		assert.Equal(t, "The repository with the same name already exists.", respJSON["message"]) | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2840,3 +2840,9 @@ func (repo *Repository) GetTreePathLock(treePath string) (*LFSLock, error) { | |||||||
| 	} | 	} | ||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // UpdateRepositoryCols updates repository's columns | ||||||
|  | func UpdateRepositoryCols(repo *Repository, cols ...string) error { | ||||||
|  | 	_, err := x.ID(repo.ID).Cols(cols...).Update(repo) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|   | |||||||
| @@ -97,8 +97,6 @@ func runMigrateTask(t *models.Task) (err error) { | |||||||
| 	opts.MigrateToRepoID = t.RepoID | 	opts.MigrateToRepoID = t.RepoID | ||||||
| 	repo, err := migrations.MigrateRepository(t.Doer, t.Owner.Name, *opts) | 	repo, err := migrations.MigrateRepository(t.Doer, t.Owner.Name, *opts) | ||||||
| 	if err == nil { | 	if err == nil { | ||||||
| 		notification.NotifyMigrateRepository(t.Doer, t.Owner, repo) |  | ||||||
|  |  | ||||||
| 		log.Trace("Repository migrated [%d]: %s/%s", repo.ID, t.Owner.Name, repo.Name) | 		log.Trace("Repository migrated [%d]: %s/%s", repo.ID, t.Owner.Name, repo.Name) | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -6,6 +6,8 @@ | |||||||
| package repo | package repo | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| @@ -425,15 +427,54 @@ func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) { | |||||||
| 		opts.Releases = false | 		opts.Releases = false | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	repo, err := migrations.MigrateRepository(ctx.User, ctxUser.Name, opts) | 	repo, err := models.CreateRepository(ctx.User, ctxUser, models.CreateRepoOptions{ | ||||||
| 	if err == nil { | 		Name:        opts.RepoName, | ||||||
| 		notification.NotifyMigrateRepository(ctx.User, ctxUser, repo) | 		Description: opts.Description, | ||||||
|  | 		OriginalURL: opts.CloneAddr, | ||||||
| 		log.Trace("Repository migrated: %s/%s", ctxUser.Name, form.RepoName) | 		IsPrivate:   opts.Private, | ||||||
| 		ctx.JSON(201, repo.APIFormat(models.AccessModeAdmin)) | 		IsMirror:    opts.Mirror, | ||||||
|  | 		Status:      models.RepositoryBeingMigrated, | ||||||
|  | 	}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		handleMigrateError(ctx, ctxUser, remoteAddr, err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	opts.MigrateToRepoID = repo.ID | ||||||
|  |  | ||||||
|  | 	defer func() { | ||||||
|  | 		if e := recover(); e != nil { | ||||||
|  | 			var buf bytes.Buffer | ||||||
|  | 			fmt.Fprintf(&buf, "Handler crashed with error: %v", log.Stack(2)) | ||||||
|  |  | ||||||
|  | 			err = errors.New(buf.String()) | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if err == nil { | ||||||
|  | 			repo.Status = models.RepositoryReady | ||||||
|  | 			if err := models.UpdateRepositoryCols(repo, "status"); err == nil { | ||||||
|  | 				notification.NotifyMigrateRepository(ctx.User, ctxUser, repo) | ||||||
|  | 				return | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if repo != nil { | ||||||
|  | 			if errDelete := models.DeleteRepository(ctx.User, ctxUser.ID, repo.ID); errDelete != nil { | ||||||
|  | 				log.Error("DeleteRepository: %v", errDelete) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
|  |  | ||||||
|  | 	if _, err = migrations.MigrateRepository(ctx.User, ctxUser.Name, opts); err != nil { | ||||||
|  | 		handleMigrateError(ctx, ctxUser, remoteAddr, err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	log.Trace("Repository migrated: %s/%s", ctxUser.Name, form.RepoName) | ||||||
|  | 	ctx.JSON(201, repo.APIFormat(models.AccessModeAdmin)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func handleMigrateError(ctx *context.APIContext, repoOwner *models.User, remoteAddr string, err error) { | ||||||
| 	switch { | 	switch { | ||||||
| 	case models.IsErrRepoAlreadyExist(err): | 	case models.IsErrRepoAlreadyExist(err): | ||||||
| 		ctx.Error(409, "", "The repository with the same name already exists.") | 		ctx.Error(409, "", "The repository with the same name already exists.") | ||||||
| @@ -442,7 +483,7 @@ func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) { | |||||||
| 	case migrations.IsTwoFactorAuthError(err): | 	case migrations.IsTwoFactorAuthError(err): | ||||||
| 		ctx.Error(422, "", "Remote visit required two factors authentication.") | 		ctx.Error(422, "", "Remote visit required two factors authentication.") | ||||||
| 	case models.IsErrReachLimitOfRepo(err): | 	case models.IsErrReachLimitOfRepo(err): | ||||||
| 		ctx.Error(422, "", fmt.Sprintf("You have already reached your limit of %d repositories.", ctxUser.MaxCreationLimit())) | 		ctx.Error(422, "", fmt.Sprintf("You have already reached your limit of %d repositories.", repoOwner.MaxCreationLimit())) | ||||||
| 	case models.IsErrNameReserved(err): | 	case models.IsErrNameReserved(err): | ||||||
| 		ctx.Error(422, "", fmt.Sprintf("The username '%s' is reserved.", err.(models.ErrNameReserved).Name)) | 		ctx.Error(422, "", fmt.Sprintf("The username '%s' is reserved.", err.(models.ErrNameReserved).Name)) | ||||||
| 	case models.IsErrNamePatternNotAllowed(err): | 	case models.IsErrNamePatternNotAllowed(err): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user