Migrate reactions when migrating repository from github (#9599)
* Migrate reactions when migrating repository from github * fix missed sleep * fix tests * update reactions when external user binding * Fix test * fix tests * change the copy head * fix test * fix migrator add/delete reaction
This commit is contained in:
parent
4e566df1c6
commit
2b3e931cde
18 changed files with 329 additions and 101 deletions
|
@ -16,5 +16,5 @@ type Comment struct {
|
|||
Created time.Time
|
||||
Updated time.Time
|
||||
Content string
|
||||
Reactions *Reactions
|
||||
Reactions []*Reaction
|
||||
}
|
||||
|
|
|
@ -22,5 +22,5 @@ type Issue struct {
|
|||
Updated time.Time
|
||||
Closed *time.Time
|
||||
Labels []*Label
|
||||
Reactions *Reactions
|
||||
Reactions []*Reaction
|
||||
}
|
||||
|
|
|
@ -33,6 +33,7 @@ type PullRequest struct {
|
|||
Assignee string
|
||||
Assignees []string
|
||||
IsLocked bool
|
||||
Reactions []*Reaction
|
||||
}
|
||||
|
||||
// IsForkPullRequest returns true if the pull request from a forked repository but not the same repository
|
||||
|
|
|
@ -1,17 +1,12 @@
|
|||
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2018 Jonas Franz. All rights reserved.
|
||||
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package base
|
||||
|
||||
// Reactions represents a summary of reactions.
|
||||
type Reactions struct {
|
||||
TotalCount int
|
||||
PlusOne int
|
||||
MinusOne int
|
||||
Laugh int
|
||||
Confused int
|
||||
Heart int
|
||||
Hooray int
|
||||
// Reaction represents a reaction to an issue/pr/comment.
|
||||
type Reaction struct {
|
||||
UserID int64
|
||||
UserName string
|
||||
Content string
|
||||
}
|
||||
|
|
|
@ -361,7 +361,32 @@ func (g *GiteaLocalUploader) CreateIssues(issues ...*base.Issue) error {
|
|||
if issue.Closed != nil {
|
||||
is.ClosedUnix = timeutil.TimeStamp(issue.Closed.Unix())
|
||||
}
|
||||
// TODO: add reactions
|
||||
// add reactions
|
||||
for _, reaction := range issue.Reactions {
|
||||
userid, ok := g.userMap[reaction.UserID]
|
||||
if !ok && tp != "" {
|
||||
var err error
|
||||
userid, err = models.GetUserIDByExternalUserID(tp, fmt.Sprintf("%v", reaction.UserID))
|
||||
if err != nil {
|
||||
log.Error("GetUserIDByExternalUserID: %v", err)
|
||||
}
|
||||
if userid > 0 {
|
||||
g.userMap[reaction.UserID] = userid
|
||||
}
|
||||
}
|
||||
var res = models.Reaction{
|
||||
Type: reaction.Content,
|
||||
CreatedUnix: timeutil.TimeStampNow(),
|
||||
}
|
||||
if userid > 0 {
|
||||
res.UserID = userid
|
||||
} else {
|
||||
res.UserID = g.doer.ID
|
||||
res.OriginalAuthorID = reaction.UserID
|
||||
res.OriginalAuthor = reaction.UserName
|
||||
}
|
||||
is.Reactions = append(is.Reactions, &res)
|
||||
}
|
||||
iss = append(iss, &is)
|
||||
}
|
||||
|
||||
|
@ -420,9 +445,34 @@ func (g *GiteaLocalUploader) CreateComments(comments ...*base.Comment) error {
|
|||
cm.OriginalAuthorID = comment.PosterID
|
||||
}
|
||||
|
||||
cms = append(cms, &cm)
|
||||
// add reactions
|
||||
for _, reaction := range comment.Reactions {
|
||||
userid, ok := g.userMap[reaction.UserID]
|
||||
if !ok && tp != "" {
|
||||
var err error
|
||||
userid, err = models.GetUserIDByExternalUserID(tp, fmt.Sprintf("%v", reaction.UserID))
|
||||
if err != nil {
|
||||
log.Error("GetUserIDByExternalUserID: %v", err)
|
||||
}
|
||||
if userid > 0 {
|
||||
g.userMap[reaction.UserID] = userid
|
||||
}
|
||||
}
|
||||
var res = models.Reaction{
|
||||
Type: reaction.Content,
|
||||
CreatedUnix: timeutil.TimeStampNow(),
|
||||
}
|
||||
if userid > 0 {
|
||||
res.UserID = userid
|
||||
} else {
|
||||
res.UserID = g.doer.ID
|
||||
res.OriginalAuthorID = reaction.UserID
|
||||
res.OriginalAuthor = reaction.UserName
|
||||
}
|
||||
cm.Reactions = append(cm.Reactions, &res)
|
||||
}
|
||||
|
||||
// TODO: Reactions
|
||||
cms = append(cms, &cm)
|
||||
}
|
||||
|
||||
return models.InsertIssueComments(cms)
|
||||
|
@ -581,10 +631,12 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*models.PullR
|
|||
UpdatedUnix: timeutil.TimeStamp(pr.Updated.Unix()),
|
||||
}
|
||||
|
||||
tp := g.gitServiceType.Name()
|
||||
|
||||
userid, ok := g.userMap[pr.PosterID]
|
||||
if !ok {
|
||||
if !ok && tp != "" {
|
||||
var err error
|
||||
userid, err = models.GetUserIDByExternalUserID("github", fmt.Sprintf("%v", pr.PosterID))
|
||||
userid, err = models.GetUserIDByExternalUserID(tp, fmt.Sprintf("%v", pr.PosterID))
|
||||
if err != nil {
|
||||
log.Error("GetUserIDByExternalUserID: %v", err)
|
||||
}
|
||||
|
@ -601,6 +653,33 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*models.PullR
|
|||
issue.OriginalAuthorID = pr.PosterID
|
||||
}
|
||||
|
||||
// add reactions
|
||||
for _, reaction := range pr.Reactions {
|
||||
userid, ok := g.userMap[reaction.UserID]
|
||||
if !ok && tp != "" {
|
||||
var err error
|
||||
userid, err = models.GetUserIDByExternalUserID(tp, fmt.Sprintf("%v", reaction.UserID))
|
||||
if err != nil {
|
||||
log.Error("GetUserIDByExternalUserID: %v", err)
|
||||
}
|
||||
if userid > 0 {
|
||||
g.userMap[reaction.UserID] = userid
|
||||
}
|
||||
}
|
||||
var res = models.Reaction{
|
||||
Type: reaction.Content,
|
||||
CreatedUnix: timeutil.TimeStampNow(),
|
||||
}
|
||||
if userid > 0 {
|
||||
res.UserID = userid
|
||||
} else {
|
||||
res.UserID = g.doer.ID
|
||||
res.OriginalAuthorID = reaction.UserID
|
||||
res.OriginalAuthor = reaction.UserName
|
||||
}
|
||||
issue.Reactions = append(issue.Reactions, &res)
|
||||
}
|
||||
|
||||
var pullRequest = models.PullRequest{
|
||||
HeadRepoID: g.repo.ID,
|
||||
HeadBranch: head,
|
||||
|
@ -622,7 +701,6 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*models.PullR
|
|||
pullRequest.MergerID = g.doer.ID
|
||||
}
|
||||
|
||||
// TODO: reactions
|
||||
// TODO: assignees
|
||||
|
||||
return &pullRequest, nil
|
||||
|
|
|
@ -319,18 +319,6 @@ func (g *GithubDownloaderV3) GetReleases() ([]*base.Release, error) {
|
|||
return releases, nil
|
||||
}
|
||||
|
||||
func convertGithubReactions(reactions *github.Reactions) *base.Reactions {
|
||||
return &base.Reactions{
|
||||
TotalCount: *reactions.TotalCount,
|
||||
PlusOne: *reactions.PlusOne,
|
||||
MinusOne: *reactions.MinusOne,
|
||||
Laugh: *reactions.Laugh,
|
||||
Confused: *reactions.Confused,
|
||||
Heart: *reactions.Heart,
|
||||
Hooray: *reactions.Hooray,
|
||||
}
|
||||
}
|
||||
|
||||
// GetIssues returns issues according start and limit
|
||||
func (g *GithubDownloaderV3) GetIssues(page, perPage int) ([]*base.Issue, bool, error) {
|
||||
opt := &github.IssueListByRepoOptions{
|
||||
|
@ -366,15 +354,36 @@ func (g *GithubDownloaderV3) GetIssues(page, perPage int) ([]*base.Issue, bool,
|
|||
for _, l := range issue.Labels {
|
||||
labels = append(labels, convertGithubLabel(&l))
|
||||
}
|
||||
var reactions *base.Reactions
|
||||
if issue.Reactions != nil {
|
||||
reactions = convertGithubReactions(issue.Reactions)
|
||||
}
|
||||
|
||||
var email string
|
||||
if issue.User.Email != nil {
|
||||
email = *issue.User.Email
|
||||
}
|
||||
|
||||
// get reactions
|
||||
var reactions []*base.Reaction
|
||||
for i := 1; ; i++ {
|
||||
g.sleep()
|
||||
res, resp, err := g.client.Reactions.ListIssueReactions(g.ctx, g.repoOwner, g.repoName, issue.GetNumber(), &github.ListOptions{
|
||||
Page: i,
|
||||
PerPage: perPage,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
g.rate = &resp.Rate
|
||||
if len(res) == 0 {
|
||||
break
|
||||
}
|
||||
for _, reaction := range res {
|
||||
reactions = append(reactions, &base.Reaction{
|
||||
UserID: reaction.User.GetID(),
|
||||
UserName: reaction.User.GetLogin(),
|
||||
Content: reaction.GetContent(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
allIssues = append(allIssues, &base.Issue{
|
||||
Title: *issue.Title,
|
||||
Number: int64(*issue.Number),
|
||||
|
@ -418,9 +427,29 @@ func (g *GithubDownloaderV3) GetComments(issueNumber int64) ([]*base.Comment, er
|
|||
if comment.User.Email != nil {
|
||||
email = *comment.User.Email
|
||||
}
|
||||
var reactions *base.Reactions
|
||||
if comment.Reactions != nil {
|
||||
reactions = convertGithubReactions(comment.Reactions)
|
||||
|
||||
// get reactions
|
||||
var reactions []*base.Reaction
|
||||
for i := 1; ; i++ {
|
||||
g.sleep()
|
||||
res, resp, err := g.client.Reactions.ListIssueCommentReactions(g.ctx, g.repoOwner, g.repoName, comment.GetID(), &github.ListOptions{
|
||||
Page: i,
|
||||
PerPage: 100,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
g.rate = &resp.Rate
|
||||
if len(res) == 0 {
|
||||
break
|
||||
}
|
||||
for _, reaction := range res {
|
||||
reactions = append(reactions, &base.Reaction{
|
||||
UserID: reaction.User.GetID(),
|
||||
UserName: reaction.User.GetLogin(),
|
||||
Content: reaction.GetContent(),
|
||||
})
|
||||
}
|
||||
}
|
||||
allComments = append(allComments, &base.Comment{
|
||||
IssueIndex: issueNumber,
|
||||
|
@ -473,8 +502,6 @@ func (g *GithubDownloaderV3) GetPullRequests(page, perPage int) ([]*base.PullReq
|
|||
labels = append(labels, convertGithubLabel(l))
|
||||
}
|
||||
|
||||
// FIXME: This API missing reactions, we may need another extra request to get reactions
|
||||
|
||||
var email string
|
||||
if pr.User.Email != nil {
|
||||
email = *pr.User.Email
|
||||
|
@ -515,6 +542,30 @@ func (g *GithubDownloaderV3) GetPullRequests(page, perPage int) ([]*base.PullReq
|
|||
headUserName = *pr.Head.User.Login
|
||||
}
|
||||
|
||||
// get reactions
|
||||
var reactions []*base.Reaction
|
||||
for i := 1; ; i++ {
|
||||
g.sleep()
|
||||
res, resp, err := g.client.Reactions.ListIssueReactions(g.ctx, g.repoOwner, g.repoName, pr.GetNumber(), &github.ListOptions{
|
||||
Page: i,
|
||||
PerPage: perPage,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
g.rate = &resp.Rate
|
||||
if len(res) == 0 {
|
||||
break
|
||||
}
|
||||
for _, reaction := range res {
|
||||
reactions = append(reactions, &base.Reaction{
|
||||
UserID: reaction.User.GetID(),
|
||||
UserName: reaction.User.GetLogin(),
|
||||
Content: reaction.GetContent(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
allPRs = append(allPRs, &base.PullRequest{
|
||||
Title: *pr.Title,
|
||||
Number: int64(*pr.Number),
|
||||
|
@ -545,7 +596,8 @@ func (g *GithubDownloaderV3) GetPullRequests(page, perPage int) ([]*base.PullReq
|
|||
RepoName: *pr.Base.Repo.Name,
|
||||
OwnerName: *pr.Base.User.Login,
|
||||
},
|
||||
PatchURL: *pr.PatchURL,
|
||||
PatchURL: *pr.PatchURL,
|
||||
Reactions: reactions,
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -170,14 +170,12 @@ func TestGitHubDownloadRepo(t *testing.T) {
|
|||
Description: "Good for newcomers",
|
||||
},
|
||||
},
|
||||
Reactions: &base.Reactions{
|
||||
TotalCount: 1,
|
||||
PlusOne: 1,
|
||||
MinusOne: 0,
|
||||
Laugh: 0,
|
||||
Confused: 0,
|
||||
Heart: 0,
|
||||
Hooray: 0,
|
||||
Reactions: []*base.Reaction{
|
||||
{
|
||||
UserID: 1669571,
|
||||
UserName: "mrsdizzie",
|
||||
Content: "+1",
|
||||
},
|
||||
},
|
||||
Closed: &closed1,
|
||||
},
|
||||
|
@ -198,14 +196,37 @@ func TestGitHubDownloadRepo(t *testing.T) {
|
|||
Description: "This issue or pull request already exists",
|
||||
},
|
||||
},
|
||||
Reactions: &base.Reactions{
|
||||
TotalCount: 6,
|
||||
PlusOne: 1,
|
||||
MinusOne: 1,
|
||||
Laugh: 1,
|
||||
Confused: 1,
|
||||
Heart: 1,
|
||||
Hooray: 1,
|
||||
Reactions: []*base.Reaction{
|
||||
{
|
||||
UserID: 1669571,
|
||||
UserName: "mrsdizzie",
|
||||
Content: "heart",
|
||||
},
|
||||
{
|
||||
UserID: 1669571,
|
||||
UserName: "mrsdizzie",
|
||||
Content: "laugh",
|
||||
},
|
||||
{
|
||||
UserID: 1669571,
|
||||
UserName: "mrsdizzie",
|
||||
Content: "-1",
|
||||
},
|
||||
{
|
||||
UserID: 1669571,
|
||||
UserName: "mrsdizzie",
|
||||
Content: "confused",
|
||||
},
|
||||
{
|
||||
UserID: 1669571,
|
||||
UserName: "mrsdizzie",
|
||||
Content: "hooray",
|
||||
},
|
||||
{
|
||||
UserID: 1669571,
|
||||
UserName: "mrsdizzie",
|
||||
Content: "+1",
|
||||
},
|
||||
},
|
||||
Closed: &closed2,
|
||||
},
|
||||
|
@ -223,14 +244,12 @@ func TestGitHubDownloadRepo(t *testing.T) {
|
|||
Created: time.Date(2019, 11, 12, 21, 0, 13, 0, time.UTC),
|
||||
Updated: time.Date(2019, 11, 12, 21, 0, 13, 0, time.UTC),
|
||||
Content: "This is a comment",
|
||||
Reactions: &base.Reactions{
|
||||
TotalCount: 1,
|
||||
PlusOne: 1,
|
||||
MinusOne: 0,
|
||||
Laugh: 0,
|
||||
Confused: 0,
|
||||
Heart: 0,
|
||||
Hooray: 0,
|
||||
Reactions: []*base.Reaction{
|
||||
{
|
||||
UserID: 1669571,
|
||||
UserName: "mrsdizzie",
|
||||
Content: "+1",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -240,15 +259,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
|
|||
Created: time.Date(2019, 11, 12, 22, 7, 14, 0, time.UTC),
|
||||
Updated: time.Date(2019, 11, 12, 22, 7, 14, 0, time.UTC),
|
||||
Content: "A second comment",
|
||||
Reactions: &base.Reactions{
|
||||
TotalCount: 0,
|
||||
PlusOne: 0,
|
||||
MinusOne: 0,
|
||||
Laugh: 0,
|
||||
Confused: 0,
|
||||
Heart: 0,
|
||||
Hooray: 0,
|
||||
},
|
||||
Reactions: nil,
|
||||
},
|
||||
}, comments[:2])
|
||||
|
||||
|
@ -331,6 +342,18 @@ func TestGitHubDownloadRepo(t *testing.T) {
|
|||
},
|
||||
Merged: false,
|
||||
MergeCommitSHA: "565d1208f5fffdc1c5ae1a2436491eb9a5e4ebae",
|
||||
Reactions: []*base.Reaction{
|
||||
{
|
||||
UserID: 81045,
|
||||
UserName: "lunny",
|
||||
Content: "heart",
|
||||
},
|
||||
{
|
||||
UserID: 81045,
|
||||
UserName: "lunny",
|
||||
Content: "+1",
|
||||
},
|
||||
},
|
||||
},
|
||||
}, prs)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue