]> source.dussan.org Git - gitea.git/commitdiff
Add `Retry` button when creating a mirror-repo fails (#26228)
authorKerwin Bryant <kerwin612@qq.com>
Fri, 4 Aug 2023 02:21:32 +0000 (10:21 +0800)
committerGitHub <noreply@github.com>
Fri, 4 Aug 2023 02:21:32 +0000 (10:21 +0800)
fixed #26156
* Added a retry button in the frontend (only displayed when the status
is abnormal)
* After clicking Retry, the backend adds the task back to the task queue

![7UJDNM671RI})EA8~~XPL39](https://github.com/go-gitea/gitea/assets/3371163/e088fd63-5dcc-4bc6-8849-7db3086511b7)

![T83F1WL9)VGHR@MB956$VT9](https://github.com/go-gitea/gitea/assets/3371163/744425bb-dde1-4315-be2e-5c99ac3a44d4)

---------

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
options/locale/locale_en-US.ini
routers/web/repo/migrate.go
routers/web/web.go
services/task/task.go
templates/repo/migrate/migrating.tmpl
web_src/js/features/repo-migrate.js

index 24087cdd1bfa7589a54b5d1560b2c5b22856429d..b2eeab617e48a832c90b15b4951db4555d1a0061 100644 (file)
@@ -80,6 +80,7 @@ milestones = Milestones
 
 ok = OK
 cancel = Cancel
+retry = Retry
 rerun = Re-run
 rerun_all = Re-run all jobs
 save = Save
index b918650d1dd42edd7a312b7739641c8388f9ce80..a6125a1a5811ca51b08a8b56646d8a9b3de289f3 100644 (file)
@@ -259,6 +259,15 @@ func setMigrationContextData(ctx *context.Context, serviceType structs.GitServic
        ctx.Data["service"] = serviceType
 }
 
+func MigrateRetryPost(ctx *context.Context) {
+       if err := task.RetryMigrateTask(ctx.Repo.Repository.ID); err != nil {
+               log.Error("Retry task failed: %v", err)
+               ctx.ServerError("task.RetryMigrateTask", err)
+               return
+       }
+       ctx.JSONOK()
+}
+
 func MigrateCancelPost(ctx *context.Context) {
        migratingTask, err := admin_model.GetMigratingTask(ctx.Repo.Repository.ID)
        if err != nil {
index ca75bd5967271c6b4371107c3d3a8b0ebdc66a19..aa3d830f94118a445d9ff6cd84b14f7f2f82d18f 100644 (file)
@@ -953,7 +953,11 @@ func registerRoutes(m *web.Route) {
                                addSettingsSecretsRoutes()
                                addSettingVariablesRoutes()
                        }, actions.MustEnableActions)
-                       m.Post("/migrate/cancel", repo.MigrateCancelPost) // this handler must be under "settings", otherwise this incomplete repo can't be accessed
+                       // the follow handler must be under "settings", otherwise this incomplete repo can't be accessed
+                       m.Group("/migrate", func() {
+                               m.Post("/retry", repo.MigrateRetryPost)
+                               m.Post("/cancel", repo.MigrateCancelPost)
+                       })
                }, ctxDataSet("PageIsRepoSettings", true, "LFSStartServer", setting.LFS.StartServer))
        }, reqSignIn, context.RepoAssignment, context.UnitTypes(), reqRepoAdmin, context.RepoRef())
 
index 11a47a68bba074d3409d7b569229051250fa820f..db5c1dd3f850e775ece4ff5bce8a9034f5abc82d 100644 (file)
@@ -126,3 +126,27 @@ func CreateMigrateTask(doer, u *user_model.User, opts base.MigrateOptions) (*adm
 
        return task, nil
 }
+
+// RetryMigrateTask retry a migrate task
+func RetryMigrateTask(repoID int64) error {
+       migratingTask, err := admin_model.GetMigratingTask(repoID)
+       if err != nil {
+               log.Error("GetMigratingTask: %v", err)
+               return err
+       }
+       if migratingTask.Status == structs.TaskStatusQueued || migratingTask.Status == structs.TaskStatusRunning {
+               return nil
+       }
+
+       // TODO Need to removing the storage/database garbage brought by the failed task
+
+       // Reset task status and messages
+       migratingTask.Status = structs.TaskStatusQueued
+       migratingTask.Message = ""
+       if err = migratingTask.UpdateCols("status", "message"); err != nil {
+               log.Error("task.UpdateCols failed: %v", err)
+               return err
+       }
+
+       return taskQueue.Push(migratingTask)
+}
index 50bff0a937be4f092611d640be32a90c34e991e5..d1bdc5a90fb10521d0f3fc528bee1ace3d6402d4 100644 (file)
                                                                <div class="divider"></div>
                                                                <div class="item">
                                                                        {{if .Failed}}
-                                                                       <button class="ui basic red show-modal button" data-modal="#delete-repo-modal">{{.locale.Tr "repo.settings.delete"}}</button>
+                                                                               <button class="ui basic red show-modal button" data-modal="#delete-repo-modal">{{.locale.Tr "repo.settings.delete"}}</button>
                                                                        {{else}}
-                                                                       <button class="ui basic red show-modal button" data-modal="#cancel-repo-modal">{{.locale.Tr "cancel"}}</button>
+                                                                               <button class="ui basic red show-modal button" data-modal="#cancel-repo-modal">{{.locale.Tr "cancel"}}</button>
                                                                        {{end}}
+                                                                       <button id="repo_migrating_retry" data-migrating-task-retry-url="{{.Link}}/settings/migrate/retry" class="ui basic button gt-hidden">{{.locale.Tr "retry"}}</button>
                                                                </div>
                                                        {{end}}
                                                </div>
index e57348d31b4d9d340a2ce0a30b8cf3e1f7b2a289..de9f7b023c1aab69a2668a395fff8d3b4aad0873 100644 (file)
@@ -1,12 +1,14 @@
 import $ from 'jquery';
 import {hideElem, showElem} from '../utils/dom.js';
 
-const {appSubUrl} = window.config;
+const {appSubUrl, csrfToken} = window.config;
 
 export function initRepoMigrationStatusChecker() {
   const $repoMigrating = $('#repo_migrating');
   if (!$repoMigrating.length) return;
 
+  $('#repo_migrating_retry').on('click', doMigrationRetry);
+
   const task = $repoMigrating.attr('data-migrating-task-id');
 
   // returns true if the refresh still need to be called after a while
@@ -31,6 +33,7 @@ export function initRepoMigrationStatusChecker() {
     if (data.status === 3) {
       hideElem('#repo_migrating_progress');
       hideElem('#repo_migrating');
+      showElem('#repo_migrating_retry');
       showElem('#repo_migrating_failed');
       showElem('#repo_migrating_failed_image');
       $('#repo_migrating_failed_error').text(data.message);
@@ -53,3 +56,14 @@ export function initRepoMigrationStatusChecker() {
 
   syncTaskStatus(); // no await
 }
+
+async function doMigrationRetry(e) {
+  await fetch($(e.target).attr('data-migrating-task-retry-url'), {
+    method: 'post',
+    headers: {
+      'X-Csrf-Token': csrfToken,
+      'Content-Type': 'application/json',
+    },
+  });
+  window.location.reload();
+}