mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Use known issue IID to generate new PR index number when migrating from GitLab (#28616)
Fix #13884
This commit is contained in:
		| @@ -55,19 +55,36 @@ func (f *GitlabDownloaderFactory) GitServiceType() structs.GitServiceType { | ||||
| 	return structs.GitlabService | ||||
| } | ||||
|  | ||||
| type gitlabIIDResolver struct { | ||||
| 	maxIssueIID int64 | ||||
| 	frozen      bool | ||||
| } | ||||
|  | ||||
| func (r *gitlabIIDResolver) recordIssueIID(issueIID int) { | ||||
| 	if r.frozen { | ||||
| 		panic("cannot record issue IID after pull request IID generation has started") | ||||
| 	} | ||||
| 	r.maxIssueIID = max(r.maxIssueIID, int64(issueIID)) | ||||
| } | ||||
|  | ||||
| func (r *gitlabIIDResolver) generatePullRequestNumber(mrIID int) int64 { | ||||
| 	r.frozen = true | ||||
| 	return r.maxIssueIID + int64(mrIID) | ||||
| } | ||||
|  | ||||
| // GitlabDownloader implements a Downloader interface to get repository information | ||||
| // from gitlab via go-gitlab | ||||
| // - issueCount is incremented in GetIssues() to ensure PR and Issue numbers do not overlap, | ||||
| // because Gitlab has individual Issue and Pull Request numbers. | ||||
| type GitlabDownloader struct { | ||||
| 	base.NullDownloader | ||||
| 	ctx        context.Context | ||||
| 	client     *gitlab.Client | ||||
| 	baseURL    string | ||||
| 	repoID     int | ||||
| 	repoName   string | ||||
| 	issueCount int64 | ||||
| 	maxPerPage int | ||||
| 	ctx         context.Context | ||||
| 	client      *gitlab.Client | ||||
| 	baseURL     string | ||||
| 	repoID      int | ||||
| 	repoName    string | ||||
| 	iidResolver gitlabIIDResolver | ||||
| 	maxPerPage  int | ||||
| } | ||||
|  | ||||
| // NewGitlabDownloader creates a gitlab Downloader via gitlab API | ||||
| @@ -450,8 +467,8 @@ func (g *GitlabDownloader) GetIssues(page, perPage int) ([]*base.Issue, bool, er | ||||
| 			Context:      gitlabIssueContext{IsMergeRequest: false}, | ||||
| 		}) | ||||
|  | ||||
| 		// increment issueCount, to be used in GetPullRequests() | ||||
| 		g.issueCount++ | ||||
| 		// record the issue IID, to be used in GetPullRequests() | ||||
| 		g.iidResolver.recordIssueIID(issue.IID) | ||||
| 	} | ||||
|  | ||||
| 	return allIssues, len(issues) < perPage, nil | ||||
| @@ -607,8 +624,8 @@ func (g *GitlabDownloader) GetPullRequests(page, perPage int) ([]*base.PullReque | ||||
| 			awardPage++ | ||||
| 		} | ||||
|  | ||||
| 		// Add the PR ID to the Issue Count because PR and Issues share ID space in Gitea | ||||
| 		newPRNumber := g.issueCount + int64(pr.IID) | ||||
| 		// Generate new PR Numbers by the known Issue Numbers, because they share the same number space in Gitea, but they are independent in Gitlab | ||||
| 		newPRNumber := g.iidResolver.generatePullRequestNumber(pr.IID) | ||||
|  | ||||
| 		allPRs = append(allPRs, &base.PullRequest{ | ||||
| 			Title:          pr.Title, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user