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