6
6
package migrations
7
7
8
8
import (
9
+ "bytes"
9
10
"context"
10
11
"fmt"
11
12
"io"
@@ -27,6 +28,7 @@ import (
27
28
"code.gitea.io/gitea/modules/setting"
28
29
"code.gitea.io/gitea/modules/structs"
29
30
"code.gitea.io/gitea/modules/timeutil"
31
+ "code.gitea.io/gitea/services/gitdiff"
30
32
31
33
gouuid "github.com/satori/go.uuid"
32
34
)
@@ -706,6 +708,115 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*models.PullR
706
708
return & pullRequest , nil
707
709
}
708
710
711
+ func convertReviewState (state string ) models.ReviewType {
712
+ switch state {
713
+ case "PENDING" :
714
+ return models .ReviewTypePending
715
+ case "APPROVE" :
716
+ return models .ReviewTypeApprove
717
+ case "REQUEST_CHANGES" :
718
+ return models .ReviewTypeReject
719
+ case "COMMENT" :
720
+ return models .ReviewTypeComment
721
+ default :
722
+ return models .ReviewTypePending
723
+ }
724
+ }
725
+
726
+ // CreateReviews create pull request reviews
727
+ func (g * GiteaLocalUploader ) CreateReviews (reviews ... * base.Review ) error {
728
+ var cms = make ([]* models.Review , 0 , len (reviews ))
729
+ for _ , review := range reviews {
730
+ var issueID int64
731
+ if issueIDStr , ok := g .issues .Load (review .IssueIndex ); ! ok {
732
+ issue , err := models .GetIssueByIndex (g .repo .ID , review .IssueIndex )
733
+ if err != nil {
734
+ return err
735
+ }
736
+ issueID = issue .ID
737
+ g .issues .Store (review .IssueIndex , issueID )
738
+ } else {
739
+ issueID = issueIDStr .(int64 )
740
+ }
741
+
742
+ userid , ok := g .userMap [review .ReviewerID ]
743
+ tp := g .gitServiceType .Name ()
744
+ if ! ok && tp != "" {
745
+ var err error
746
+ userid , err = models .GetUserIDByExternalUserID (tp , fmt .Sprintf ("%v" , review .ReviewerID ))
747
+ if err != nil {
748
+ log .Error ("GetUserIDByExternalUserID: %v" , err )
749
+ }
750
+ if userid > 0 {
751
+ g .userMap [review .ReviewerID ] = userid
752
+ }
753
+ }
754
+
755
+ var cm = models.Review {
756
+ Type : convertReviewState (review .State ),
757
+ IssueID : issueID ,
758
+ Content : review .Content ,
759
+ Official : review .Official ,
760
+ CreatedUnix : timeutil .TimeStamp (review .CreatedAt .Unix ()),
761
+ UpdatedUnix : timeutil .TimeStamp (review .CreatedAt .Unix ()),
762
+ }
763
+
764
+ if userid > 0 {
765
+ cm .ReviewerID = userid
766
+ } else {
767
+ cm .ReviewerID = g .doer .ID
768
+ cm .OriginalAuthor = review .ReviewerName
769
+ cm .OriginalAuthorID = review .ReviewerID
770
+ }
771
+
772
+ // TODO: cache pr
773
+ pr , err := models .GetPullRequestByID (issueID )
774
+ if err != nil {
775
+ return err
776
+ }
777
+
778
+ for _ , comment := range review .Comments {
779
+ headCommitID , err := g .gitRepo .GetRefCommitID (pr .GetGitRefName ())
780
+ if err != nil {
781
+ return fmt .Errorf ("GetRefCommitID[%s]: %v" , pr .GetGitRefName (), err )
782
+ }
783
+ patchBuf := new (bytes.Buffer )
784
+ if err := gitdiff .GetRawDiffForFile (g .gitRepo .Path , pr .MergeBase , headCommitID , gitdiff .RawDiffNormal , comment .TreePath , patchBuf ); err != nil {
785
+ return fmt .Errorf ("GetRawDiffForLine[%s, %s, %s, %s]: %v" , err , g .gitRepo .Path , pr .MergeBase , headCommitID , comment .TreePath )
786
+ }
787
+ line := int64 (comment .Position )
788
+ patch := gitdiff .CutDiffAroundLine (patchBuf , int64 ((& models.Comment {Line : line }).UnsignedLine ()), line < 0 , setting .UI .CodeCommentLines )
789
+
790
+ var c = models.Comment {
791
+ Type : models .CommentTypeCode ,
792
+ PosterID : comment .PosterID ,
793
+ IssueID : issueID ,
794
+ Content : comment .Content ,
795
+ Line : line ,
796
+ TreePath : comment .TreePath ,
797
+ CommitSHA : comment .CommitID ,
798
+ Patch : patch ,
799
+ }
800
+
801
+ if userid > 0 {
802
+ c .PosterID = userid
803
+ } else {
804
+ c .PosterID = g .doer .ID
805
+ c .OriginalAuthor = review .ReviewerName
806
+ c .OriginalAuthorID = review .ReviewerID
807
+ }
808
+
809
+ cm .Comments = append (cm .Comments , & c )
810
+ }
811
+
812
+ cms = append (cms , & cm )
813
+
814
+ // TODO: Reactions
815
+ }
816
+
817
+ return models .InsertReviews (cms )
818
+ }
819
+
709
820
// Rollback when migrating failed, this will rollback all the changes.
710
821
func (g * GiteaLocalUploader ) Rollback () error {
711
822
if g .repo != nil && g .repo .ID > 0 {
0 commit comments