From 275aec0c0e8403ce1d94ba3e530b7beb428e8252 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 15 Jan 2026 22:04:45 -0800 Subject: [PATCH 1/7] Fix missing repository id when migrating release attachments --- services/migrations/gitea_uploader.go | 1 + 1 file changed, 1 insertion(+) diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go index 4b50e86b12..74b01012bc 100644 --- a/services/migrations/gitea_uploader.go +++ b/services/migrations/gitea_uploader.go @@ -318,6 +318,7 @@ func (g *GiteaLocalUploader) CreateReleases(ctx context.Context, releases ...*ba } attach := repo_model.Attachment{ UUID: uuid.New().String(), + RepoID: g.repo.ID, Name: asset.Name, DownloadCount: int64(*asset.DownloadCount), Size: int64(*asset.Size), From 1ed0538e765b644456eea94c12b9f4f481328357 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 15 Jan 2026 22:29:18 -0800 Subject: [PATCH 2/7] Add a new doctor to help fix dirty data --- services/doctor/attachment.go | 66 +++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 services/doctor/attachment.go diff --git a/services/doctor/attachment.go b/services/doctor/attachment.go new file mode 100644 index 0000000000..0a20d9750e --- /dev/null +++ b/services/doctor/attachment.go @@ -0,0 +1,66 @@ +// 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 +} From 5db9f4fa9275c56d9581398021e5cea631c2e4c8 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 16 Jan 2026 09:36:06 -0800 Subject: [PATCH 3/7] Add migrations rather than doctor command --- models/migrations/migrations.go | 1 + models/migrations/v1_26/v325.go | 18 ++++++++ models/migrations/v1_26/v325_test.go | 36 +++++++++++++++ services/doctor/attachment.go | 66 ---------------------------- 4 files changed, 55 insertions(+), 66 deletions(-) create mode 100644 models/migrations/v1_26/v325.go create mode 100644 models/migrations/v1_26/v325_test.go delete mode 100644 services/doctor/attachment.go diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index fa11acaee2..9975729fd6 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -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 } diff --git a/models/migrations/v1_26/v325.go b/models/migrations/v1_26/v325.go new file mode 100644 index 0000000000..30c9c2d1b1 --- /dev/null +++ b/models/migrations/v1_26/v325.go @@ -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 +} diff --git a/models/migrations/v1_26/v325_test.go b/models/migrations/v1_26/v325_test.go new file mode 100644 index 0000000000..4a9105ea87 --- /dev/null +++ b/models/migrations/v1_26/v325_test.go @@ -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)) +} diff --git a/services/doctor/attachment.go b/services/doctor/attachment.go deleted file mode 100644 index 0a20d9750e..0000000000 --- a/services/doctor/attachment.go +++ /dev/null @@ -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 -} From 71e94f59e5ce07906fa78517f4078af86825da47 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 16 Jan 2026 11:29:58 -0800 Subject: [PATCH 4/7] Fix test --- models/migrations/v1_26/v325_test.go | 35 +++++++++++++++++----------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/models/migrations/v1_26/v325_test.go b/models/migrations/v1_26/v325_test.go index 4a9105ea87..d4a66fee81 100644 --- a/models/migrations/v1_26/v325_test.go +++ b/models/migrations/v1_26/v325_test.go @@ -14,22 +14,31 @@ import ( 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:"-"` + 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"` + } + + type Issue struct { + ID int64 `xorm:"pk autoincr"` + RepoID int64 `xorm:"INDEX"` + } + + type Release struct { + ID int64 `xorm:"pk autoincr"` + RepoID int64 `xorm:"INDEX"` } // Prepare and load the testing database - x, deferrable := base.PrepareTestEnv(t, 0, new(Attachment)) + x, deferrable := base.PrepareTestEnv(t, 0, new(Attachment), new(Issue), new(Release)) defer deferrable() require.NoError(t, FixMissedRepoIDWhenMigrateAttachments(x)) From 1e57029ad5e504a4e2a8891fc45ecaf0ba0f4620 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 16 Jan 2026 11:59:39 -0800 Subject: [PATCH 5/7] Follow @wxiaoguang's suggestion --- models/repo/release.go | 11 +++++++++++ models/repo/release_test.go | 39 +++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/models/repo/release.go b/models/repo/release.go index 68fb6b1724..bc136c6a84 100644 --- a/models/repo/release.go +++ b/models/repo/release.go @@ -93,6 +93,10 @@ func init() { db.RegisterModel(new(Release)) } +// legacyAttachmentMissingRepoIDCutoff marks the date when repo_id started to be written during uploads +// (2026-01-16T00:00:00Z). Older rows might have repo_id=0 and should be tolerated once. +const legacyAttachmentMissingRepoIDCutoff timeutil.TimeStamp = 1768521600 + func (r *Release) LoadRepo(ctx context.Context) (err error) { if r.Repo != nil { return nil @@ -186,6 +190,13 @@ func AddReleaseAttachments(ctx context.Context, releaseID int64, attachmentUUIDs } for i := range attachments { + if attachments[i].RepoID == 0 && attachments[i].CreatedUnix < legacyAttachmentMissingRepoIDCutoff { + attachments[i].RepoID = rel.RepoID + if _, err = db.GetEngine(ctx).ID(attachments[i].ID).Cols("repo_id").Update(attachments[i]); err != nil { + return fmt.Errorf("update attachment repo_id [%d]: %w", attachments[i].ID, err) + } + } + if attachments[i].RepoID != rel.RepoID { return util.NewPermissionDeniedErrorf("attachment belongs to different repository") } diff --git a/models/repo/release_test.go b/models/repo/release_test.go index 8e30e76f49..abf50b1edb 100644 --- a/models/repo/release_test.go +++ b/models/repo/release_test.go @@ -6,6 +6,7 @@ package repo import ( "testing" + "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/modules/util" @@ -51,3 +52,41 @@ func TestAddReleaseAttachmentsRejectsDifferentRepo(t *testing.T) { assert.NoError(t, err) assert.Zero(t, attach.ReleaseID, "attachment should not be linked to release on failure") } + +func TestAddReleaseAttachmentsAllowsLegacyMissingRepoID(t *testing.T) { + assert.NoError(t, unittest.PrepareTestDatabase()) + + legacyUUID := "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a20" // attachment 10 has repo_id 0 + err := AddReleaseAttachments(t.Context(), 1, []string{legacyUUID}) + assert.NoError(t, err) + + attach, err := GetAttachmentByUUID(t.Context(), legacyUUID) + assert.NoError(t, err) + assert.EqualValues(t, 1, attach.RepoID) + assert.EqualValues(t, 1, attach.ReleaseID) +} + +func TestAddReleaseAttachmentsRejectsRecentZeroRepoID(t *testing.T) { + assert.NoError(t, unittest.PrepareTestDatabase()) + + recentUUID := "a0eebc99-9c0b-4ef8-bb6d-6bb9bd3800aa" + attachment := &Attachment{ + UUID: recentUUID, + RepoID: 0, + IssueID: 0, + ReleaseID: 0, + CommentID: 0, + Name: "recent-zero", + CreatedUnix: legacyAttachmentMissingRepoIDCutoff + 1, + } + assert.NoError(t, db.Insert(t.Context(), attachment)) + + err := AddReleaseAttachments(t.Context(), 1, []string{recentUUID}) + assert.Error(t, err) + assert.ErrorIs(t, err, util.ErrPermissionDenied) + + attach, err := GetAttachmentByUUID(t.Context(), recentUUID) + assert.NoError(t, err) + assert.Zero(t, attach.ReleaseID) + assert.Zero(t, attach.RepoID) +} From 712df9454f3b700fa33e22f5e5aaf8ee870ab5ab Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 16 Jan 2026 23:03:37 -0800 Subject: [PATCH 6/7] Only check repository id after commit merged --- models/repo/release.go | 6 +++--- models/repo/release_test.go | 2 +- routers/web/repo/attachment.go | 9 +++++---- services/repository/repository.go | 17 ++++++++++------- services/repository/repository_test.go | 14 ++++++++------ 5 files changed, 27 insertions(+), 21 deletions(-) diff --git a/models/repo/release.go b/models/repo/release.go index bc136c6a84..e2010c8a38 100644 --- a/models/repo/release.go +++ b/models/repo/release.go @@ -93,9 +93,9 @@ func init() { db.RegisterModel(new(Release)) } -// legacyAttachmentMissingRepoIDCutoff marks the date when repo_id started to be written during uploads +// LegacyAttachmentMissingRepoIDCutoff marks the date when repo_id started to be written during uploads // (2026-01-16T00:00:00Z). Older rows might have repo_id=0 and should be tolerated once. -const legacyAttachmentMissingRepoIDCutoff timeutil.TimeStamp = 1768521600 +const LegacyAttachmentMissingRepoIDCutoff timeutil.TimeStamp = 1768521600 func (r *Release) LoadRepo(ctx context.Context) (err error) { if r.Repo != nil { @@ -190,7 +190,7 @@ func AddReleaseAttachments(ctx context.Context, releaseID int64, attachmentUUIDs } for i := range attachments { - if attachments[i].RepoID == 0 && attachments[i].CreatedUnix < legacyAttachmentMissingRepoIDCutoff { + if attachments[i].RepoID == 0 && attachments[i].CreatedUnix < LegacyAttachmentMissingRepoIDCutoff { attachments[i].RepoID = rel.RepoID if _, err = db.GetEngine(ctx).ID(attachments[i].ID).Cols("repo_id").Update(attachments[i]); err != nil { return fmt.Errorf("update attachment repo_id [%d]: %w", attachments[i].ID, err) diff --git a/models/repo/release_test.go b/models/repo/release_test.go index abf50b1edb..2a09ffb36d 100644 --- a/models/repo/release_test.go +++ b/models/repo/release_test.go @@ -77,7 +77,7 @@ func TestAddReleaseAttachmentsRejectsRecentZeroRepoID(t *testing.T) { ReleaseID: 0, CommentID: 0, Name: "recent-zero", - CreatedUnix: legacyAttachmentMissingRepoIDCutoff + 1, + CreatedUnix: LegacyAttachmentMissingRepoIDCutoff + 1, } assert.NoError(t, db.Insert(t.Context(), attachment)) diff --git a/routers/web/repo/attachment.go b/routers/web/repo/attachment.go index c8501792ce..ae52eb2ffa 100644 --- a/routers/web/repo/attachment.go +++ b/routers/web/repo/attachment.go @@ -133,14 +133,15 @@ func ServeAttachment(ctx *context.Context, uuid string) { } // prevent visiting attachment from other repository directly - if ctx.Repo.Repository != nil && ctx.Repo.Repository.ID != attach.RepoID { + // The check will be ignored before this code merged. + if attach.CreatedUnix > repo_model.LegacyAttachmentMissingRepoIDCutoff && ctx.Repo.Repository != nil && ctx.Repo.Repository.ID != attach.RepoID { ctx.HTTPError(http.StatusNotFound) return } - unitType, err := repo_service.GetAttachmentLinkedType(ctx, attach) + unitType, repoID, err := repo_service.GetAttachmentLinkedTypeAndRepoID(ctx, attach) if err != nil { - ctx.ServerError("GetAttachmentLinkedType", err) + ctx.ServerError("GetAttachmentLinkedTypeAndRepoID", err) return } @@ -152,7 +153,7 @@ func ServeAttachment(ctx *context.Context, uuid string) { } else { // If we have the linked type, we need to check access var perm access_model.Permission if ctx.Repo.Repository == nil { - repo, err := repo_model.GetRepositoryByID(ctx, attach.RepoID) + repo, err := repo_model.GetRepositoryByID(ctx, repoID) if err != nil { ctx.ServerError("GetRepositoryByID", err) return diff --git a/services/repository/repository.go b/services/repository/repository.go index 318ab423e5..ae64f0116a 100644 --- a/services/repository/repository.go +++ b/services/repository/repository.go @@ -221,25 +221,28 @@ func MakeRepoPrivate(ctx context.Context, repo *repo_model.Repository) (err erro }) } -// GetAttachmentLinkedType returns the linked type of attachment if any -func GetAttachmentLinkedType(ctx context.Context, a *repo_model.Attachment) (unit.Type, error) { +// GetAttachmentLinkedTypeAndRepoID returns the linked type and repository id of attachment if any +func GetAttachmentLinkedTypeAndRepoID(ctx context.Context, a *repo_model.Attachment) (unit.Type, int64, error) { if a.IssueID != 0 { iss, err := issues_model.GetIssueByID(ctx, a.IssueID) if err != nil { - return unit.TypeIssues, err + return unit.TypeIssues, 0, err } unitType := unit.TypeIssues if iss.IsPull { unitType = unit.TypePullRequests } - return unitType, nil + return unitType, iss.RepoID, nil } if a.ReleaseID != 0 { - _, err := repo_model.GetReleaseByID(ctx, a.ReleaseID) - return unit.TypeReleases, err + rel, err := repo_model.GetReleaseByID(ctx, a.ReleaseID) + if err != nil { + return unit.TypeReleases, 0, err + } + return unit.TypeReleases, rel.RepoID, nil } - return unit.TypeInvalid, nil + return unit.TypeInvalid, 0, nil } // CheckDaemonExportOK creates/removes git-daemon-export-ok for git-daemon... diff --git a/services/repository/repository_test.go b/services/repository/repository_test.go index b3447ae166..395138b5e4 100644 --- a/services/repository/repository_test.go +++ b/services/repository/repository_test.go @@ -16,25 +16,27 @@ import ( "github.com/stretchr/testify/require" ) -func TestAttachLinkedType(t *testing.T) { +func TestAttachLinkedTypeAndRepoID(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) testCases := []struct { name string attachID int64 expectedUnitType unit.Type + expectedRepoID uint64 }{ - {"LinkedIssue", 1, unit.TypeIssues}, - {"LinkedComment", 3, unit.TypePullRequests}, - {"LinkedRelease", 9, unit.TypeReleases}, - {"Notlinked", 10, unit.TypeInvalid}, + {"LinkedIssue", 1, unit.TypeIssues, 1}, + {"LinkedComment", 3, unit.TypePullRequests, 1}, + {"LinkedRelease", 9, unit.TypeReleases, 1}, + {"Notlinked", 10, unit.TypeInvalid, 0}, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { attach, err := repo_model.GetAttachmentByID(t.Context(), tc.attachID) assert.NoError(t, err) - unitType, err := GetAttachmentLinkedType(t.Context(), attach) + unitType, repoID, err := GetAttachmentLinkedTypeAndRepoID(t.Context(), attach) assert.NoError(t, err) assert.Equal(t, tc.expectedUnitType, unitType) + assert.Equal(t, tc.expectedRepoID, repoID) }) } } From 9cc043120da8c0470ce6e418e89e78ec0ef553d0 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 16 Jan 2026 23:06:34 -0800 Subject: [PATCH 7/7] update copyright year --- models/migrations/v1_26/v325.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/migrations/v1_26/v325.go b/models/migrations/v1_26/v325.go index 30c9c2d1b1..d81540f44e 100644 --- a/models/migrations/v1_26/v325.go +++ b/models/migrations/v1_26/v325.go @@ -1,4 +1,4 @@ -// Copyright 2025 The Gitea Authors. All rights reserved. +// Copyright 2026 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package v1_26