From ce2c4ed9ac7b588e73969febd1695dadb693fd7b Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 22 Dec 2019 23:18:36 +0800 Subject: [PATCH 01/17] fix typo --- modules/migrations/migrate.go | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/migrations/migrate.go b/modules/migrations/migrate.go index fb143f7e29e94..4db43a1f2eea0 100644 --- a/modules/migrations/migrate.go +++ b/modules/migrations/migrate.go @@ -248,6 +248,7 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts continue } + // plain comments var allComments = make([]*base.Comment, 0, commentBatchSize) for _, pr := range prs { comments, err := downloader.GetComments(pr.Number) From 8ae3e2dc8f5e99a6b064c70800e344b29b0ec66f Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 22 Dec 2019 23:22:31 +0800 Subject: [PATCH 02/17] fix lint --- modules/migrations/git.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/migrations/git.go b/modules/migrations/git.go index f7b1e857e48a0..af345808b56b7 100644 --- a/modules/migrations/git.go +++ b/modules/migrations/git.go @@ -78,3 +78,8 @@ func (g *PlainGitDownloader) GetComments(issueNumber int64) ([]*base.Comment, er func (g *PlainGitDownloader) GetPullRequests(start, limit int) ([]*base.PullRequest, error) { return nil, ErrNotSupported } + +// GetReviews returns reviews according issue number +func (g *PlainGitDownloader) GetReviews(issueNumber int64) ([]*base.Review, error) { + return nil, ErrNotSupported +} From 2263c5a37177a1e041e7f3e9bd6bf595e98a27ab Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 22 Dec 2019 23:01:43 +0800 Subject: [PATCH 03/17] Migrate reviews when migrating repository from github --- models/migrations/migrations.go | 2 + models/migrations/v125.go | 23 ++++++ models/review.go | 51 ++++++++++-- modules/migrations/base/downloader.go | 1 + modules/migrations/base/review.go | 35 ++++++++ modules/migrations/base/uploader.go | 1 + modules/migrations/gitea.go | 111 ++++++++++++++++++++++++++ modules/migrations/github.go | 74 +++++++++++++++++ modules/migrations/migrate.go | 30 ++++++- 9 files changed, 319 insertions(+), 9 deletions(-) create mode 100644 models/migrations/v125.go create mode 100644 modules/migrations/base/review.go diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 226368b7f36fa..286e809abb232 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -304,6 +304,8 @@ var migrations = []Migration{ NewMigration("Add original informations for reactions", addReactionOriginals), // v124 -> v125 NewMigration("Add columns to user and repository", addUserRepoMissingColumns), + // v125 -> v126 + NewMigration("Add some columns on review for migration", addReviewMigrateInfo), } // Migrate database to current version diff --git a/models/migrations/v125.go b/models/migrations/v125.go new file mode 100644 index 0000000000000..ac567f66b94f1 --- /dev/null +++ b/models/migrations/v125.go @@ -0,0 +1,23 @@ +// 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 migrations + +import ( + "fmt" + + "xorm.io/xorm" +) + +func addReviewMigrateInfo(x *xorm.Engine) error { + type Review struct { + OriginalAuthor string + OriginalAuthorID int64 + } + + if err := x.Sync2(new(Review)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + return nil +} diff --git a/models/review.go b/models/review.go index 2838cfa316033..cd76e9c6c8143 100644 --- a/models/review.go +++ b/models/review.go @@ -45,13 +45,15 @@ func (rt ReviewType) Icon() string { // Review represents collection of code comments giving feedback for a PR type Review struct { - ID int64 `xorm:"pk autoincr"` - Type ReviewType - Reviewer *User `xorm:"-"` - ReviewerID int64 `xorm:"index"` - Issue *Issue `xorm:"-"` - IssueID int64 `xorm:"index"` - Content string `xorm:"TEXT"` + ID int64 `xorm:"pk autoincr"` + Type ReviewType + Reviewer *User `xorm:"-"` + ReviewerID int64 `xorm:"index"` + OriginalAuthor string + OriginalAuthorID int64 + Issue *Issue `xorm:"-"` + IssueID int64 `xorm:"index"` + Content string `xorm:"TEXT"` // Official is a review made by an assigned approver (counts towards approval) Official bool `xorm:"NOT NULL DEFAULT false"` CommitID string `xorm:"VARCHAR(40)"` @@ -62,6 +64,8 @@ type Review struct { // CodeComments are the initial code comments of the review CodeComments CodeComments `xorm:"-"` + + Comments []*Comment `xorm:"-"` } func (r *Review) loadCodeComments(e Engine) (err error) { @@ -398,3 +402,36 @@ func MarkReviewsAsNotStale(issueID int64, commitID string) (err error) { return } + +// InsertReviews inserts review and review comments +func InsertReviews(reviews []*Review) error { + sess := x.NewSession() + defer sess.Close() + + if err := sess.Begin(); err != nil { + return err + } + + for _, review := range reviews { + if _, err := sess.NoAutoTime().Insert(review); err != nil { + return err + } + + for _, c := range review.Comments { + c.ReviewID = review.ID + } + } + + if err := sess.Commit(); err != nil { + return err + } + sess.Close() + + for _, review := range reviews { + if _, err := x.NoAutoTime().Insert(review.Comments); err != nil { + return err + } + } + + return nil +} diff --git a/modules/migrations/base/downloader.go b/modules/migrations/base/downloader.go index 87ade5c02e9e3..5de8c9513b2ec 100644 --- a/modules/migrations/base/downloader.go +++ b/modules/migrations/base/downloader.go @@ -23,6 +23,7 @@ type Downloader interface { GetIssues(page, perPage int) ([]*Issue, bool, error) GetComments(issueNumber int64) ([]*Comment, error) GetPullRequests(page, perPage int) ([]*PullRequest, error) + GetReviews(pullRequestNumber int64) ([]*Review, error) } // DownloaderFactory defines an interface to match a downloader implementation and create a downloader diff --git a/modules/migrations/base/review.go b/modules/migrations/base/review.go new file mode 100644 index 0000000000000..72df5da8fa5f9 --- /dev/null +++ b/modules/migrations/base/review.go @@ -0,0 +1,35 @@ +// Copyright 2019 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 + +import "time" + +// Review is a standard review information +type Review struct { + ID int64 + IssueIndex int64 + ReviewerID int64 + ReviewerName string + Official bool + CommitID string + Content string + CreatedAt time.Time + State string // PENDING, APPROVE, REQUEST_CHANGES, or COMMENT + Comments []*ReviewComment +} + +// ReviewComment represents a review comment +type ReviewComment struct { + ID int64 + InReplyTo int64 + Content string + TreePath string + Position int + CommitID string + PosterID int64 + Reactions *Reactions + CreatedAt time.Time + UpdatedAt time.Time +} diff --git a/modules/migrations/base/uploader.go b/modules/migrations/base/uploader.go index 257c7a2909d5a..85ad60fe0e5aa 100644 --- a/modules/migrations/base/uploader.go +++ b/modules/migrations/base/uploader.go @@ -17,6 +17,7 @@ type Uploader interface { CreateIssues(issues ...*Issue) error CreateComments(comments ...*Comment) error CreatePullRequests(prs ...*PullRequest) error + CreateReviews(reviews ...*Review) error Rollback() error Close() } diff --git a/modules/migrations/gitea.go b/modules/migrations/gitea.go index 82664d0d1a30f..43c89bcb0eafe 100644 --- a/modules/migrations/gitea.go +++ b/modules/migrations/gitea.go @@ -6,6 +6,7 @@ package migrations import ( + "bytes" "context" "fmt" "io" @@ -27,6 +28,7 @@ import ( "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/services/gitdiff" gouuid "github.com/satori/go.uuid" ) @@ -706,6 +708,115 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*models.PullR return &pullRequest, nil } +func convertReviewState(state string) models.ReviewType { + switch state { + case "PENDING": + return models.ReviewTypePending + case "APPROVE": + return models.ReviewTypeApprove + case "REQUEST_CHANGES": + return models.ReviewTypeReject + case "COMMENT": + return models.ReviewTypeComment + default: + return models.ReviewTypePending + } +} + +// CreateReviews create pull request reviews +func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error { + var cms = make([]*models.Review, 0, len(reviews)) + for _, review := range reviews { + var issueID int64 + if issueIDStr, ok := g.issues.Load(review.IssueIndex); !ok { + issue, err := models.GetIssueByIndex(g.repo.ID, review.IssueIndex) + if err != nil { + return err + } + issueID = issue.ID + g.issues.Store(review.IssueIndex, issueID) + } else { + issueID = issueIDStr.(int64) + } + + userid, ok := g.userMap[review.ReviewerID] + tp := g.gitServiceType.Name() + if !ok && tp != "" { + var err error + userid, err = models.GetUserIDByExternalUserID(tp, fmt.Sprintf("%v", review.ReviewerID)) + if err != nil { + log.Error("GetUserIDByExternalUserID: %v", err) + } + if userid > 0 { + g.userMap[review.ReviewerID] = userid + } + } + + var cm = models.Review{ + Type: convertReviewState(review.State), + IssueID: issueID, + Content: review.Content, + Official: review.Official, + CreatedUnix: timeutil.TimeStamp(review.CreatedAt.Unix()), + UpdatedUnix: timeutil.TimeStamp(review.CreatedAt.Unix()), + } + + if userid > 0 { + cm.ReviewerID = userid + } else { + cm.ReviewerID = g.doer.ID + cm.OriginalAuthor = review.ReviewerName + cm.OriginalAuthorID = review.ReviewerID + } + + // TODO: cache pr + pr, err := models.GetPullRequestByID(issueID) + if err != nil { + return err + } + + for _, comment := range review.Comments { + headCommitID, err := g.gitRepo.GetRefCommitID(pr.GetGitRefName()) + if err != nil { + return fmt.Errorf("GetRefCommitID[%s]: %v", pr.GetGitRefName(), err) + } + patchBuf := new(bytes.Buffer) + if err := gitdiff.GetRawDiffForFile(g.gitRepo.Path, pr.MergeBase, headCommitID, gitdiff.RawDiffNormal, comment.TreePath, patchBuf); err != nil { + return fmt.Errorf("GetRawDiffForLine[%s, %s, %s, %s]: %v", err, g.gitRepo.Path, pr.MergeBase, headCommitID, comment.TreePath) + } + line := int64(comment.Position) + patch := gitdiff.CutDiffAroundLine(patchBuf, int64((&models.Comment{Line: line}).UnsignedLine()), line < 0, setting.UI.CodeCommentLines) + + var c = models.Comment{ + Type: models.CommentTypeCode, + PosterID: comment.PosterID, + IssueID: issueID, + Content: comment.Content, + Line: line, + TreePath: comment.TreePath, + CommitSHA: comment.CommitID, + Patch: patch, + } + + if userid > 0 { + c.PosterID = userid + } else { + c.PosterID = g.doer.ID + c.OriginalAuthor = review.ReviewerName + c.OriginalAuthorID = review.ReviewerID + } + + cm.Comments = append(cm.Comments, &c) + } + + cms = append(cms, &cm) + + // TODO: Reactions + } + + return models.InsertReviews(cms) +} + // Rollback when migrating failed, this will rollback all the changes. func (g *GiteaLocalUploader) Rollback() error { if g.repo != nil && g.repo.ID > 0 { diff --git a/modules/migrations/github.go b/modules/migrations/github.go index a99b05e11cc64..9c7c9a8d5da66 100644 --- a/modules/migrations/github.go +++ b/modules/migrations/github.go @@ -614,3 +614,77 @@ func (g *GithubDownloaderV3) GetPullRequests(page, perPage int) ([]*base.PullReq return allPRs, nil } + +func convertGithubReview(r *github.PullRequestReview) *base.Review { + return &base.Review{ + ID: r.GetID(), + ReviewerID: r.GetUser().GetID(), + ReviewerName: r.GetUser().GetLogin(), + CommitID: r.GetCommitID(), + Content: r.GetBody(), + CreatedAt: r.GetSubmittedAt(), + State: r.GetState(), + } +} + +func convertGithubReviewComments(cs []*github.PullRequestComment) []*base.ReviewComment { + var rcs = make([]*base.ReviewComment, 0, len(cs)) + for _, c := range cs { + rcs = append(rcs, &base.ReviewComment{ + ID: c.GetID(), + InReplyTo: c.GetInReplyTo(), + Content: c.GetBody(), + TreePath: c.GetPath(), + Position: c.GetPosition(), + CommitID: c.GetCommitID(), + PosterID: c.GetUser().GetID(), + Reactions: convertGithubReactions(c.Reactions), + CreatedAt: c.GetCreatedAt(), + UpdatedAt: c.GetUpdatedAt(), + }) + } + return rcs +} + +// GetReviews returns pull requests review +func (g *GithubDownloaderV3) GetReviews(pullRequestNumber int64) ([]*base.Review, error) { + var allReviews = make([]*base.Review, 0, 100) + opt := &github.ListOptions{ + PerPage: 100, + } + for { + g.sleep() + reviews, resp, err := g.client.PullRequests.ListReviews(g.ctx, g.repoOwner, g.repoName, int(pullRequestNumber), opt) + if err != nil { + return nil, fmt.Errorf("error while listing repos: %v", err) + } + g.rate = &resp.Rate + for _, review := range reviews { + r := convertGithubReview(review) + r.IssueIndex = pullRequestNumber + // retrieve all review comments + opt2 := &github.ListOptions{ + PerPage: 100, + } + for { + g.sleep() + reviewComments, resp, err := g.client.PullRequests.ListReviewComments(g.ctx, g.repoOwner, g.repoName, int(pullRequestNumber), review.GetID(), opt2) + if err != nil { + return nil, fmt.Errorf("error while listing repos: %v", err) + } + g.rate = &resp.Rate + r.Comments = append(r.Comments, convertGithubReviewComments(reviewComments)...) + if resp.NextPage == 0 { + break + } + opt2.Page = resp.NextPage + } + allReviews = append(allReviews, r) + } + if resp.NextPage == 0 { + break + } + opt.Page = resp.NextPage + } + return allReviews, nil +} diff --git a/modules/migrations/migrate.go b/modules/migrations/migrate.go index 4db43a1f2eea0..664efc9163316 100644 --- a/modules/migrations/migrate.go +++ b/modules/migrations/migrate.go @@ -181,7 +181,10 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts } } - var commentBatchSize = uploader.MaxBatchInsertSize("comment") + var ( + commentBatchSize = uploader.MaxBatchInsertSize("comment") + reviewBatchSize = uploader.MaxBatchInsertSize("review") + ) if opts.Issues { log.Trace("migrating issues and comments") @@ -248,7 +251,7 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts continue } - // plain comments + // plain commentes var allComments = make([]*base.Comment, 0, commentBatchSize) for _, pr := range prs { comments, err := downloader.GetComments(pr.Number) @@ -271,6 +274,29 @@ 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) + if err != nil { + return err + } + + allReviews = append(allReviews, reviews...) + + if len(allReviews) >= reviewBatchSize { + if err := uploader.CreateReviews(allReviews[:reviewBatchSize]...); err != nil { + return err + } + allReviews = allReviews[reviewBatchSize:] + } + } + if len(allReviews) > 0 { + if err := uploader.CreateReviews(allReviews...); err != nil { + return err + } + } + if len(prs) < prBatchSize { break } From abe4e22f23867ce153509a8c09a0bc1b1fbec024 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 4 Jan 2020 14:26:39 +0800 Subject: [PATCH 04/17] Added test and migration when external user login --- models/external_login_user.go | 5 ++- models/migrate.go | 27 +++++++++++- modules/migrations/base/review.go | 10 ++++- modules/migrations/gitea.go | 22 ++++++---- modules/migrations/github_test.go | 69 +++++++++++++++++++++++++++++++ 5 files changed, 122 insertions(+), 11 deletions(-) diff --git a/models/external_login_user.go b/models/external_login_user.go index 6585e49fef5db..ff153dfb86789 100644 --- a/models/external_login_user.go +++ b/models/external_login_user.go @@ -181,5 +181,8 @@ func UpdateMigrationsByType(tp structs.GitServiceType, externalUserID string, us return err } - return UpdateReactionsMigrationsByType(tp, externalUserID, userID) + if err := UpdateReactionsMigrationsByType(tp, externalUserID, userID); err != nil { + return err + } + return UpdateReviewsMigrationsByType(tp, externalUserID, userID) } diff --git a/models/migrate.go b/models/migrate.go index fd28fd156fb79..67791b4c9e653 100644 --- a/models/migrate.go +++ b/models/migrate.go @@ -4,7 +4,12 @@ package models -import "xorm.io/xorm" +import ( + "code.gitea.io/gitea/modules/structs" + + "xorm.io/builder" + "xorm.io/xorm" +) // InsertMilestones creates milestones of repository. func InsertMilestones(ms ...*Milestone) (err error) { @@ -202,3 +207,23 @@ func InsertReleases(rels ...*Release) error { return sess.Commit() } + +// UpdateReviewsMigrationsByType updates reivews' migrations information via given git service type and original id and poster id +func UpdateReviewsMigrationsByType(tp structs.GitServiceType, originalAuthorID string, posterID int64) error { + _, err := x.Table("review"). + Where(builder.In("issue_id", + builder.Select("issue.id"). + From("issue"). + InnerJoin("repository", "issue.repo_id = repository.id"). + Where(builder.Eq{ + "repository.original_service_type": tp, + }), + )). + And("review.original_author_id = ?", originalAuthorID). + Update(map[string]interface{}{ + "poster_id": posterID, + "original_author": "", + "original_author_id": 0, + }) + return err +} diff --git a/modules/migrations/base/review.go b/modules/migrations/base/review.go index 72df5da8fa5f9..9dbca067e6803 100644 --- a/modules/migrations/base/review.go +++ b/modules/migrations/base/review.go @@ -6,6 +6,14 @@ package base import "time" +// enumerate all review states +const ( + ReviewStatePending = "PENDING" + ReviewStateApproved = "APPROVED" + ReviewStateRequestChanges = "REQUEST_CHANGES" + ReviewStateComment = "COMMENT" +) + // Review is a standard review information type Review struct { ID int64 @@ -16,7 +24,7 @@ type Review struct { CommitID string Content string CreatedAt time.Time - State string // PENDING, APPROVE, REQUEST_CHANGES, or COMMENT + State string // PENDING, APPROVED, REQUEST_CHANGES, or COMMENT Comments []*ReviewComment } diff --git a/modules/migrations/gitea.go b/modules/migrations/gitea.go index 43c89bcb0eafe..072b3d59e4cc6 100644 --- a/modules/migrations/gitea.go +++ b/modules/migrations/gitea.go @@ -50,6 +50,7 @@ type GiteaLocalUploader struct { gitRepo *git.Repository prHeadCache map[string]struct{} userMap map[int64]int64 // external user id mapping to user id + prCache map[int64]*models.PullRequest gitServiceType structs.GitServiceType } @@ -62,6 +63,7 @@ func NewGiteaLocalUploader(ctx context.Context, doer *models.User, repoOwner, re repoName: repoName, prHeadCache: make(map[string]struct{}), userMap: make(map[int64]int64), + prCache: make(map[int64]*models.PullRequest), } } @@ -710,13 +712,13 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*models.PullR func convertReviewState(state string) models.ReviewType { switch state { - case "PENDING": + case base.ReviewStatePending: return models.ReviewTypePending - case "APPROVE": + case base.ReviewStateApproved: return models.ReviewTypeApprove - case "REQUEST_CHANGES": + case base.ReviewStateRequestChanges: return models.ReviewTypeReject - case "COMMENT": + case base.ReviewStateComment: return models.ReviewTypeComment default: return models.ReviewTypePending @@ -769,10 +771,14 @@ func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error { cm.OriginalAuthorID = review.ReviewerID } - // TODO: cache pr - pr, err := models.GetPullRequestByID(issueID) - if err != nil { - return err + // get pr + pr, ok := g.prCache[issueID] + if !ok { + pr, err := models.GetPullRequestByID(issueID) + if err != nil { + return err + } + g.prCache[issueID] = pr } for _, comment := range review.Comments { diff --git a/modules/migrations/github_test.go b/modules/migrations/github_test.go index 9023e2ac4dd1b..5b99b5368da7d 100644 --- a/modules/migrations/github_test.go +++ b/modules/migrations/github_test.go @@ -361,4 +361,73 @@ func TestGitHubDownloadRepo(t *testing.T) { }, }, }, prs) + + reviews, err := downloader.GetReviews(3) + assert.NoError(t, err) + assert.EqualValues(t, []*base.Review{ + { + ID: 315859956, + IssueIndex: 3, + ReviewerID: 42128690, + ReviewerName: "jolheiser", + CommitID: "076160cf0b039f13e5eff19619932d181269414b", + CreatedAt: time.Date(2019, 11, 12, 21, 35, 24, 0, time.UTC), + State: base.ReviewStateApproved, + }, + { + ID: 315860062, + IssueIndex: 3, + ReviewerID: 1824502, + ReviewerName: "zeripath", + CommitID: "076160cf0b039f13e5eff19619932d181269414b", + CreatedAt: time.Date(2019, 11, 12, 21, 35, 36, 0, time.UTC), + State: base.ReviewStateApproved, + }, + { + ID: 315861440, + IssueIndex: 3, + ReviewerID: 165205, + ReviewerName: "lafriks", + CommitID: "076160cf0b039f13e5eff19619932d181269414b", + CreatedAt: time.Date(2019, 11, 12, 21, 38, 00, 0, time.UTC), + State: base.ReviewStateApproved, + }, + }, reviews) + + reviews, err = downloader.GetReviews(4) + assert.NoError(t, err) + assert.EqualValues(t, []*base.Review{ + { + ID: 338338740, + IssueIndex: 4, + ReviewerID: 81045, + ReviewerName: "lunny", + CommitID: "2be9101c543658591222acbee3eb799edfc3853d", + CreatedAt: time.Date(2020, 01, 04, 05, 33, 18, 0, time.UTC), + State: base.ReviewStateApproved, + Comments: []*base.ReviewComment{ + { + ID: 363017488, + Content: "This is a good pull request.", + TreePath: "README.md", + Position: 3, + CommitID: "2be9101c543658591222acbee3eb799edfc3853d", + PosterID: 81045, + Reactions: &base.Reactions{}, + CreatedAt: time.Date(2020, 01, 04, 05, 33, 06, 0, time.UTC), + UpdatedAt: time.Date(2020, 01, 04, 05, 33, 18, 0, time.UTC), + }, + }, + }, + { + ID: 338338740, + IssueIndex: 4, + ReviewerID: 81045, + ReviewerName: "lunny", + CommitID: "2be9101c543658591222acbee3eb799edfc3853d", + CreatedAt: time.Date(2020, 01, 04, 05, 33, 18, 0, time.UTC), + State: base.ReviewStateRequestChanges, + Content: "Don't add more reviews", + }, + }, reviews) } From d2000810a3577b1ca58308474a8476b662823d2c Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 4 Jan 2020 14:43:01 +0800 Subject: [PATCH 05/17] fix test --- modules/migrations/base/review.go | 2 +- modules/migrations/github_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/migrations/base/review.go b/modules/migrations/base/review.go index 9dbca067e6803..215c8201e7dbd 100644 --- a/modules/migrations/base/review.go +++ b/modules/migrations/base/review.go @@ -10,7 +10,7 @@ import "time" const ( ReviewStatePending = "PENDING" ReviewStateApproved = "APPROVED" - ReviewStateRequestChanges = "REQUEST_CHANGES" + ReviewStateRequestChanges = "CHANGES_REQUESTED" ReviewStateComment = "COMMENT" ) diff --git a/modules/migrations/github_test.go b/modules/migrations/github_test.go index 5b99b5368da7d..da8a69a8bdf55 100644 --- a/modules/migrations/github_test.go +++ b/modules/migrations/github_test.go @@ -420,12 +420,12 @@ func TestGitHubDownloadRepo(t *testing.T) { }, }, { - ID: 338338740, + ID: 338339651, IssueIndex: 4, ReviewerID: 81045, ReviewerName: "lunny", CommitID: "2be9101c543658591222acbee3eb799edfc3853d", - CreatedAt: time.Date(2020, 01, 04, 05, 33, 18, 0, time.UTC), + CreatedAt: time.Date(2020, 01, 04, 06, 07, 06, 0, time.UTC), State: base.ReviewStateRequestChanges, Content: "Don't add more reviews", }, From beea95e5d095f5cc924a117c08d3dfb42495fcfc Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 4 Jan 2020 19:30:28 +0800 Subject: [PATCH 06/17] fix commented state --- modules/migrations/base/review.go | 8 ++++---- modules/migrations/gitea.go | 4 ++-- modules/migrations/github_test.go | 24 +++++++++++++++++++++++- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/modules/migrations/base/review.go b/modules/migrations/base/review.go index 215c8201e7dbd..1d0c9e5667fdc 100644 --- a/modules/migrations/base/review.go +++ b/modules/migrations/base/review.go @@ -8,10 +8,10 @@ import "time" // enumerate all review states const ( - ReviewStatePending = "PENDING" - ReviewStateApproved = "APPROVED" - ReviewStateRequestChanges = "CHANGES_REQUESTED" - ReviewStateComment = "COMMENT" + ReviewStatePending = "PENDING" + ReviewStateApproved = "APPROVED" + ReviewStateChangesRequested = "CHANGES_REQUESTED" + ReviewStateCommented = "COMMENTED" ) // Review is a standard review information diff --git a/modules/migrations/gitea.go b/modules/migrations/gitea.go index 072b3d59e4cc6..9fbb06030b5e0 100644 --- a/modules/migrations/gitea.go +++ b/modules/migrations/gitea.go @@ -716,9 +716,9 @@ func convertReviewState(state string) models.ReviewType { return models.ReviewTypePending case base.ReviewStateApproved: return models.ReviewTypeApprove - case base.ReviewStateRequestChanges: + case base.ReviewStateChangesRequested: return models.ReviewTypeReject - case base.ReviewStateComment: + case base.ReviewStateCommented: return models.ReviewTypeComment default: return models.ReviewTypePending diff --git a/modules/migrations/github_test.go b/modules/migrations/github_test.go index da8a69a8bdf55..0e79cdd45c2e9 100644 --- a/modules/migrations/github_test.go +++ b/modules/migrations/github_test.go @@ -426,8 +426,30 @@ func TestGitHubDownloadRepo(t *testing.T) { ReviewerName: "lunny", CommitID: "2be9101c543658591222acbee3eb799edfc3853d", CreatedAt: time.Date(2020, 01, 04, 06, 07, 06, 0, time.UTC), - State: base.ReviewStateRequestChanges, + State: base.ReviewStateChangesRequested, Content: "Don't add more reviews", }, + { + ID: 338349019, + IssueIndex: 4, + ReviewerID: 81045, + ReviewerName: "lunny", + CommitID: "2be9101c543658591222acbee3eb799edfc3853d", + CreatedAt: time.Date(2020, 01, 04, 11, 21, 41, 0, time.UTC), + State: base.ReviewStateCommented, + Comments: []*base.ReviewComment{ + { + ID: 363029944, + Content: "test a single comment.", + TreePath: "LICENSE", + Position: 4, + CommitID: "2be9101c543658591222acbee3eb799edfc3853d", + PosterID: 81045, + Reactions: &base.Reactions{}, + CreatedAt: time.Date(2020, 01, 04, 11, 21, 41, 0, time.UTC), + UpdatedAt: time.Date(2020, 01, 04, 11, 21, 41, 0, time.UTC), + }, + }, + }, }, reviews) } From 9824001723988f328194df709c1d88222be3fa53 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 4 Jan 2020 21:24:54 +0800 Subject: [PATCH 07/17] Some improvements --- models/migrations/v118.go | 2 +- models/review.go | 11 ++--------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/models/migrations/v118.go b/models/migrations/v118.go index c79cbb8ae3bb5..1ca82f76d98d4 100644 --- a/models/migrations/v118.go +++ b/models/migrations/v118.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Gitea Authors. 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. diff --git a/models/review.go b/models/review.go index cd76e9c6c8143..d3a5af17f00e6 100644 --- a/models/review.go +++ b/models/review.go @@ -420,18 +420,11 @@ func InsertReviews(reviews []*Review) error { for _, c := range review.Comments { c.ReviewID = review.ID } - } - if err := sess.Commit(); err != nil { - return err - } - sess.Close() - - for _, review := range reviews { - if _, err := x.NoAutoTime().Insert(review.Comments); err != nil { + if _, err := sess.NoAutoTime().Insert(review.Comments); err != nil { return err } } - return nil + return sess.Commit() } From e7ff3be9897f1fad789db22cd4668345e191533d Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 5 Jan 2020 11:15:33 +0800 Subject: [PATCH 08/17] fix bug when get pull request and ref original author on code comments --- modules/migrations/gitea.go | 21 ++++++++++++--------- templates/repo/diff/comments.tmpl | 18 ++++++++++++++---- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/modules/migrations/gitea.go b/modules/migrations/gitea.go index 9fbb06030b5e0..bd72f302d36f9 100644 --- a/modules/migrations/gitea.go +++ b/modules/migrations/gitea.go @@ -774,7 +774,8 @@ func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error { // get pr pr, ok := g.prCache[issueID] if !ok { - pr, err := models.GetPullRequestByID(issueID) + var err error + pr, err = models.GetPullRequestByIssueID(issueID) if err != nil { return err } @@ -794,14 +795,16 @@ func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error { patch := gitdiff.CutDiffAroundLine(patchBuf, int64((&models.Comment{Line: line}).UnsignedLine()), line < 0, setting.UI.CodeCommentLines) var c = models.Comment{ - Type: models.CommentTypeCode, - PosterID: comment.PosterID, - IssueID: issueID, - Content: comment.Content, - Line: line, - TreePath: comment.TreePath, - CommitSHA: comment.CommitID, - Patch: patch, + Type: models.CommentTypeCode, + PosterID: comment.PosterID, + IssueID: issueID, + Content: comment.Content, + Line: line, + TreePath: comment.TreePath, + CommitSHA: comment.CommitID, + Patch: patch, + CreatedUnix: timeutil.TimeStamp(comment.CreatedAt.Unix()), + UpdatedUnix: timeutil.TimeStamp(comment.UpdatedAt.Unix()), } if userid > 0 { diff --git a/templates/repo/diff/comments.tmpl b/templates/repo/diff/comments.tmpl index 64080f990f4cb..f5b8d8042dea3 100644 --- a/templates/repo/diff/comments.tmpl +++ b/templates/repo/diff/comments.tmpl @@ -2,12 +2,22 @@ {{ $createdStr:= TimeSinceUnix .CreatedUnix $.root.Lang }}
- - - + {{if .OriginalAuthor }} + + {{else}} + + + + {{end}}
- {{.Poster.GetDisplayName}} {{$.root.i18n.Tr "repo.issues.commented_at" .HashTag $createdStr | Safe}} + + {{if .OriginalAuthor }} + {{ .OriginalAuthor }} {{$.root.i18n.Tr "repo.issues.commented_at" .HashTag $createdStr | Safe}} {{if $.root.Repository.OriginalURL}} ({{$.root.i18n.Tr "repo.migrated_from" $.root.Repository.OriginalURL $.root.Repository.GetOriginalURLHostname | Safe }}){{end}} + {{else}} + {{.Poster.GetDisplayName}} {{$.root.i18n.Tr "repo.issues.commented_at" .HashTag $createdStr | Safe}} + {{end}} +
{{if and .Review}} {{if eq .Review.Type 0}} From 6a1e7d41b4b389bd7db2ece5cb235635d34804a8 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 10 Jan 2020 10:58:00 +0800 Subject: [PATCH 09/17] Fix migrated line; Added comment for review --- models/review.go | 14 +++++++++++ modules/migrations/base/review.go | 1 + modules/migrations/gitea.go | 10 ++++---- modules/migrations/github.go | 11 ++++++--- services/gitdiff/gitdiff.go | 23 ++++++++++--------- services/gitdiff/gitdiff_test.go | 8 +++++++ .../repo/issue/view_content/comments.tmpl | 17 ++++++++++---- 7 files changed, 62 insertions(+), 22 deletions(-) diff --git a/models/review.go b/models/review.go index d3a5af17f00e6..ec28b41d35db4 100644 --- a/models/review.go +++ b/models/review.go @@ -417,6 +417,20 @@ func InsertReviews(reviews []*Review) error { return err } + if _, err := sess.NoAutoTime().Insert(&Comment{ + Type: CommentTypeReview, + Content: review.Content, + PosterID: review.ReviewerID, + OriginalAuthor: review.OriginalAuthor, + OriginalAuthorID: review.OriginalAuthorID, + IssueID: review.IssueID, + ReviewID: review.ID, + CreatedUnix: review.CreatedUnix, + UpdatedUnix: review.UpdatedUnix, + }); err != nil { + return err + } + for _, c := range review.Comments { c.ReviewID = review.ID } diff --git a/modules/migrations/base/review.go b/modules/migrations/base/review.go index 1d0c9e5667fdc..c69fc6b59a3bf 100644 --- a/modules/migrations/base/review.go +++ b/modules/migrations/base/review.go @@ -34,6 +34,7 @@ type ReviewComment struct { InReplyTo int64 Content string TreePath string + DiffHunk string Position int CommitID string PosterID int64 diff --git a/modules/migrations/gitea.go b/modules/migrations/gitea.go index bd72f302d36f9..2b83a716e0d82 100644 --- a/modules/migrations/gitea.go +++ b/modules/migrations/gitea.go @@ -789,17 +789,19 @@ func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error { } patchBuf := new(bytes.Buffer) if err := gitdiff.GetRawDiffForFile(g.gitRepo.Path, pr.MergeBase, headCommitID, gitdiff.RawDiffNormal, comment.TreePath, patchBuf); err != nil { - return fmt.Errorf("GetRawDiffForLine[%s, %s, %s, %s]: %v", err, g.gitRepo.Path, pr.MergeBase, headCommitID, comment.TreePath) + return fmt.Errorf("GetRawDiffForLine[%s, %s, %s, %s]: %v", g.gitRepo.Path, pr.MergeBase, headCommitID, comment.TreePath, err) } - line := int64(comment.Position) - patch := gitdiff.CutDiffAroundLine(patchBuf, int64((&models.Comment{Line: line}).UnsignedLine()), line < 0, setting.UI.CodeCommentLines) + + _, _, line, _ := gitdiff.ParseDiffHunkString(comment.DiffHunk) + + patch := gitdiff.CutDiffAroundLine(patchBuf, int64((&models.Comment{Line: int64(line + comment.Position - 1)}).UnsignedLine()), line < 0, setting.UI.CodeCommentLines) var c = models.Comment{ Type: models.CommentTypeCode, PosterID: comment.PosterID, IssueID: issueID, Content: comment.Content, - Line: line, + Line: int64(line + comment.Position - 1), TreePath: comment.TreePath, CommitSHA: comment.CommitID, Patch: patch, diff --git a/modules/migrations/github.go b/modules/migrations/github.go index 9c7c9a8d5da66..221070dab7261 100644 --- a/modules/migrations/github.go +++ b/modules/migrations/github.go @@ -418,10 +418,14 @@ func (g *GithubDownloaderV3) GetIssues(page, perPage int) ([]*base.Issue, bool, // GetComments returns comments according issueNumber func (g *GithubDownloaderV3) GetComments(issueNumber int64) ([]*base.Comment, error) { - var allComments = make([]*base.Comment, 0, 100) + var ( + allComments = make([]*base.Comment, 0, 100) + created = "created" + asc = "asc" + ) opt := &github.IssueListCommentsOptions{ - Sort: "created", - Direction: "asc", + Sort: created, + Direction: asc, ListOptions: github.ListOptions{ PerPage: 100, }, @@ -635,6 +639,7 @@ func convertGithubReviewComments(cs []*github.PullRequestComment) []*base.Review InReplyTo: c.GetInReplyTo(), Content: c.GetBody(), TreePath: c.GetPath(), + DiffHunk: c.GetDiffHunk(), Position: c.GetPosition(), CommitID: c.GetCommitID(), PosterID: c.GetUser().GetID(), diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index fc55c035957a0..6632f2d94edef 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -149,14 +149,9 @@ func (d *DiffLine) GetExpandDirection() DiffLineExpandDirection { return DiffLineExpandSingle } -func getDiffLineSectionInfo(curFile *DiffFile, line string, lastLeftIdx, lastRightIdx int) *DiffLineSectionInfo { - var ( - leftLine int - leftHunk int - rightLine int - righHunk int - ) - ss := strings.Split(line, "@@") +// ParseDiffHunkString parse the diffhunk content and return +func ParseDiffHunkString(diffhunk string) (leftLine, leftHunk, rightLine, righHunk int) { + ss := strings.Split(diffhunk, "@@") ranges := strings.Split(ss[1][1:], " ") leftRange := strings.Split(ranges[0], ",") leftLine, _ = com.StrTo(leftRange[0][1:]).Int() @@ -170,12 +165,18 @@ func getDiffLineSectionInfo(curFile *DiffFile, line string, lastLeftIdx, lastRig righHunk, _ = com.StrTo(rightRange[1]).Int() } } else { - log.Warn("Parse line number failed: %v", line) + log.Warn("Parse line number failed: %v", diffhunk) rightLine = leftLine righHunk = leftHunk } + return +} + +func getDiffLineSectionInfo(treePath, line string, lastLeftIdx, lastRightIdx int) *DiffLineSectionInfo { + leftLine, leftHunk, rightLine, righHunk := ParseDiffHunkString(line) + return &DiffLineSectionInfo{ - Path: curFile.Name, + Path: treePath, LastLeftIdx: lastLeftIdx, LastRightIdx: lastRightIdx, LeftIdx: leftLine, @@ -651,7 +652,7 @@ func ParsePatch(maxLines, maxLineCharacters, maxFiles int, reader io.Reader) (*D case line[0] == '@': curSection = &DiffSection{} curFile.Sections = append(curFile.Sections, curSection) - lineSectionInfo := getDiffLineSectionInfo(curFile, line, leftLine-1, rightLine-1) + lineSectionInfo := getDiffLineSectionInfo(curFile.Name, line, leftLine-1, rightLine-1) diffLine := &DiffLine{ Type: DiffLineSection, Content: line, diff --git a/services/gitdiff/gitdiff_test.go b/services/gitdiff/gitdiff_test.go index ea25b38dffd1d..58604d97c42d8 100644 --- a/services/gitdiff/gitdiff_test.go +++ b/services/gitdiff/gitdiff_test.go @@ -209,3 +209,11 @@ func TestGetDiffRangeWithWhitespaceBehavior(t *testing.T) { } } } + +func TestParseDiffHunkString(t *testing.T) { + leftLine, leftHunk, rightLine, rightHunk := ParseDiffHunkString("@@ -19,3 +19,5 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER") + assert.EqualValues(t, 19, leftLine) + assert.EqualValues(t, 3, leftHunk) + assert.EqualValues(t, 19, rightLine) + assert.EqualValues(t, 5, rightHunk) +} diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 40db434dec025..be423e9d4c554 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -319,10 +319,19 @@ {{else if eq .Type 22}}
- - - - {{.Poster.GetDisplayName}} + {{if .OriginalAuthor }} + {{else}} + + + + {{end}} + + {{if .OriginalAuthor }} + {{ .OriginalAuthor }} {{if $.Repository.OriginalURL}}({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}} + {{else}} + {{.Poster.GetDisplayName}} + {{end}} + {{if eq .Review.Type 1}} {{$.i18n.Tr "repo.issues.review.approve" $createdStr | Safe}} {{else if eq .Review.Type 2}} From 8a9c2d2da9d1e35925f715784284a2f5a9a640d9 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 10 Jan 2020 11:08:51 +0800 Subject: [PATCH 10/17] Don't load all pull requests attributes --- models/migrate.go | 2 +- models/pull.go | 13 +++++++++++++ modules/migrations/gitea.go | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/models/migrate.go b/models/migrate.go index 67791b4c9e653..28661527a65bf 100644 --- a/models/migrate.go +++ b/models/migrate.go @@ -208,7 +208,7 @@ func InsertReleases(rels ...*Release) error { return sess.Commit() } -// UpdateReviewsMigrationsByType updates reivews' migrations information via given git service type and original id and poster id +// UpdateReviewsMigrationsByType updates reviews' migrations information via given git service type and original id and poster id func UpdateReviewsMigrationsByType(tp structs.GitServiceType, originalAuthorID string, posterID int64) error { _, err := x.Table("review"). Where(builder.In("issue_id", diff --git a/models/pull.go b/models/pull.go index 3ef631852ea98..42d93bd54158d 100644 --- a/models/pull.go +++ b/models/pull.go @@ -655,6 +655,19 @@ func GetPullRequestByID(id int64) (*PullRequest, error) { return getPullRequestByID(x, id) } +// GetPullRequestByIssueIDWithNoAttributes returns pull request with no attributes loaded by given issue ID. +func GetPullRequestByIssueIDWithNoAttributes(issueID int64) (*PullRequest, error) { + var pr PullRequest + has, err := x.Where("issue_id = ?", issueID).Get(&pr) + if err != nil { + return nil, err + } + if !has { + return nil, ErrPullRequestNotExist{0, issueID, 0, 0, "", ""} + } + return &pr, nil +} + func getPullRequestByIssueID(e Engine, issueID int64) (*PullRequest, error) { pr := &PullRequest{ IssueID: issueID, diff --git a/modules/migrations/gitea.go b/modules/migrations/gitea.go index 2b83a716e0d82..afbc06911a8a5 100644 --- a/modules/migrations/gitea.go +++ b/modules/migrations/gitea.go @@ -775,7 +775,7 @@ func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error { pr, ok := g.prCache[issueID] if !ok { var err error - pr, err = models.GetPullRequestByIssueID(issueID) + pr, err = models.GetPullRequestByIssueIDWithNoAttributes(issueID) if err != nil { return err } From 1ec2c77eddabdd13a5d7975080cb3a0c39b82cd8 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 10 Jan 2020 11:11:39 +0800 Subject: [PATCH 11/17] Fix typo --- modules/migrations/migrate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/migrations/migrate.go b/modules/migrations/migrate.go index 664efc9163316..3b3e318f69718 100644 --- a/modules/migrations/migrate.go +++ b/modules/migrations/migrate.go @@ -251,7 +251,7 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts continue } - // plain commentes + // plain comments var allComments = make([]*base.Comment, 0, commentBatchSize) for _, pr := range prs { comments, err := downloader.GetComments(pr.Number) From 16f183ea3519df16b0b61d8f2aa76d8d04e19e40 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 10 Jan 2020 11:19:53 +0800 Subject: [PATCH 12/17] wrong change copy head --- models/migrations/v118.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/migrations/v118.go b/models/migrations/v118.go index 1ca82f76d98d4..c79cbb8ae3bb5 100644 --- a/models/migrations/v118.go +++ b/models/migrations/v118.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Gitea Authors. All rights reserved. +// Copyright 2019 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. From 579ef41e22e93a2fccb3db8a0a566817e4ea0e85 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 10 Jan 2020 16:22:21 +0800 Subject: [PATCH 13/17] fix tests --- modules/migrations/github_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/migrations/github_test.go b/modules/migrations/github_test.go index 0e79cdd45c2e9..7be0ac7e09443 100644 --- a/modules/migrations/github_test.go +++ b/modules/migrations/github_test.go @@ -410,6 +410,7 @@ func TestGitHubDownloadRepo(t *testing.T) { ID: 363017488, Content: "This is a good pull request.", TreePath: "README.md", + DiffHunk: "@@ -1,2 +1,4 @@\n # test_repo\n Test repository for testing migration from github to gitea\n+", Position: 3, CommitID: "2be9101c543658591222acbee3eb799edfc3853d", PosterID: 81045, @@ -442,6 +443,7 @@ func TestGitHubDownloadRepo(t *testing.T) { ID: 363029944, Content: "test a single comment.", TreePath: "LICENSE", + DiffHunk: "@@ -19,3 +19,5 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n+", Position: 4, CommitID: "2be9101c543658591222acbee3eb799edfc3853d", PosterID: 81045, From 3461e211c153e7a8c4223d07d98c36cbc3359499 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 16 Jan 2020 23:50:02 +0800 Subject: [PATCH 14/17] fix reactions --- modules/migrations/base/review.go | 2 +- modules/migrations/github.go | 37 +++++++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/modules/migrations/base/review.go b/modules/migrations/base/review.go index c69fc6b59a3bf..8051fed653b35 100644 --- a/modules/migrations/base/review.go +++ b/modules/migrations/base/review.go @@ -38,7 +38,7 @@ type ReviewComment struct { Position int CommitID string PosterID int64 - Reactions *Reactions + Reactions []*Reaction CreatedAt time.Time UpdatedAt time.Time } diff --git a/modules/migrations/github.go b/modules/migrations/github.go index 221070dab7261..e0239b5e7c9ef 100644 --- a/modules/migrations/github.go +++ b/modules/migrations/github.go @@ -631,9 +631,33 @@ func convertGithubReview(r *github.PullRequestReview) *base.Review { } } -func convertGithubReviewComments(cs []*github.PullRequestComment) []*base.ReviewComment { +func (g *GithubDownloaderV3) convertGithubReviewComments(cs []*github.PullRequestComment) ([]*base.ReviewComment,error) { var rcs = make([]*base.ReviewComment, 0, len(cs)) for _, c := range cs { + // 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, c.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(), + }) + } + } + rcs = append(rcs, &base.ReviewComment{ ID: c.GetID(), InReplyTo: c.GetInReplyTo(), @@ -643,12 +667,12 @@ func convertGithubReviewComments(cs []*github.PullRequestComment) []*base.Review Position: c.GetPosition(), CommitID: c.GetCommitID(), PosterID: c.GetUser().GetID(), - Reactions: convertGithubReactions(c.Reactions), + Reactions: reactions, CreatedAt: c.GetCreatedAt(), UpdatedAt: c.GetUpdatedAt(), }) } - return rcs + return rcs,nil } // GetReviews returns pull requests review @@ -678,7 +702,12 @@ func (g *GithubDownloaderV3) GetReviews(pullRequestNumber int64) ([]*base.Review return nil, fmt.Errorf("error while listing repos: %v", err) } g.rate = &resp.Rate - r.Comments = append(r.Comments, convertGithubReviewComments(reviewComments)...) + + cs, err := g.convertGithubReviewComments(reviewComments) + if err != nil { + return nil, err + } + r.Comments = append(r.Comments, cs...) if resp.NextPage == 0 { break } From 948b8a65130f67fbace213b2988834926fcbc892 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 17 Jan 2020 10:03:40 +0800 Subject: [PATCH 15/17] Fix test --- modules/migrations/github_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/migrations/github_test.go b/modules/migrations/github_test.go index 7be0ac7e09443..814c771e8c2b4 100644 --- a/modules/migrations/github_test.go +++ b/modules/migrations/github_test.go @@ -414,7 +414,6 @@ func TestGitHubDownloadRepo(t *testing.T) { Position: 3, CommitID: "2be9101c543658591222acbee3eb799edfc3853d", PosterID: 81045, - Reactions: &base.Reactions{}, CreatedAt: time.Date(2020, 01, 04, 05, 33, 06, 0, time.UTC), UpdatedAt: time.Date(2020, 01, 04, 05, 33, 18, 0, time.UTC), }, @@ -447,7 +446,6 @@ func TestGitHubDownloadRepo(t *testing.T) { Position: 4, CommitID: "2be9101c543658591222acbee3eb799edfc3853d", PosterID: 81045, - Reactions: &base.Reactions{}, CreatedAt: time.Date(2020, 01, 04, 11, 21, 41, 0, time.UTC), UpdatedAt: time.Date(2020, 01, 04, 11, 21, 41, 0, time.UTC), }, From 89af332c11a91364ebcb045c5a25c4d4940f050c Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 19 Jan 2020 13:17:37 +0800 Subject: [PATCH 16/17] fix fmt --- modules/migrations/github.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/migrations/github.go b/modules/migrations/github.go index e0239b5e7c9ef..2b31e80c32678 100644 --- a/modules/migrations/github.go +++ b/modules/migrations/github.go @@ -631,7 +631,7 @@ func convertGithubReview(r *github.PullRequestReview) *base.Review { } } -func (g *GithubDownloaderV3) convertGithubReviewComments(cs []*github.PullRequestComment) ([]*base.ReviewComment,error) { +func (g *GithubDownloaderV3) convertGithubReviewComments(cs []*github.PullRequestComment) ([]*base.ReviewComment, error) { var rcs = make([]*base.ReviewComment, 0, len(cs)) for _, c := range cs { // get reactions @@ -672,7 +672,7 @@ func (g *GithubDownloaderV3) convertGithubReviewComments(cs []*github.PullReques UpdatedAt: c.GetUpdatedAt(), }) } - return rcs,nil + return rcs, nil } // GetReviews returns pull requests review From f37545bca0ad2cc83adf119a020ba75cd3db7516 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 23 Jan 2020 15:19:22 +0800 Subject: [PATCH 17/17] fix review comment reactions --- modules/migrations/gitea.go | 2 -- modules/migrations/github.go | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/migrations/gitea.go b/modules/migrations/gitea.go index afbc06911a8a5..96d47dc5276a9 100644 --- a/modules/migrations/gitea.go +++ b/modules/migrations/gitea.go @@ -821,8 +821,6 @@ func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error { } cms = append(cms, &cm) - - // TODO: Reactions } return models.InsertReviews(cms) diff --git a/modules/migrations/github.go b/modules/migrations/github.go index 2b31e80c32678..488cd82f5b702 100644 --- a/modules/migrations/github.go +++ b/modules/migrations/github.go @@ -638,7 +638,7 @@ func (g *GithubDownloaderV3) convertGithubReviewComments(cs []*github.PullReques var reactions []*base.Reaction for i := 1; ; i++ { g.sleep() - res, resp, err := g.client.Reactions.ListIssueCommentReactions(g.ctx, g.repoOwner, g.repoName, c.GetID(), &github.ListOptions{ + res, resp, err := g.client.Reactions.ListPullRequestCommentReactions(g.ctx, g.repoOwner, g.repoName, c.GetID(), &github.ListOptions{ Page: i, PerPage: 100, })