mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	When migrating from Gitlab map Approvals to approving Reviews (#11147)
When migrating from Gitlab map Gitlab Approvals to approving Reviews Co-Authored-By: zeripath <art27@cantab.net>
This commit is contained in:
		| @@ -13,6 +13,7 @@ import ( | |||||||
| // PullRequest defines a standard pull request information | // PullRequest defines a standard pull request information | ||||||
| type PullRequest struct { | type PullRequest struct { | ||||||
| 	Number         int64 | 	Number         int64 | ||||||
|  | 	OriginalNumber int64 | ||||||
| 	Title          string | 	Title          string | ||||||
| 	PosterName     string | 	PosterName     string | ||||||
| 	PosterID       int64 | 	PosterID       int64 | ||||||
|   | |||||||
| @@ -32,7 +32,7 @@ func init() { | |||||||
| type GitlabDownloaderFactory struct { | type GitlabDownloaderFactory struct { | ||||||
| } | } | ||||||
|  |  | ||||||
| // Match returns ture if the migration remote URL matched this downloader factory | // Match returns true if the migration remote URL matched this downloader factory | ||||||
| func (f *GitlabDownloaderFactory) Match(opts base.MigrateOptions) (bool, error) { | func (f *GitlabDownloaderFactory) Match(opts base.MigrateOptions) (bool, error) { | ||||||
| 	var matched bool | 	var matched bool | ||||||
|  |  | ||||||
| @@ -492,11 +492,12 @@ func (g *GitlabDownloader) GetPullRequests(page, perPage int) ([]*base.PullReque | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		// Add the PR ID to the Issue Count because PR and Issues share ID space in Gitea | 		// Add the PR ID to the Issue Count because PR and Issues share ID space in Gitea | ||||||
| 		newPRnumber := g.issueCount + int64(pr.IID) | 		newPRNumber := g.issueCount + int64(pr.IID) | ||||||
|  |  | ||||||
| 		allPRs = append(allPRs, &base.PullRequest{ | 		allPRs = append(allPRs, &base.PullRequest{ | ||||||
| 			Title:          pr.Title, | 			Title:          pr.Title, | ||||||
| 			Number:         int64(newPRnumber), | 			Number:         newPRNumber, | ||||||
|  | 			OriginalNumber: int64(pr.IID), | ||||||
| 			PosterName:     pr.Author.Username, | 			PosterName:     pr.Author.Username, | ||||||
| 			PosterID:       int64(pr.Author.ID), | 			PosterID:       int64(pr.Author.ID), | ||||||
| 			Content:        pr.Description, | 			Content:        pr.Description, | ||||||
| @@ -532,5 +533,30 @@ func (g *GitlabDownloader) GetPullRequests(page, perPage int) ([]*base.PullReque | |||||||
| // GetReviews returns pull requests review | // GetReviews returns pull requests review | ||||||
| func (g *GitlabDownloader) GetReviews(pullRequestNumber int64) ([]*base.Review, error) { | func (g *GitlabDownloader) GetReviews(pullRequestNumber int64) ([]*base.Review, error) { | ||||||
|  |  | ||||||
| 	return nil, nil | 	state, _, err := g.client.MergeRequestApprovals.GetApprovalState(g.repoID, int(pullRequestNumber)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// GitLab's Approvals are equivalent to Gitea's approve reviews | ||||||
|  | 	approvers := make(map[int]string) | ||||||
|  | 	for i := range state.Rules { | ||||||
|  | 		for u := range state.Rules[i].ApprovedBy { | ||||||
|  | 			approvers[state.Rules[i].ApprovedBy[u].ID] = state.Rules[i].ApprovedBy[u].Username | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var reviews = make([]*base.Review, 0, len(approvers)) | ||||||
|  | 	for id, name := range approvers { | ||||||
|  | 		reviews = append(reviews, &base.Review{ | ||||||
|  | 			ReviewerID:   int64(id), | ||||||
|  | 			ReviewerName: name, | ||||||
|  | 			// GitLab API doesn't return a creation date | ||||||
|  | 			CreatedAt: time.Now(), | ||||||
|  | 			// All we get are approvals | ||||||
|  | 			State: base.ReviewStateApproved, | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return reviews, nil | ||||||
| } | } | ||||||
|   | |||||||
| @@ -110,7 +110,6 @@ func TestGitlabDownloadRepo(t *testing.T) { | |||||||
| 		}, | 		}, | ||||||
| 	}, releases[len(releases)-1:]) | 	}, releases[len(releases)-1:]) | ||||||
|  |  | ||||||
| 	// downloader.GetIssues() |  | ||||||
| 	issues, isEnd, err := downloader.GetIssues(1, 2) | 	issues, isEnd, err := downloader.GetIssues(1, 2) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.EqualValues(t, 2, len(issues)) | 	assert.EqualValues(t, 2, len(issues)) | ||||||
| @@ -162,7 +161,6 @@ func TestGitlabDownloadRepo(t *testing.T) { | |||||||
| 		}, | 		}, | ||||||
| 	}, issues) | 	}, issues) | ||||||
|  |  | ||||||
| 	// downloader.GetComments() |  | ||||||
| 	comments, err := downloader.GetComments(2) | 	comments, err := downloader.GetComments(2) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.EqualValues(t, 4, len(comments)) | 	assert.EqualValues(t, 4, len(comments)) | ||||||
| @@ -202,10 +200,9 @@ func TestGitlabDownloadRepo(t *testing.T) { | |||||||
| 		}, | 		}, | ||||||
| 	}, comments[:4]) | 	}, comments[:4]) | ||||||
|  |  | ||||||
| 	// downloader.GetPullRequests() |  | ||||||
| 	prs, err := downloader.GetPullRequests(1, 1) | 	prs, err := downloader.GetPullRequests(1, 1) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.EqualValues(t, 1, len(prs)) | 	assert.Len(t, prs, 1) | ||||||
|  |  | ||||||
| 	assert.EqualValues(t, []*base.PullRequest{ | 	assert.EqualValues(t, []*base.PullRequest{ | ||||||
| 		{ | 		{ | ||||||
| @@ -243,4 +240,23 @@ func TestGitlabDownloadRepo(t *testing.T) { | |||||||
| 			MergeCommitSHA: "", | 			MergeCommitSHA: "", | ||||||
| 		}, | 		}, | ||||||
| 	}, prs) | 	}, prs) | ||||||
|  |  | ||||||
|  | 	rvs, err := downloader.GetReviews(1) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	if assert.Len(t, prs, 2) { | ||||||
|  | 		assert.EqualValues(t, 527793, rvs[0].ReviewerID) | ||||||
|  | 		assert.EqualValues(t, "axifive", rvs[0].ReviewerName) | ||||||
|  | 		assert.EqualValues(t, "APPROVED", rvs[0].State) | ||||||
|  | 		assert.EqualValues(t, 4102996, rvs[1].ReviewerID) | ||||||
|  | 		assert.EqualValues(t, "zeripath", rvs[1].ReviewerName) | ||||||
|  | 		assert.EqualValues(t, "APPROVED", rvs[1].State) | ||||||
|  | 	} | ||||||
|  | 	rvs, err = downloader.GetReviews(2) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	if assert.Len(t, prs, 1) { | ||||||
|  | 		assert.EqualValues(t, 4575606, rvs[0].ReviewerID) | ||||||
|  | 		assert.EqualValues(t, "real6543", rvs[0].ReviewerName) | ||||||
|  | 		assert.EqualValues(t, "APPROVED", rvs[0].State) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -86,7 +86,7 @@ func MigrateRepository(ctx context.Context, doer *models.User, ownerName string, | |||||||
| 	return uploader.repo, nil | 	return uploader.repo, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // migrateRepository will download informations and upload to Uploader, this is a simple | // migrateRepository will download information and then upload it to Uploader, this is a simple | ||||||
| // process for small repository. For a big repository, save all the data to disk | // process for small repository. For a big repository, save all the data to disk | ||||||
| // before upload is better | // before upload is better | ||||||
| func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts base.MigrateOptions) error { | func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts base.MigrateOptions) error { | ||||||
| @@ -277,7 +277,19 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts | |||||||
| 			// migrate reviews | 			// migrate reviews | ||||||
| 			var allReviews = make([]*base.Review, 0, reviewBatchSize) | 			var allReviews = make([]*base.Review, 0, reviewBatchSize) | ||||||
| 			for _, pr := range prs { | 			for _, pr := range prs { | ||||||
| 				reviews, err := downloader.GetReviews(pr.Number) | 				number := pr.Number | ||||||
|  |  | ||||||
|  | 				// on gitlab migrations pull number change | ||||||
|  | 				if pr.OriginalNumber > 0 { | ||||||
|  | 					number = pr.OriginalNumber | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				reviews, err := downloader.GetReviews(number) | ||||||
|  | 				if pr.OriginalNumber > 0 { | ||||||
|  | 					for i := range reviews { | ||||||
|  | 						reviews[i].IssueIndex = pr.Number | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					return err | 					return err | ||||||
| 				} | 				} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user