@ -122,41 +122,76 @@ func createCodeComment(doer *models.User, repo *models.Repository, issue *models
}
defer gitRepo . Close ( )
// FIXME validate treePath
// Get latest commit referencing the commented line
// No need for get commit for base branch changes
invalidated := false
head := pr . GetGitRefName ( )
if line > 0 {
commit , err := gitRepo . LineBlame ( pr . GetGitRefName ( ) , gitRepo . Path , treePath , uint ( line ) )
if err == nil {
commitID = commit . ID . String ( )
} else if ! ( strings . Contains ( err . Error ( ) , "exit status 128 - fatal: no such path" ) || notEnoughLines . MatchString ( err . Error ( ) ) ) {
return nil , fmt . Errorf ( "LineBlame[%s, %s, %s, %d]: %v" , pr . GetGitRefName ( ) , gitRepo . Path , treePath , line , err )
if reviewID != 0 {
first , err := models . FindComments ( models . FindCommentsOptions {
ReviewID : reviewID ,
Line : line ,
TreePath : treePath ,
Type : models . CommentTypeCode ,
ListOptions : models . ListOptions {
PageSize : 1 ,
Page : 1 ,
} ,
} )
if err == nil && len ( first ) > 0 {
commitID = first [ 0 ] . CommitSHA
invalidated = first [ 0 ] . Invalidated
patch = first [ 0 ] . Patch
} else if err != nil && ! models . IsErrCommentNotExist ( err ) {
return nil , fmt . Errorf ( "Find first comment for %d line %d path %s. Error: %v" , reviewID , line , treePath , err )
} else {
review , err := models . GetReviewByID ( reviewID )
if err == nil && len ( review . CommitID ) > 0 {
head = review . CommitID
} else if err != nil && ! models . IsErrReviewNotExist ( err ) {
return nil , fmt . Errorf ( "GetReviewByID %d. Error: %v" , reviewID , err )
}
}
}
if len ( commitID ) == 0 {
// FIXME validate treePath
// Get latest commit referencing the commented line
// No need for get commit for base branch changes
commit , err := gitRepo . LineBlame ( head , gitRepo . Path , treePath , uint ( line ) )
if err == nil {
commitID = commit . ID . String ( )
} else if ! ( strings . Contains ( err . Error ( ) , "exit status 128 - fatal: no such path" ) || notEnoughLines . MatchString ( err . Error ( ) ) ) {
return nil , fmt . Errorf ( "LineBlame[%s, %s, %s, %d]: %v" , pr . GetGitRefName ( ) , gitRepo . Path , treePath , line , err )
}
}
}
// Only fetch diff if comment is review comment
if reviewID != 0 {
headCommitID , err := gitRepo . GetRefCommitID ( pr . GetGitRefName ( ) )
if err != nil {
return nil , fmt . Errorf ( "GetRefCommitID[%s]: %v" , pr . GetGitRefName ( ) , err )
if len ( patch ) == 0 && reviewID != 0 {
if len ( commitID ) == 0 {
commitID , err = gitRepo . GetRefCommitID ( pr . GetGitRefName ( ) )
if err != nil {
return nil , fmt . Errorf ( "GetRefCommitID[%s]: %v" , pr . GetGitRefName ( ) , err )
}
}
patchBuf := new ( bytes . Buffer )
if err := git . GetRepoRawDiffForFile ( gitRepo , pr . MergeBase , headCommitID , git . RawDiffNormal , treePath , patchBuf ) ; err != nil {
return nil , fmt . Errorf ( "GetRawDiffForLine[%s, %s, %s, %s]: %v" , err , gitRepo . Path , pr . MergeBase , headCommitID , treePath )
if err := git . GetRepoRawDiffForFile ( gitRepo , pr . MergeBase , c ommitID, git . RawDiffNormal , treePath , patchBuf ) ; err != nil {
return nil , fmt . Errorf ( "GetRawDiffForLine[%s, %s, %s, %s]: %v" , gitRepo. Path , pr . MergeBase , commitID, treePath , err )
}
patch = git . CutDiffAroundLine ( patchBuf , int64 ( ( & models . Comment { Line : line } ) . UnsignedLine ( ) ) , line < 0 , setting . UI . CodeCommentLines )
}
return models . CreateComment ( & models . CreateCommentOptions {
Type : models . CommentTypeCode ,
Doer : doer ,
Repo : repo ,
Issue : issue ,
Content : content ,
LineNum : line ,
TreePath : treePath ,
CommitSHA : commitID ,
ReviewID : reviewID ,
Patch : patch ,
Type : models . CommentTypeCode ,
Doer : doer ,
Repo : repo ,
Issue : issue ,
Content : content ,
LineNum : line ,
TreePath : treePath ,
CommitSHA : commitID ,
ReviewID : reviewID ,
Patch : patch ,
Invalidated : invalidated ,
} )
}