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 | |||
type PullRequest struct { | |||
Number int64 | |||
OriginalNumber int64 | |||
Title string | |||
PosterName string | |||
PosterID int64 | |||
@@ -32,7 +32,7 @@ func init() { | |||
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) { | |||
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 | |||
newPRnumber := g.issueCount + int64(pr.IID) | |||
newPRNumber := g.issueCount + int64(pr.IID) | |||
allPRs = append(allPRs, &base.PullRequest{ | |||
Title: pr.Title, | |||
Number: int64(newPRnumber), | |||
Number: newPRNumber, | |||
OriginalNumber: int64(pr.IID), | |||
PosterName: pr.Author.Username, | |||
PosterID: int64(pr.Author.ID), | |||
Content: pr.Description, | |||
@@ -532,5 +533,30 @@ func (g *GitlabDownloader) GetPullRequests(page, perPage int) ([]*base.PullReque | |||
// GetReviews returns pull requests review | |||
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:]) | |||
// downloader.GetIssues() | |||
issues, isEnd, err := downloader.GetIssues(1, 2) | |||
assert.NoError(t, err) | |||
assert.EqualValues(t, 2, len(issues)) | |||
@@ -162,7 +161,6 @@ func TestGitlabDownloadRepo(t *testing.T) { | |||
}, | |||
}, issues) | |||
// downloader.GetComments() | |||
comments, err := downloader.GetComments(2) | |||
assert.NoError(t, err) | |||
assert.EqualValues(t, 4, len(comments)) | |||
@@ -202,10 +200,9 @@ func TestGitlabDownloadRepo(t *testing.T) { | |||
}, | |||
}, comments[:4]) | |||
// downloader.GetPullRequests() | |||
prs, err := downloader.GetPullRequests(1, 1) | |||
assert.NoError(t, err) | |||
assert.EqualValues(t, 1, len(prs)) | |||
assert.Len(t, prs, 1) | |||
assert.EqualValues(t, []*base.PullRequest{ | |||
{ | |||
@@ -243,4 +240,23 @@ func TestGitlabDownloadRepo(t *testing.T) { | |||
MergeCommitSHA: "", | |||
}, | |||
}, 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 | |||
} | |||
// 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 | |||
// before upload is better | |||
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 | |||
var allReviews = make([]*base.Review, 0, reviewBatchSize) | |||
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 { | |||
return err | |||
} | |||