Skip to content

Commit a0303a2

Browse files
committed
Support syncing reviews
1 parent bbd4648 commit a0303a2

File tree

2 files changed

+128
-18
lines changed

2 files changed

+128
-18
lines changed

models/issues/review.go

Lines changed: 107 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -626,17 +626,7 @@ func InsertReviews(reviews []*Review) error {
626626
return err
627627
}
628628

629-
if _, err := sess.NoAutoTime().Insert(&Comment{
630-
Type: CommentTypeReview,
631-
Content: review.Content,
632-
PosterID: review.ReviewerID,
633-
OriginalAuthor: review.OriginalAuthor,
634-
OriginalAuthorID: review.OriginalAuthorID,
635-
IssueID: review.IssueID,
636-
ReviewID: review.ID,
637-
CreatedUnix: review.CreatedUnix,
638-
UpdatedUnix: review.UpdatedUnix,
639-
}); err != nil {
629+
if _, err := sess.NoAutoTime().Insert(generateCommentFromReview(review)); err != nil {
640630
return err
641631
}
642632

@@ -654,6 +644,112 @@ func InsertReviews(reviews []*Review) error {
654644
return committer.Commit()
655645
}
656646

647+
// UpsertReviews inserts new reviews and updates existing ones.
648+
// This function is used for syncing from the pull mirror.
649+
func UpsertReviews(reviews []*Review) error {
650+
ctx, committer, err := db.TxContext()
651+
if err != nil {
652+
return err
653+
}
654+
defer committer.Close()
655+
sess := db.GetEngine(ctx)
656+
657+
for _, review := range reviews {
658+
exists, err := sess.Where("issue_id = ? AND created_unix", review.IssueID, review.CreatedUnix).Exist(&Review{})
659+
if err != nil {
660+
return err
661+
}
662+
663+
if !exists {
664+
if _, err := sess.NoAutoTime().Insert(review); err != nil {
665+
return err
666+
}
667+
668+
if _, err := sess.NoAutoTime().Insert(generateCommentFromReview(review)); err != nil {
669+
return err
670+
}
671+
672+
for _, c := range review.Comments {
673+
c.ReviewID = review.ID
674+
}
675+
676+
if len(review.Comments) > 0 {
677+
if _, err := sess.NoAutoTime().Insert(review.Comments); err != nil {
678+
return err
679+
}
680+
}
681+
} else {
682+
if _, err = sess.NoAutoTime().Where("issue_id = ? AND created_unix", review.IssueID, review.CreatedUnix).Update(review); err != nil {
683+
return err
684+
}
685+
686+
// Get id of the review
687+
if err = sess.NoAutoTime().Where("issue_id = ? AND created_unix", review.IssueID, review.CreatedUnix).Find(review); err != nil {
688+
return err
689+
}
690+
691+
comment := generateCommentFromReview(review)
692+
exists, err := existsCommentByReviewIDAndCreatedUnix(sess, comment)
693+
if err != nil {
694+
return err
695+
}
696+
697+
if !exists {
698+
if _, err := sess.NoAutoTime().Insert(comment); err != nil {
699+
return err
700+
}
701+
} else {
702+
if _, err := sess.NoAutoTime().Where("review_id = ? AND created_unix = ?", review.ID, comment.CreatedUnix).Update(comment); err != nil {
703+
return err
704+
}
705+
}
706+
707+
for _, c := range review.Comments {
708+
c.ReviewID = review.ID
709+
}
710+
711+
if len(review.Comments) > 0 {
712+
for _, comment := range review.Comments {
713+
exists, err := existsCommentByReviewIDAndCreatedUnix(sess, comment)
714+
if err != nil {
715+
return err
716+
}
717+
718+
if !exists {
719+
if _, err := sess.NoAutoTime().Insert(comment); err != nil {
720+
return err
721+
}
722+
} else {
723+
if _, err := sess.NoAutoTime().Where("review_id = ? AND created_unix = ?", review.ID, comment.CreatedUnix).Update(comment); err != nil {
724+
return err
725+
}
726+
}
727+
}
728+
}
729+
}
730+
}
731+
732+
return committer.Commit()
733+
}
734+
735+
func existsCommentByReviewIDAndCreatedUnix(sess db.Engine, comment *Comment) (bool, error) {
736+
return sess.Where("review_id = ? AND created_unix = ?", comment.ReviewID, comment.CreatedUnix).Exist(&Comment{})
737+
}
738+
739+
func generateCommentFromReview(review *Review) *Comment {
740+
return &Comment{
741+
Type: CommentTypeReview,
742+
Content: review.Content,
743+
PosterID: review.ReviewerID,
744+
OriginalAuthor: review.OriginalAuthor,
745+
OriginalAuthorID: review.OriginalAuthorID,
746+
IssueID: review.IssueID,
747+
ReviewID: review.ID,
748+
CreatedUnix: review.CreatedUnix,
749+
UpdatedUnix: review.UpdatedUnix,
750+
}
751+
}
752+
657753
// AddReviewRequest add a review request from one reviewer
658754
func AddReviewRequest(issue *Issue, reviewer, doer *user_model.User) (*Comment, error) {
659755
ctx, committer, err := db.TxContext()

services/migrations/gitea_uploader.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -747,14 +747,13 @@ func convertReviewState(state string) issues_model.ReviewType {
747747
}
748748
}
749749

750-
// CreateReviews create pull request reviews of currently migrated issues
751-
func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error {
750+
func (g *GiteaLocalUploader) prepareReviews(reviews ...*base.Review) ([]*issues_model.Review, error) {
752751
cms := make([]*issues_model.Review, 0, len(reviews))
753752
for _, review := range reviews {
754753
var issue *issues_model.Issue
755754
issue, ok := g.issues[review.IssueIndex]
756755
if !ok {
757-
return fmt.Errorf("review references non existent IssueIndex %d", review.IssueIndex)
756+
return nil, fmt.Errorf("review references non existent IssueIndex %d", review.IssueIndex)
758757
}
759758
if review.CreatedAt.IsZero() {
760759
review.CreatedAt = time.Unix(int64(issue.CreatedUnix), 0)
@@ -770,7 +769,7 @@ func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error {
770769
}
771770

772771
if err := g.remapUser(review, &cm); err != nil {
773-
return err
772+
return nil, err
774773
}
775774

776775
// get pr
@@ -779,7 +778,7 @@ func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error {
779778
var err error
780779
pr, err = issues_model.GetPullRequestByIssueIDWithNoAttributes(issue.ID)
781780
if err != nil {
782-
return err
781+
return nil, err
783782
}
784783
g.prCache[issue.ID] = pr
785784
}
@@ -833,7 +832,7 @@ func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error {
833832
}
834833

835834
if err := g.remapUser(review, &c); err != nil {
836-
return err
835+
return nil, err
837836
}
838837

839838
cm.Comments = append(cm.Comments, &c)
@@ -842,6 +841,16 @@ func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error {
842841
cms = append(cms, &cm)
843842
}
844843

844+
return cms, nil
845+
}
846+
847+
// CreateReviews create pull request reviews of currently migrated issues
848+
func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error {
849+
cms, err := g.prepareReviews(reviews...)
850+
if err != nil {
851+
return err
852+
}
853+
845854
return issues_model.InsertReviews(cms)
846855
}
847856

@@ -932,7 +941,12 @@ func (g *GiteaLocalUploader) PatchPullRequests(prs ...*base.PullRequest) error {
932941
}
933942

934943
func (g *GiteaLocalUploader) PatchReviews(reviews ...*base.Review) error {
935-
return nil
944+
cms, err := g.prepareReviews(reviews...)
945+
if err != nil {
946+
return err
947+
}
948+
949+
return issues_model.UpsertReviews(cms)
936950
}
937951

938952
// Rollback when migrating failed, this will rollback all the changes.

0 commit comments

Comments
 (0)