0
0
mirror of https://github.com/go-gitea/gitea.git synced 2026-02-17 03:31:39 +01:00

Add migrations rather than doctor command

This commit is contained in:
Lunny Xiao 2026-01-16 09:36:06 -08:00
parent 1ed0538e76
commit 5db9f4fa92
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
4 changed files with 55 additions and 66 deletions

View File

@ -399,6 +399,7 @@ func prepareMigrationTasks() []*migration {
newMigration(323, "Add support for actions concurrency", v1_26.AddActionsConcurrency),
newMigration(324, "Fix closed milestone completeness for milestones with no issues", v1_26.FixClosedMilestoneCompleteness),
newMigration(325, "Fix missed repo_id when migrate attachments", v1_26.FixMissedRepoIDWhenMigrateAttachments),
}
return preparedMigrations
}

View File

@ -0,0 +1,18 @@
// Copyright 2025 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package v1_26
import (
"xorm.io/xorm"
)
func FixMissedRepoIDWhenMigrateAttachments(x *xorm.Engine) error {
_, err := x.Exec("UPDATE `attachment` SET `repo_id` = (SELECT `repo_id` FROM `issue` WHERE `issue`.`id` = `attachment`.`issue_id`) WHERE `issue_id` > 0 AND (`repo_id` IS NULL OR `repo_id` = 0);")
if err != nil {
return err
}
_, err = x.Exec("UPDATE `attachment` SET `repo_id` = (SELECT `repo_id` FROM `release` WHERE `release`.`id` = `attachment`.`release_id`) WHERE `release_id` > 0 AND (`repo_id` IS NULL OR `repo_id` = 0);")
return err
}

View File

@ -0,0 +1,36 @@
// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package v1_26
import (
"testing"
"code.gitea.io/gitea/models/migrations/base"
"code.gitea.io/gitea/modules/timeutil"
"github.com/stretchr/testify/require"
)
func Test_FixMissedRepoIDWhenMigrateAttachments(t *testing.T) {
type Attachment struct {
ID int64 `xorm:"pk autoincr"`
UUID string `xorm:"uuid UNIQUE"`
RepoID int64 `xorm:"INDEX"` // this should not be zero
IssueID int64 `xorm:"INDEX"` // maybe zero when creating
ReleaseID int64 `xorm:"INDEX"` // maybe zero when creating
UploaderID int64 `xorm:"INDEX DEFAULT 0"` // Notice: will be zero before this column added
CommentID int64 `xorm:"INDEX"`
Name string
DownloadCount int64 `xorm:"DEFAULT 0"`
Size int64 `xorm:"DEFAULT 0"`
CreatedUnix timeutil.TimeStamp `xorm:"created"`
CustomDownloadURL string `xorm:"-"`
}
// Prepare and load the testing database
x, deferrable := base.PrepareTestEnv(t, 0, new(Attachment))
defer deferrable()
require.NoError(t, FixMissedRepoIDWhenMigrateAttachments(x))
}

View File

@ -1,66 +0,0 @@
// Copyright 2022 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package doctor
import (
"context"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/log"
)
func init() {
Register(&Check{
Title: "Fix attachment which have issue_id or release_id lost repo_id",
Name: "fix-attachment-repo-id",
IsDefault: false,
Run: fixAttachmentRepoIDCheck,
AbortIfFailed: false,
SkipDatabaseInitialization: false,
Priority: 1,
})
}
func fixAttachmentRepoIDCheck(ctx context.Context, logger log.Logger, autofix bool) error {
countIssue, err := db.GetEngine(ctx).
Where("`issue_id` > 0 AND (`repo_id` IS NULL OR `repo_id` = 0)").
Table("attachment").Cols("id").Count()
if err != nil {
return err
}
countRelease, err := db.GetEngine(ctx).
Where("`release_id` > 0 AND (`repo_id` IS NULL OR `repo_id` = 0)").
Table("attachment").Cols("id").Count()
if err != nil {
return err
}
count := countIssue + countRelease
if count == 0 {
logger.Info("No attachment repo_id issues found.")
return nil
}
logger.Warn("Found %d(issue), %d(release) attachments with missing repo_id.", countIssue, countRelease)
if !autofix {
return nil
}
updatedIssue, err := db.GetEngine(ctx).Exec("UPDATE `attachment` SET `repo_id` = (SELECT `repo_id` FROM `issue` WHERE `issue`.`id` = `attachment`.`issue_id`) WHERE `issue_id` > 0 AND (`repo_id` IS NULL OR `repo_id` = 0);")
if err != nil {
return err
}
cntIssue, _ := updatedIssue.RowsAffected()
updatedRelease, err := db.GetEngine(ctx).Exec("UPDATE `attachment` SET `repo_id` = (SELECT `repo_id` FROM `release` WHERE `release`.`id` = `attachment`.`release_id`) WHERE `release_id` > 0 AND (`repo_id` IS NULL OR `repo_id` = 0);")
if err != nil {
return err
}
cntRelease, _ := updatedRelease.RowsAffected()
logger.Info("Fixed attachment repo_id issues %d and release %d successfully.", cntIssue, cntRelease)
return nil
}