mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 22:28:05 +01:00 
			
		
		
		
	Use known issue IID to generate new PR index number when migrating from GitLab (#28616)
Fix #13884
This commit is contained in:
		
							parent
							
								
									0e9c988373
								
							
						
					
					
						commit
						d68b9237bf
					
				| @ -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, | ||||
|  | ||||
| @ -516,3 +516,20 @@ func TestAwardsToReactions(t *testing.T) { | ||||
| 		}, | ||||
| 	}, reactions) | ||||
| } | ||||
| 
 | ||||
| func TestGitlabIIDResolver(t *testing.T) { | ||||
| 	r := gitlabIIDResolver{} | ||||
| 	r.recordIssueIID(1) | ||||
| 	r.recordIssueIID(2) | ||||
| 	r.recordIssueIID(3) | ||||
| 	r.recordIssueIID(2) | ||||
| 	assert.EqualValues(t, 4, r.generatePullRequestNumber(1)) | ||||
| 	assert.EqualValues(t, 13, r.generatePullRequestNumber(10)) | ||||
| 
 | ||||
| 	assert.Panics(t, func() { | ||||
| 		r := gitlabIIDResolver{} | ||||
| 		r.recordIssueIID(1) | ||||
| 		assert.EqualValues(t, 2, r.generatePullRequestNumber(1)) | ||||
| 		r.recordIssueIID(3) // the generation procedure has been started, it shouldn't accept any new issue IID, so it panics | ||||
| 	}) | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user