Skip to content

Commit f818f9c

Browse files
lunny6543
authored andcommitted
Fix bug when migrate from API (go-gitea#8631)
* fix bug when migrate from API * fix test * fix test * improve * fix error message
1 parent b4b8c96 commit f818f9c

File tree

4 files changed

+48
-10
lines changed

4 files changed

+48
-10
lines changed

integrations/api_repo_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ func testAPIRepoMigrateConflict(t *testing.T, u *url.URL) {
334334
resp := httpContext.Session.MakeRequest(t, req, http.StatusConflict)
335335
respJSON := map[string]string{}
336336
DecodeJSON(t, resp, &respJSON)
337-
assert.Equal(t, respJSON["message"], "The repository with the same name already exists.")
337+
assert.Equal(t, "The repository with the same name already exists.", respJSON["message"])
338338
})
339339
}
340340

models/repo.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2811,3 +2811,25 @@ func (repo *Repository) GetOriginalURLHostname() string {
28112811

28122812
return u.Host
28132813
}
2814+
2815+
// GetTreePathLock returns LSF lock for the treePath
2816+
func (repo *Repository) GetTreePathLock(treePath string) (*LFSLock, error) {
2817+
if setting.LFS.StartServer {
2818+
locks, err := GetLFSLockByRepoID(repo.ID)
2819+
if err != nil {
2820+
return nil, err
2821+
}
2822+
for _, lock := range locks {
2823+
if lock.Path == treePath {
2824+
return lock, nil
2825+
}
2826+
}
2827+
}
2828+
return nil, nil
2829+
}
2830+
2831+
// UpdateRepositoryCols updates repository's columns
2832+
func UpdateRepositoryCols(repo *Repository, cols ...string) error {
2833+
_, err := x.ID(repo.ID).Cols(cols...).Update(repo)
2834+
return err
2835+
}

modules/task/migrate.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,6 @@ func runMigrateTask(t *models.Task) (err error) {
9797
opts.MigrateToRepoID = t.RepoID
9898
repo, err := migrations.MigrateRepository(t.Doer, t.Owner.Name, *opts)
9999
if err == nil {
100-
notification.NotifyMigrateRepository(t.Doer, t.Owner, repo)
101-
102100
log.Trace("Repository migrated [%d]: %s/%s", repo.ID, t.Owner.Name, repo.Name)
103101
return nil
104102
}

routers/api/v1/repo/repo.go

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -433,17 +433,32 @@ func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) {
433433
opts.Releases = false
434434
}
435435

436-
var repo *models.Repository
436+
repo, err := models.CreateRepository(ctx.User, ctxUser, models.CreateRepoOptions{
437+
Name: opts.RepoName,
438+
Description: opts.Description,
439+
OriginalURL: opts.CloneAddr,
440+
IsPrivate: opts.Private,
441+
IsMirror: opts.Mirror,
442+
Status: models.RepositoryBeingMigrated,
443+
})
444+
if err != nil {
445+
handleMigrateError(ctx, ctxUser, remoteAddr, err)
446+
return
447+
}
448+
449+
opts.MigrateToRepoID = repo.ID
450+
437451
defer func() {
438452
if e := recover(); e != nil {
439453
var buf bytes.Buffer
440454
fmt.Fprintf(&buf, "Handler crashed with error: %v", log.Stack(2))
455+
441456
err = errors.New(buf.String())
442457
}
443458

444459
if err == nil {
445460
repo.Status = models.RepositoryReady
446-
if err := models.UpdateRepositoryStatus(repo.ID, repo.Status); err == nil {
461+
if err := models.UpdateRepositoryCols(repo, "status"); err == nil {
447462
notification.NotifyMigrateRepository(ctx.User, ctxUser, repo)
448463
return
449464
}
@@ -456,13 +471,16 @@ func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) {
456471
}
457472
}()
458473

459-
repo, err = migrations.MigrateRepository(ctx.User, ctxUser.Name, opts)
460-
if err == nil {
461-
log.Trace("Repository migrated: %s/%s", ctxUser.Name, form.RepoName)
462-
ctx.JSON(201, repo.APIFormat(models.AccessModeAdmin))
474+
if _, err = migrations.MigrateRepository(ctx.User, ctxUser.Name, opts); err != nil {
475+
handleMigrateError(ctx, ctxUser, remoteAddr, err)
463476
return
464477
}
465478

479+
log.Trace("Repository migrated: %s/%s", ctxUser.Name, form.RepoName)
480+
ctx.JSON(201, repo.APIFormat(models.AccessModeAdmin))
481+
}
482+
483+
func handleMigrateError(ctx *context.APIContext, repoOwner *models.User, remoteAddr string, err error) {
466484
switch {
467485
case models.IsErrRepoAlreadyExist(err):
468486
ctx.Error(409, "", "The repository with the same name already exists.")
@@ -471,7 +489,7 @@ func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) {
471489
case migrations.IsTwoFactorAuthError(err):
472490
ctx.Error(422, "", "Remote visit required two factors authentication.")
473491
case models.IsErrReachLimitOfRepo(err):
474-
ctx.Error(422, "", fmt.Sprintf("You have already reached your limit of %d repositories.", ctxUser.MaxCreationLimit()))
492+
ctx.Error(422, "", fmt.Sprintf("You have already reached your limit of %d repositories.", repoOwner.MaxCreationLimit()))
475493
case models.IsErrNameReserved(err):
476494
ctx.Error(422, "", fmt.Sprintf("The username '%s' is reserved.", err.(models.ErrNameReserved).Name))
477495
case models.IsErrNamePatternNotAllowed(err):

0 commit comments

Comments
 (0)