diff --git a/models/repo.go b/models/repo.go index 2d31184d6d6f..582df7613a48 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1781,6 +1781,12 @@ func UpdateRepository(repo *Repository, visibilityChanged bool) (err error) { return sess.Commit() } +// UpdateRepositoryStatus updates a repository's status +func UpdateRepositoryStatus(repoID int64, status RepositoryStatus) error { + _, err := x.Exec("UPDATE repository SET status = ? WHERE id = ?", status, repoID) + return err +} + // UpdateRepositoryUpdatedTime updates a repository's updated time func UpdateRepositoryUpdatedTime(repoID int64, updateTime time.Time) error { _, err := x.Exec("UPDATE repository SET updated_unix = ? WHERE id = ?", updateTime.Unix(), repoID) diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index a4417107ee38..8edb53a61f8e 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" @@ -431,10 +433,31 @@ func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) { opts.Releases = false } - repo, err := migrations.MigrateRepository(ctx.User, ctxUser.Name, opts) - if err == nil { - notification.NotifyCreateRepository(ctx.User, ctxUser, repo) + var repo *models.Repository + 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.UpdateRepositoryStatus(repo.ID, 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) + } + } + }() + + repo, err = migrations.MigrateRepository(ctx.User, ctxUser.Name, opts) + if err == nil { log.Trace("Repository migrated: %s/%s", ctxUser.Name, form.RepoName) ctx.JSON(201, repo.APIFormat(models.AccessModeAdmin)) return