diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2019-11-09 06:21:00 +0800 |
---|---|---|
committer | techknowlogick <techknowlogick@gitea.io> | 2019-11-08 17:21:00 -0500 |
commit | f02138a1480015b9aa6ab5eef82506242d98612e (patch) | |
tree | c36279722458cd88c9146e697668b2b7c5753c18 /routers | |
parent | 55bdc9aa38177f75fdae4cb96e98bf465d7ecb2a (diff) | |
download | gitea-f02138a1480015b9aa6ab5eef82506242d98612e.tar.gz gitea-f02138a1480015b9aa6ab5eef82506242d98612e.zip |
Fix bug when migrate from API (#8631)
* fix bug when migrate from API
* fix test
* fix test
* improve
* fix error message
Diffstat (limited to 'routers')
-rw-r--r-- | routers/api/v1/repo/repo.go | 53 |
1 files changed, 47 insertions, 6 deletions
diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index d366435a2f..7b752370d4 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -6,6 +6,8 @@ package repo import ( + "bytes" + "errors" "fmt" "net/http" "net/url" @@ -425,15 +427,54 @@ func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) { opts.Releases = false } - repo, err := migrations.MigrateRepository(ctx.User, ctxUser.Name, opts) - if err == nil { - notification.NotifyMigrateRepository(ctx.User, ctxUser, repo) + repo, err := models.CreateRepository(ctx.User, ctxUser, models.CreateRepoOptions{ + Name: opts.RepoName, + Description: opts.Description, + OriginalURL: opts.CloneAddr, + IsPrivate: opts.Private, + IsMirror: opts.Mirror, + Status: models.RepositoryBeingMigrated, + }) + if err != nil { + handleMigrateError(ctx, ctxUser, remoteAddr, err) + return + } + + opts.MigrateToRepoID = repo.ID - log.Trace("Repository migrated: %s/%s", ctxUser.Name, form.RepoName) - ctx.JSON(201, repo.APIFormat(models.AccessModeAdmin)) + 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 { case models.IsErrRepoAlreadyExist(err): 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): ctx.Error(422, "", "Remote visit required two factors authentication.") 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): ctx.Error(422, "", fmt.Sprintf("The username '%s' is reserved.", err.(models.ErrNameReserved).Name)) case models.IsErrNamePatternNotAllowed(err): |