Skip to content

Commit 97b5cdc

Browse files
committed
Fix possible bug when migrating issues/pull requests
1 parent 05e9063 commit 97b5cdc

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

services/migrations/migrate.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
repo_model "code.gitea.io/gitea/models/repo"
1616
system_model "code.gitea.io/gitea/models/system"
1717
user_model "code.gitea.io/gitea/models/user"
18+
"code.gitea.io/gitea/modules/container"
1819
"code.gitea.io/gitea/modules/git"
1920
"code.gitea.io/gitea/modules/hostmatcher"
2021
"code.gitea.io/gitea/modules/log"
@@ -328,6 +329,9 @@ func migrateRepository(_ context.Context, doer *user_model.User, downloader base
328329
messenger("repo.migrate.migrating_issues")
329330
issueBatchSize := uploader.MaxBatchInsertSize("issue")
330331

332+
// because when the migrating is running, some issues maybe removed, so after the next page
333+
// some of issue maybe duplicated, so we need to record the inserted issue indexes
334+
mapInsertedIssueIndexes := container.Set[int64]{}
331335
for i := 1; ; i++ {
332336
issues, isEnd, err := downloader.GetIssues(i, issueBatchSize)
333337
if err != nil {
@@ -337,6 +341,14 @@ func migrateRepository(_ context.Context, doer *user_model.User, downloader base
337341
log.Warn("migrating issues is not supported, ignored")
338342
break
339343
}
344+
for i := 0; i < len(issues); i++ {
345+
if mapInsertedIssueIndexes.Contains(issues[i].Number) {
346+
issues = append(issues[:i], issues[i+1:]...)
347+
i--
348+
continue
349+
}
350+
mapInsertedIssueIndexes.Add(issues[i].Number)
351+
}
340352

341353
if err := uploader.CreateIssues(issues...); err != nil {
342354
return err
@@ -382,6 +394,7 @@ func migrateRepository(_ context.Context, doer *user_model.User, downloader base
382394
log.Trace("migrating pull requests and comments")
383395
messenger("repo.migrate.migrating_pulls")
384396
prBatchSize := uploader.MaxBatchInsertSize("pullrequest")
397+
mapInsertedIssueIndexes := container.Set[int64]{}
385398
for i := 1; ; i++ {
386399
prs, isEnd, err := downloader.GetPullRequests(i, prBatchSize)
387400
if err != nil {
@@ -391,6 +404,14 @@ func migrateRepository(_ context.Context, doer *user_model.User, downloader base
391404
log.Warn("migrating pull requests is not supported, ignored")
392405
break
393406
}
407+
for i := 0; i < len(prs); i++ {
408+
if mapInsertedIssueIndexes.Contains(prs[i].Number) {
409+
prs = append(prs[:i], prs[i+1:]...)
410+
i--
411+
continue
412+
}
413+
mapInsertedIssueIndexes.Add(prs[i].Number)
414+
}
394415

395416
if err := uploader.CreatePullRequests(prs...); err != nil {
396417
return err

0 commit comments

Comments
 (0)