When migrating from Gitlab map Gitlab Approvals to approving Reviews Co-Authored-By: zeripath <art27@cantab.net>tags/v1.21.12.1
| @@ -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 | ||||
| } | } | ||||