66package migrations
77
88import (
9+ "bytes"
910 "context"
1011 "fmt"
1112 "io"
@@ -27,6 +28,7 @@ import (
2728 "code.gitea.io/gitea/modules/setting"
2829 "code.gitea.io/gitea/modules/structs"
2930 "code.gitea.io/gitea/modules/timeutil"
31+ "code.gitea.io/gitea/services/gitdiff"
3032
3133 gouuid "github.com/satori/go.uuid"
3234)
@@ -706,6 +708,115 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*models.PullR
706708 return & pullRequest , nil
707709}
708710
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+
709820// Rollback when migrating failed, this will rollback all the changes.
710821func (g * GiteaLocalUploader ) Rollback () error {
711822 if g .repo != nil && g .repo .ID > 0 {
0 commit comments