From 97b5cdc3f6373295e08a9d53d35c068a912374eb Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 31 Jan 2025 18:40:56 -0800 Subject: [PATCH 1/2] Fix possible bug when migrating issues/pull requests --- services/migrations/migrate.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/services/migrations/migrate.go b/services/migrations/migrate.go index 51b22d6111b15..4914c4cb35c85 100644 --- a/services/migrations/migrate.go +++ b/services/migrations/migrate.go @@ -15,6 +15,7 @@ import ( repo_model "code.gitea.io/gitea/models/repo" system_model "code.gitea.io/gitea/models/system" user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/hostmatcher" "code.gitea.io/gitea/modules/log" @@ -328,6 +329,9 @@ func migrateRepository(_ context.Context, doer *user_model.User, downloader base messenger("repo.migrate.migrating_issues") issueBatchSize := uploader.MaxBatchInsertSize("issue") + // because when the migrating is running, some issues maybe removed, so after the next page + // some of issue maybe duplicated, so we need to record the inserted issue indexes + mapInsertedIssueIndexes := container.Set[int64]{} for i := 1; ; i++ { issues, isEnd, err := downloader.GetIssues(i, issueBatchSize) if err != nil { @@ -337,6 +341,14 @@ func migrateRepository(_ context.Context, doer *user_model.User, downloader base log.Warn("migrating issues is not supported, ignored") break } + for i := 0; i < len(issues); i++ { + if mapInsertedIssueIndexes.Contains(issues[i].Number) { + issues = append(issues[:i], issues[i+1:]...) + i-- + continue + } + mapInsertedIssueIndexes.Add(issues[i].Number) + } if err := uploader.CreateIssues(issues...); err != nil { return err @@ -382,6 +394,7 @@ func migrateRepository(_ context.Context, doer *user_model.User, downloader base log.Trace("migrating pull requests and comments") messenger("repo.migrate.migrating_pulls") prBatchSize := uploader.MaxBatchInsertSize("pullrequest") + mapInsertedIssueIndexes := container.Set[int64]{} for i := 1; ; i++ { prs, isEnd, err := downloader.GetPullRequests(i, prBatchSize) if err != nil { @@ -391,6 +404,14 @@ func migrateRepository(_ context.Context, doer *user_model.User, downloader base log.Warn("migrating pull requests is not supported, ignored") break } + for i := 0; i < len(prs); i++ { + if mapInsertedIssueIndexes.Contains(prs[i].Number) { + prs = append(prs[:i], prs[i+1:]...) + i-- + continue + } + mapInsertedIssueIndexes.Add(prs[i].Number) + } if err := uploader.CreatePullRequests(prs...); err != nil { return err From 0f822038a6c8b6b5f83ce1e37e3447cc1d1560c2 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 21 Oct 2025 20:34:42 -0700 Subject: [PATCH 2/2] rename --- services/migrations/migrate.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/migrations/migrate.go b/services/migrations/migrate.go index 876fbca4e5e28..70f71cefbc924 100644 --- a/services/migrations/migrate.go +++ b/services/migrations/migrate.go @@ -394,7 +394,7 @@ func migrateRepository(ctx context.Context, doer *user_model.User, downloader ba log.Trace("migrating pull requests and comments") messenger("repo.migrate.migrating_pulls") prBatchSize := uploader.MaxBatchInsertSize("pullrequest") - mapInsertedIssueIndexes := container.Set[int64]{} + mapInsertedPRIndexes := container.Set[int64]{} for i := 1; ; i++ { prs, isEnd, err := downloader.GetPullRequests(ctx, i, prBatchSize) if err != nil { @@ -405,12 +405,12 @@ func migrateRepository(ctx context.Context, doer *user_model.User, downloader ba break } for i := 0; i < len(prs); i++ { - if mapInsertedIssueIndexes.Contains(prs[i].Number) { + if mapInsertedPRIndexes.Contains(prs[i].Number) { prs = append(prs[:i], prs[i+1:]...) i-- continue } - mapInsertedIssueIndexes.Add(prs[i].Number) + mapInsertedPRIndexes.Add(prs[i].Number) } if err := uploader.CreatePullRequests(ctx, prs...); err != nil {