From 3114cd30b817692556306ce6261ace2b58c54b76 Mon Sep 17 00:00:00 2001
From: Gusted <williamzijl7@hotmail.com>
Date: Wed, 4 May 2022 10:09:42 +0000
Subject: [PATCH] Only check for non-finished migrating task (#19601)

* Only check for non-finished migrating task

- Only check if a non-finished migrating task exists for a mirror before
fetching the mirror details from the database.
- Resolves #19600
- Regression: #19588

* Clarify function
---
 models/task.go          | 12 ++++++------
 modules/context/repo.go | 10 +++++-----
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/models/task.go b/models/task.go
index 0720d28610..5528573ca5 100644
--- a/models/task.go
+++ b/models/task.go
@@ -181,12 +181,12 @@ func GetMigratingTask(repoID int64) (*Task, error) {
 	return &task, nil
 }
 
-// HasMigratingTask returns if migrating task exist for repo.
-func HasMigratingTask(repoID int64) (bool, error) {
-	return db.GetEngine(db.DefaultContext).Exist(&Task{
-		RepoID: repoID,
-		Type:   structs.TaskTypeMigrateRepo,
-	})
+// HasFinishedMigratingTask returns if a finished migration task exists for the repo.
+func HasFinishedMigratingTask(repoID int64) (bool, error) {
+	return db.GetEngine(db.DefaultContext).
+		Where("repo_id=? AND type=? AND status=?", repoID, structs.TaskTypeMigrateRepo, structs.TaskStatusFinished).
+		Table("task").
+		Exist()
 }
 
 // GetMigratingTaskByID returns the migrating task by repo's id
diff --git a/modules/context/repo.go b/modules/context/repo.go
index c5e3a69e5c..4a1e9aa9e8 100644
--- a/modules/context/repo.go
+++ b/modules/context/repo.go
@@ -371,14 +371,14 @@ func repoAssignment(ctx *Context, repo *repo_model.Repository) {
 
 	if repo.IsMirror {
 
-		// Check if there's a migrating task.
-		// If it does exist, don't fetch the Mirror from the database as it doesn't exist yet.
-		hasTask, err := models.HasMigratingTask(repo.ID)
+		// Check if the mirror has finsihed migrationg, only then we can
+		// lookup the mirror informtation the database.
+		finishedMigrating, err := models.HasFinishedMigratingTask(repo.ID)
 		if err != nil {
-			ctx.ServerError("GetMirrorByRepoID", err)
+			ctx.ServerError("HasFinishedMigratingTask", err)
 			return
 		}
-		if !hasTask {
+		if finishedMigrating {
 			ctx.Repo.Mirror, err = repo_model.GetMirrorByRepoID(repo.ID)
 			if err != nil {
 				ctx.ServerError("GetMirrorByRepoID", err)