summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2019-11-09 06:21:00 +0800
committertechknowlogick <techknowlogick@gitea.io>2019-11-08 17:21:00 -0500
commitf02138a1480015b9aa6ab5eef82506242d98612e (patch)
treec36279722458cd88c9146e697668b2b7c5753c18
parent55bdc9aa38177f75fdae4cb96e98bf465d7ecb2a (diff)
downloadgitea-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
-rw-r--r--integrations/api_repo_test.go2
-rw-r--r--models/repo.go6
-rw-r--r--modules/task/migrate.go2
-rw-r--r--routers/api/v1/repo/repo.go53
4 files changed, 54 insertions, 9 deletions
diff --git a/integrations/api_repo_test.go b/integrations/api_repo_test.go
index 60fe4a3649..a2683d4af4 100644
--- a/integrations/api_repo_test.go
+++ b/integrations/api_repo_test.go
@@ -334,7 +334,7 @@ func testAPIRepoMigrateConflict(t *testing.T, u *url.URL) {
resp := httpContext.Session.MakeRequest(t, req, http.StatusConflict)
respJSON := map[string]string{}
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"])
})
}
diff --git a/models/repo.go b/models/repo.go
index e0a93aaebf..812460e92f 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -2840,3 +2840,9 @@ func (repo *Repository) GetTreePathLock(treePath string) (*LFSLock, error) {
}
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
+}
diff --git a/modules/task/migrate.go b/modules/task/migrate.go
index 5d15a506d7..247403d7be 100644
--- a/modules/task/migrate.go
+++ b/modules/task/migrate.go
@@ -97,8 +97,6 @@ func runMigrateTask(t *models.Task) (err error) {
opts.MigrateToRepoID = t.RepoID
repo, err := migrations.MigrateRepository(t.Doer, t.Owner.Name, *opts)
if err == nil {
- notification.NotifyMigrateRepository(t.Doer, t.Owner, repo)
-
log.Trace("Repository migrated [%d]: %s/%s", repo.ID, t.Owner.Name, repo.Name)
return nil
}
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):