Skip to content

Commit 5bfb9bc

Browse files
6543zeripath
andauthored
When migrating from Gitlab map Approvals to approving Reviews (#11147)
When migrating from Gitlab map Gitlab Approvals to approving Reviews Co-Authored-By: zeripath <[email protected]>
1 parent 067eff8 commit 5bfb9bc

File tree

4 files changed

+65
-10
lines changed

4 files changed

+65
-10
lines changed

modules/migrations/base/pullrequest.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
// PullRequest defines a standard pull request information
1414
type PullRequest struct {
1515
Number int64
16+
OriginalNumber int64
1617
Title string
1718
PosterName string
1819
PosterID int64

modules/migrations/gitlab.go

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func init() {
3232
type GitlabDownloaderFactory struct {
3333
}
3434

35-
// Match returns ture if the migration remote URL matched this downloader factory
35+
// Match returns true if the migration remote URL matched this downloader factory
3636
func (f *GitlabDownloaderFactory) Match(opts base.MigrateOptions) (bool, error) {
3737
var matched bool
3838

@@ -492,11 +492,12 @@ func (g *GitlabDownloader) GetPullRequests(page, perPage int) ([]*base.PullReque
492492
}
493493

494494
// Add the PR ID to the Issue Count because PR and Issues share ID space in Gitea
495-
newPRnumber := g.issueCount + int64(pr.IID)
495+
newPRNumber := g.issueCount + int64(pr.IID)
496496

497497
allPRs = append(allPRs, &base.PullRequest{
498498
Title: pr.Title,
499-
Number: int64(newPRnumber),
499+
Number: newPRNumber,
500+
OriginalNumber: int64(pr.IID),
500501
PosterName: pr.Author.Username,
501502
PosterID: int64(pr.Author.ID),
502503
Content: pr.Description,
@@ -532,5 +533,30 @@ func (g *GitlabDownloader) GetPullRequests(page, perPage int) ([]*base.PullReque
532533
// GetReviews returns pull requests review
533534
func (g *GitlabDownloader) GetReviews(pullRequestNumber int64) ([]*base.Review, error) {
534535

535-
return nil, nil
536+
state, _, err := g.client.MergeRequestApprovals.GetApprovalState(g.repoID, int(pullRequestNumber))
537+
if err != nil {
538+
return nil, err
539+
}
540+
541+
// GitLab's Approvals are equivalent to Gitea's approve reviews
542+
approvers := make(map[int]string)
543+
for i := range state.Rules {
544+
for u := range state.Rules[i].ApprovedBy {
545+
approvers[state.Rules[i].ApprovedBy[u].ID] = state.Rules[i].ApprovedBy[u].Username
546+
}
547+
}
548+
549+
var reviews = make([]*base.Review, 0, len(approvers))
550+
for id, name := range approvers {
551+
reviews = append(reviews, &base.Review{
552+
ReviewerID: int64(id),
553+
ReviewerName: name,
554+
// GitLab API doesn't return a creation date
555+
CreatedAt: time.Now(),
556+
// All we get are approvals
557+
State: base.ReviewStateApproved,
558+
})
559+
}
560+
561+
return reviews, nil
536562
}

modules/migrations/gitlab_test.go

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ func TestGitlabDownloadRepo(t *testing.T) {
110110
},
111111
}, releases[len(releases)-1:])
112112

113-
// downloader.GetIssues()
114113
issues, isEnd, err := downloader.GetIssues(1, 2)
115114
assert.NoError(t, err)
116115
assert.EqualValues(t, 2, len(issues))
@@ -162,7 +161,6 @@ func TestGitlabDownloadRepo(t *testing.T) {
162161
},
163162
}, issues)
164163

165-
// downloader.GetComments()
166164
comments, err := downloader.GetComments(2)
167165
assert.NoError(t, err)
168166
assert.EqualValues(t, 4, len(comments))
@@ -202,10 +200,9 @@ func TestGitlabDownloadRepo(t *testing.T) {
202200
},
203201
}, comments[:4])
204202

205-
// downloader.GetPullRequests()
206203
prs, err := downloader.GetPullRequests(1, 1)
207204
assert.NoError(t, err)
208-
assert.EqualValues(t, 1, len(prs))
205+
assert.Len(t, prs, 1)
209206

210207
assert.EqualValues(t, []*base.PullRequest{
211208
{
@@ -243,4 +240,23 @@ func TestGitlabDownloadRepo(t *testing.T) {
243240
MergeCommitSHA: "",
244241
},
245242
}, prs)
243+
244+
rvs, err := downloader.GetReviews(1)
245+
assert.NoError(t, err)
246+
if assert.Len(t, prs, 2) {
247+
assert.EqualValues(t, 527793, rvs[0].ReviewerID)
248+
assert.EqualValues(t, "axifive", rvs[0].ReviewerName)
249+
assert.EqualValues(t, "APPROVED", rvs[0].State)
250+
assert.EqualValues(t, 4102996, rvs[1].ReviewerID)
251+
assert.EqualValues(t, "zeripath", rvs[1].ReviewerName)
252+
assert.EqualValues(t, "APPROVED", rvs[1].State)
253+
}
254+
rvs, err = downloader.GetReviews(2)
255+
assert.NoError(t, err)
256+
if assert.Len(t, prs, 1) {
257+
assert.EqualValues(t, 4575606, rvs[0].ReviewerID)
258+
assert.EqualValues(t, "real6543", rvs[0].ReviewerName)
259+
assert.EqualValues(t, "APPROVED", rvs[0].State)
260+
}
261+
246262
}

modules/migrations/migrate.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func MigrateRepository(ctx context.Context, doer *models.User, ownerName string,
8686
return uploader.repo, nil
8787
}
8888

89-
// migrateRepository will download informations and upload to Uploader, this is a simple
89+
// migrateRepository will download information and then upload it to Uploader, this is a simple
9090
// process for small repository. For a big repository, save all the data to disk
9191
// before upload is better
9292
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
277277
// migrate reviews
278278
var allReviews = make([]*base.Review, 0, reviewBatchSize)
279279
for _, pr := range prs {
280-
reviews, err := downloader.GetReviews(pr.Number)
280+
number := pr.Number
281+
282+
// on gitlab migrations pull number change
283+
if pr.OriginalNumber > 0 {
284+
number = pr.OriginalNumber
285+
}
286+
287+
reviews, err := downloader.GetReviews(number)
288+
if pr.OriginalNumber > 0 {
289+
for i := range reviews {
290+
reviews[i].IssueIndex = pr.Number
291+
}
292+
}
281293
if err != nil {
282294
return err
283295
}

0 commit comments

Comments
 (0)