@@ -626,17 +626,7 @@ func InsertReviews(reviews []*Review) error {
626
626
return err
627
627
}
628
628
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 {
640
630
return err
641
631
}
642
632
@@ -654,6 +644,112 @@ func InsertReviews(reviews []*Review) error {
654
644
return committer .Commit ()
655
645
}
656
646
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
+
657
753
// AddReviewRequest add a review request from one reviewer
658
754
func AddReviewRequest (issue * Issue , reviewer , doer * user_model.User ) (* Comment , error ) {
659
755
ctx , committer , err := db .TxContext ()
0 commit comments