Migrations: Gitlab Add Reactions Support for Issues & MergeRequests (#12695)

* fix migrations: gitlab_test

* more stable test

* Get Reactions to Pulls

* Reactions for Issues

* Comments are still hard

Co-authored-by: Lauris BH <lauris@nix.lv>
This commit is contained in:
6543 2020-09-03 09:35:17 +02:00 committed by GitHub
parent 7af2ccd511
commit ad4a644fb3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 120 additions and 23 deletions

View file

@ -327,7 +327,6 @@ func (g *GitlabDownloader) GetAsset(tag string, id int64) (io.ReadCloser, error)
// GetIssues returns issues according start and limit // GetIssues returns issues according start and limit
// Note: issue label description and colors are not supported by the go-gitlab library at this time // Note: issue label description and colors are not supported by the go-gitlab library at this time
// TODO: figure out how to transfer issue reactions
func (g *GitlabDownloader) GetIssues(page, perPage int) ([]*base.Issue, bool, error) { func (g *GitlabDownloader) GetIssues(page, perPage int) ([]*base.Issue, bool, error) {
state := "all" state := "all"
sort := "asc" sort := "asc"
@ -361,6 +360,22 @@ func (g *GitlabDownloader) GetIssues(page, perPage int) ([]*base.Issue, bool, er
milestone = issue.Milestone.Title milestone = issue.Milestone.Title
} }
var reactions []*base.Reaction
var awardPage = 1
for {
awards, _, err := g.client.AwardEmoji.ListIssueAwardEmoji(g.repoID, issue.IID, &gitlab.ListAwardEmojiOptions{Page: awardPage, PerPage: perPage}, gitlab.WithContext(g.ctx))
if err != nil {
return nil, false, fmt.Errorf("error while listing issue awards: %v", err)
}
if len(awards) < perPage {
break
}
for i := range awards {
reactions = append(reactions, g.awardToReaction(awards[i]))
}
awardPage++
}
allIssues = append(allIssues, &base.Issue{ allIssues = append(allIssues, &base.Issue{
Title: issue.Title, Title: issue.Title,
Number: int64(issue.IID), Number: int64(issue.IID),
@ -371,6 +386,7 @@ func (g *GitlabDownloader) GetIssues(page, perPage int) ([]*base.Issue, bool, er
State: issue.State, State: issue.State,
Created: *issue.CreatedAt, Created: *issue.CreatedAt,
Labels: labels, Labels: labels,
Reactions: reactions,
Closed: issue.ClosedAt, Closed: issue.ClosedAt,
IsLocked: issue.DiscussionLocked, IsLocked: issue.DiscussionLocked,
Updated: *issue.UpdatedAt, Updated: *issue.UpdatedAt,
@ -384,6 +400,7 @@ func (g *GitlabDownloader) GetIssues(page, perPage int) ([]*base.Issue, bool, er
} }
// GetComments returns comments according issueNumber // GetComments returns comments according issueNumber
// TODO: figure out how to transfer comment reactions
func (g *GitlabDownloader) GetComments(issueNumber int64) ([]*base.Comment, error) { func (g *GitlabDownloader) GetComments(issueNumber int64) ([]*base.Comment, error) {
var allComments = make([]*base.Comment, 0, 100) var allComments = make([]*base.Comment, 0, 100)
@ -501,6 +518,22 @@ func (g *GitlabDownloader) GetPullRequests(page, perPage int) ([]*base.PullReque
milestone = pr.Milestone.Title milestone = pr.Milestone.Title
} }
var reactions []*base.Reaction
var awardPage = 1
for {
awards, _, err := g.client.AwardEmoji.ListMergeRequestAwardEmoji(g.repoID, pr.IID, &gitlab.ListAwardEmojiOptions{Page: awardPage, PerPage: perPage}, gitlab.WithContext(g.ctx))
if err != nil {
return nil, fmt.Errorf("error while listing merge requests awards: %v", err)
}
if len(awards) < perPage {
break
}
for i := range awards {
reactions = append(reactions, g.awardToReaction(awards[i]))
}
awardPage++
}
// 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)
@ -520,6 +553,7 @@ func (g *GitlabDownloader) GetPullRequests(page, perPage int) ([]*base.PullReque
MergeCommitSHA: pr.MergeCommitSHA, MergeCommitSHA: pr.MergeCommitSHA,
MergedTime: mergeTime, MergedTime: mergeTime,
IsLocked: locked, IsLocked: locked,
Reactions: reactions,
Head: base.PullRequestBranch{ Head: base.PullRequestBranch{
Ref: pr.SourceBranch, Ref: pr.SourceBranch,
SHA: pr.SHA, SHA: pr.SHA,
@ -570,3 +604,11 @@ func (g *GitlabDownloader) GetReviews(pullRequestNumber int64) ([]*base.Review,
return reviews, nil return reviews, nil
} }
func (g *GitlabDownloader) awardToReaction(award *gitlab.AwardEmoji) *base.Reaction {
return &base.Reaction{
UserID: int64(award.User.ID),
UserName: award.User.Username,
Content: award.Name,
}
}

View file

@ -130,7 +130,7 @@ func TestGitlabDownloadRepo(t *testing.T) {
PosterName: "lafriks", PosterName: "lafriks",
State: "closed", State: "closed",
Created: time.Date(2019, 11, 28, 8, 43, 35, 459000000, time.UTC), Created: time.Date(2019, 11, 28, 8, 43, 35, 459000000, time.UTC),
Updated: time.Date(2019, 11, 28, 8, 46, 23, 275000000, time.UTC), Updated: time.Date(2019, 11, 28, 8, 46, 23, 304000000, time.UTC),
Labels: []*base.Label{ Labels: []*base.Label{
{ {
Name: "bug", Name: "bug",
@ -139,7 +139,17 @@ func TestGitlabDownloadRepo(t *testing.T) {
Name: "discussion", Name: "discussion",
}, },
}, },
Reactions: nil, Reactions: []*base.Reaction{
{
UserID: 1241334,
UserName: "lafriks",
Content: "thumbsup",
},
{
UserID: 1241334,
UserName: "lafriks",
Content: "open_mouth",
}},
Closed: &closed1, Closed: &closed1,
}, },
{ {
@ -157,7 +167,37 @@ func TestGitlabDownloadRepo(t *testing.T) {
Name: "duplicate", Name: "duplicate",
}, },
}, },
Reactions: nil, Reactions: []*base.Reaction{
{
UserID: 1241334,
UserName: "lafriks",
Content: "thumbsup",
},
{
UserID: 1241334,
UserName: "lafriks",
Content: "thumbsdown",
},
{
UserID: 1241334,
UserName: "lafriks",
Content: "laughing",
},
{
UserID: 1241334,
UserName: "lafriks",
Content: "tada",
},
{
UserID: 1241334,
UserName: "lafriks",
Content: "confused",
},
{
UserID: 1241334,
UserName: "lafriks",
Content: "hearts",
}},
Closed: &closed2, Closed: &closed2,
}, },
}, issues) }, issues)
@ -171,7 +211,6 @@ func TestGitlabDownloadRepo(t *testing.T) {
PosterID: 1241334, PosterID: 1241334,
PosterName: "lafriks", PosterName: "lafriks",
Created: time.Date(2019, 11, 28, 8, 44, 52, 501000000, time.UTC), Created: time.Date(2019, 11, 28, 8, 44, 52, 501000000, time.UTC),
Updated: time.Date(2019, 11, 28, 8, 44, 52, 501000000, time.UTC),
Content: "This is a comment", Content: "This is a comment",
Reactions: nil, Reactions: nil,
}, },
@ -208,6 +247,7 @@ func TestGitlabDownloadRepo(t *testing.T) {
assert.EqualValues(t, []*base.PullRequest{ assert.EqualValues(t, []*base.PullRequest{
{ {
Number: 4, Number: 4,
OriginalNumber: 2,
Title: "Test branch", Title: "Test branch",
Content: "do not merge this PR", Content: "do not merge this PR",
Milestone: "1.0.0", Milestone: "1.0.0",
@ -215,12 +255,20 @@ func TestGitlabDownloadRepo(t *testing.T) {
PosterName: "lafriks", PosterName: "lafriks",
State: "opened", State: "opened",
Created: time.Date(2019, 11, 28, 15, 56, 54, 104000000, time.UTC), Created: time.Date(2019, 11, 28, 15, 56, 54, 104000000, time.UTC),
Updated: time.Date(2019, 11, 28, 15, 56, 54, 104000000, time.UTC),
Labels: []*base.Label{ Labels: []*base.Label{
{ {
Name: "bug", Name: "bug",
}, },
}, },
Reactions: []*base.Reaction{{
UserID: 4575606,
UserName: "real6543",
Content: "thumbsup",
}, {
UserID: 4575606,
UserName: "real6543",
Content: "tada",
}},
PatchURL: "https://gitlab.com/gitea/test_repo/-/merge_requests/2.patch", PatchURL: "https://gitlab.com/gitea/test_repo/-/merge_requests/2.patch",
Head: base.PullRequestBranch{ Head: base.PullRequestBranch{
Ref: "feat/test", Ref: "feat/test",
@ -244,13 +292,20 @@ func TestGitlabDownloadRepo(t *testing.T) {
rvs, err := downloader.GetReviews(1) rvs, err := downloader.GetReviews(1)
assert.NoError(t, err) assert.NoError(t, err)
if assert.Len(t, prs, 2) { if assert.Len(t, rvs, 2) {
assert.EqualValues(t, 527793, rvs[0].ReviewerID) for i := range rvs {
assert.EqualValues(t, "axifive", rvs[0].ReviewerName) switch rvs[i].ReviewerID {
assert.EqualValues(t, "APPROVED", rvs[0].State) case 4102996:
assert.EqualValues(t, 4102996, rvs[1].ReviewerID) assert.EqualValues(t, "zeripath", rvs[i].ReviewerName)
assert.EqualValues(t, "zeripath", rvs[1].ReviewerName) assert.EqualValues(t, "APPROVED", rvs[i].State)
assert.EqualValues(t, "APPROVED", rvs[1].State) case 527793:
assert.EqualValues(t, "axifive", rvs[i].ReviewerName)
assert.EqualValues(t, "APPROVED", rvs[i].State)
default:
t.Errorf("Unexpected Reviewer ID: %d", rvs[i].ReviewerID)
}
}
} }
rvs, err = downloader.GetReviews(2) rvs, err = downloader.GetReviews(2)
assert.NoError(t, err) assert.NoError(t, err)