From e177728a823ce5974a101994c3f687a579ed8ca4 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sat, 24 Oct 2020 01:02:36 -0400 Subject: [PATCH] Store task errors following migrations and display them (#13246) (#13287) * Store task errors following migrations and display them When migrate tasks fail store the error in the task table and ensure that they show on the status page. Fix #13242 Signed-off-by: Andrew Thornton * Update web_src/js/index.js * Hide the failed first Signed-off-by: Andrew Thornton Co-authored-by: techknowlogick Co-authored-by: zeripath --- models/task.go | 21 ++++++++++++++ modules/task/migrate.go | 39 +++++++++++++++----------- public/img/failed.png | Bin 0 -> 11009 bytes routers/repo/repo.go | 16 ----------- routers/routes/routes.go | 3 +- routers/user/task.go | 30 ++++++++++++++++++++ templates/repo/migrate/migrating.tmpl | 8 +++++- web_src/js/index.js | 19 +++++++++---- 8 files changed, 95 insertions(+), 41 deletions(-) create mode 100644 public/img/failed.png create mode 100644 routers/user/task.go diff --git a/models/task.go b/models/task.go index 43cb2d4d9a..b86314b449 100644 --- a/models/task.go +++ b/models/task.go @@ -147,6 +147,27 @@ func GetMigratingTask(repoID int64) (*Task, error) { return &task, nil } +// GetMigratingTaskByID returns the migrating task by repo's id +func GetMigratingTaskByID(id, doerID int64) (*Task, *migration.MigrateOptions, error) { + var task = Task{ + ID: id, + DoerID: doerID, + Type: structs.TaskTypeMigrateRepo, + } + has, err := x.Get(&task) + if err != nil { + return nil, nil, err + } else if !has { + return nil, nil, ErrTaskDoesNotExist{id, 0, task.Type} + } + + var opts migration.MigrateOptions + if err := json.Unmarshal([]byte(task.PayloadContent), &opts); err != nil { + return nil, nil, err + } + return &task, &opts, nil +} + // FindTaskOptions find all tasks type FindTaskOptions struct { Status int diff --git a/modules/task/migrate.go b/modules/task/migrate.go index d25decaa00..99f0435b28 100644 --- a/modules/task/migrate.go +++ b/modules/task/migrate.go @@ -20,7 +20,7 @@ import ( "code.gitea.io/gitea/modules/util" ) -func handleCreateError(owner *models.User, err error, name string) error { +func handleCreateError(owner *models.User, err error) error { switch { case models.IsErrReachLimitOfRepo(err): return fmt.Errorf("You have already reached your limit of %d repositories", owner.MaxCreationLimit()) @@ -38,8 +38,8 @@ func handleCreateError(owner *models.User, err error, name string) error { func runMigrateTask(t *models.Task) (err error) { defer func() { if e := recover(); e != nil { - err = fmt.Errorf("PANIC whilst trying to do migrate task: %v\nStacktrace: %v", err, log.Stack(2)) - log.Critical("PANIC during runMigrateTask[%d] by DoerID[%d] to RepoID[%d] for OwnerID[%d]: %v", t.ID, t.DoerID, t.RepoID, t.OwnerID, err) + err = fmt.Errorf("PANIC whilst trying to do migrate task: %v", e) + log.Critical("PANIC during runMigrateTask[%d] by DoerID[%d] to RepoID[%d] for OwnerID[%d]: %v\nStacktrace: %v", t.ID, t.DoerID, t.RepoID, t.OwnerID, e, log.Stack(2)) } if err == nil { @@ -55,7 +55,8 @@ func runMigrateTask(t *models.Task) (err error) { t.EndTime = timeutil.TimeStampNow() t.Status = structs.TaskStatusFailed t.Errors = err.Error() - if err := t.UpdateCols("status", "errors", "end_time"); err != nil { + t.RepoID = 0 + if err := t.UpdateCols("status", "errors", "repo_id", "end_time"); err != nil { log.Error("Task UpdateCols failed: %v", err) } @@ -66,8 +67,8 @@ func runMigrateTask(t *models.Task) (err error) { } }() - if err := t.LoadRepo(); err != nil { - return err + if err = t.LoadRepo(); err != nil { + return } // if repository is ready, then just finsih the task @@ -75,33 +76,35 @@ func runMigrateTask(t *models.Task) (err error) { return nil } - if err := t.LoadDoer(); err != nil { - return err + if err = t.LoadDoer(); err != nil { + return } - if err := t.LoadOwner(); err != nil { - return err + if err = t.LoadOwner(); err != nil { + return } t.StartTime = timeutil.TimeStampNow() t.Status = structs.TaskStatusRunning - if err := t.UpdateCols("start_time", "status"); err != nil { - return err + if err = t.UpdateCols("start_time", "status"); err != nil { + return } var opts *migration.MigrateOptions opts, err = t.MigrateConfig() if err != nil { - return err + return } opts.MigrateToRepoID = t.RepoID - repo, err := migrations.MigrateRepository(graceful.GetManager().HammerContext(), t.Doer, t.Owner.Name, *opts) + var repo *models.Repository + repo, err = migrations.MigrateRepository(graceful.GetManager().HammerContext(), t.Doer, t.Owner.Name, *opts) if err == nil { log.Trace("Repository migrated [%d]: %s/%s", repo.ID, t.Owner.Name, repo.Name) - return nil + return } if models.IsErrRepoAlreadyExist(err) { - return errors.New("The repository name is already used") + err = errors.New("The repository name is already used") + return } // remoteAddr may contain credentials, so we sanitize it @@ -113,5 +116,7 @@ func runMigrateTask(t *models.Task) (err error) { return fmt.Errorf("Migration failed: %v", err.Error()) } - return handleCreateError(t.Owner, err, "MigratePost") + // do not be tempted to coalesce this line with the return + err = handleCreateError(t.Owner, err) + return } diff --git a/public/img/failed.png b/public/img/failed.png new file mode 100644 index 0000000000000000000000000000000000000000..b37545f90ca3b304357516661efb9e1431fa96aa GIT binary patch literal 11009 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 literal 0 HcmV?d00001 diff --git a/routers/repo/repo.go b/routers/repo/repo.go index 742c952f6e..4220750328 100644 --- a/routers/repo/repo.go +++ b/routers/repo/repo.go @@ -402,19 +402,3 @@ func Download(ctx *context.Context) { ctx.ServeFile(archivePath, ctx.Repo.Repository.Name+"-"+refName+ext) } - -// Status returns repository's status -func Status(ctx *context.Context) { - task, err := models.GetMigratingTask(ctx.Repo.Repository.ID) - if err != nil { - ctx.JSON(500, map[string]interface{}{ - "err": err, - }) - return - } - - ctx.JSON(200, map[string]interface{}{ - "status": ctx.Repo.Repository.Status, - "err": task.Errors, - }) -} diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 135c6b56a8..586474a661 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -479,6 +479,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/forgot_password", user.ForgotPasswd) m.Post("/forgot_password", user.ForgotPasswdPost) m.Post("/logout", user.SignOut) + m.Get("/task/:task", user.TaskStatus) }) // ***** END: User ***** @@ -986,8 +987,6 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/archive/*", repo.MustBeNotEmpty, reqRepoCodeReader, repo.Download) - m.Get("/status", reqRepoCodeReader, repo.Status) - m.Group("/branches", func() { m.Get("", repo.Branches) }, repo.MustBeNotEmpty, context.RepoRef(), reqRepoCodeReader) diff --git a/routers/user/task.go b/routers/user/task.go new file mode 100644 index 0000000000..a88257ee50 --- /dev/null +++ b/routers/user/task.go @@ -0,0 +1,30 @@ +// Copyright 2020 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package user + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/context" +) + +// TaskStatus returns task's status +func TaskStatus(ctx *context.Context) { + task, opts, err := models.GetMigratingTaskByID(ctx.ParamsInt64("task"), ctx.User.ID) + if err != nil { + ctx.JSON(500, map[string]interface{}{ + "err": err, + }) + return + } + + ctx.JSON(200, map[string]interface{}{ + "status": task.Status, + "err": task.Errors, + "repo-id": task.RepoID, + "repo-name": opts.RepoName, + "start": task.StartTime, + "end": task.EndTime, + }) +} diff --git a/templates/repo/migrate/migrating.tmpl b/templates/repo/migrate/migrating.tmpl index 0057325e91..fdda33a2c7 100644 --- a/templates/repo/migrate/migrating.tmpl +++ b/templates/repo/migrate/migrating.tmpl @@ -7,11 +7,16 @@ {{template "base/alert" .}}
-
+
+
@@ -20,6 +25,7 @@

{{.i18n.Tr "repo.migrate.migrating_failed" .CloneAddr | Safe}}

+

diff --git a/web_src/js/index.js b/web_src/js/index.js index 9fafe62d3e..94238ca3d9 100644 --- a/web_src/js/index.js +++ b/web_src/js/index.js @@ -191,25 +191,32 @@ function updateIssuesMeta(url, action, issueIds, elementId) { function initRepoStatusChecker() { const migrating = $('#repo_migrating'); $('#repo_migrating_failed').hide(); + $('#repo_migrating_failed_image').hide(); if (migrating) { - const repo_name = migrating.attr('repo'); - if (typeof repo_name === 'undefined') { + const task = migrating.attr('task'); + if (typeof task === 'undefined') { return; } $.ajax({ type: 'GET', - url: `${AppSubUrl}/${repo_name}/status`, + url: `${AppSubUrl}/user/task/${task}`, data: { _csrf: csrf, }, complete(xhr) { if (xhr.status === 200) { if (xhr.responseJSON) { - if (xhr.responseJSON.status === 0) { + if (xhr.responseJSON.status === 4) { window.location.reload(); return; + } else if (xhr.responseJSON.status === 3) { + $('#repo_migrating_progress').hide(); + $('#repo_migrating').hide(); + $('#repo_migrating_failed').show(); + $('#repo_migrating_failed_image').show(); + $('#repo_migrating_failed_error').text(xhr.responseJSON.err); + return; } - setTimeout(() => { initRepoStatusChecker(); }, 2000); @@ -217,7 +224,9 @@ function initRepoStatusChecker() { } } $('#repo_migrating_progress').hide(); + $('#repo_migrating').hide(); $('#repo_migrating_failed').show(); + $('#repo_migrating_failed_image').show(); } }); }