@@ -122,41 +122,76 @@ func createCodeComment(doer *models.User, repo *models.Repository, issue *models
122122 }
123123 defer gitRepo .Close ()
124124
125- // FIXME validate treePath
126- // Get latest commit referencing the commented line
127- // No need for get commit for base branch changes
125+ invalidated := false
126+ head := pr .GetGitRefName ()
128127 if line > 0 {
129- commit , err := gitRepo .LineBlame (pr .GetGitRefName (), gitRepo .Path , treePath , uint (line ))
130- if err == nil {
131- commitID = commit .ID .String ()
132- } else if ! (strings .Contains (err .Error (), "exit status 128 - fatal: no such path" ) || notEnoughLines .MatchString (err .Error ())) {
133- return nil , fmt .Errorf ("LineBlame[%s, %s, %s, %d]: %v" , pr .GetGitRefName (), gitRepo .Path , treePath , line , err )
128+ if reviewID != 0 {
129+ first , err := models .FindComments (models.FindCommentsOptions {
130+ ReviewID : reviewID ,
131+ Line : line ,
132+ TreePath : treePath ,
133+ Type : models .CommentTypeCode ,
134+ ListOptions : models.ListOptions {
135+ PageSize : 1 ,
136+ Page : 1 ,
137+ },
138+ })
139+ if err == nil && len (first ) > 0 {
140+ commitID = first [0 ].CommitSHA
141+ invalidated = first [0 ].Invalidated
142+ patch = first [0 ].Patch
143+ } else if err != nil && ! models .IsErrCommentNotExist (err ) {
144+ return nil , fmt .Errorf ("Find first comment for %d line %d path %s. Error: %v" , reviewID , line , treePath , err )
145+ } else {
146+ review , err := models .GetReviewByID (reviewID )
147+ if err == nil && len (review .CommitID ) > 0 {
148+ head = review .CommitID
149+ } else if err != nil && ! models .IsErrReviewNotExist (err ) {
150+ return nil , fmt .Errorf ("GetReviewByID %d. Error: %v" , reviewID , err )
151+ }
152+ }
153+ }
154+
155+ if len (commitID ) == 0 {
156+ // FIXME validate treePath
157+ // Get latest commit referencing the commented line
158+ // No need for get commit for base branch changes
159+ commit , err := gitRepo .LineBlame (head , gitRepo .Path , treePath , uint (line ))
160+ if err == nil {
161+ commitID = commit .ID .String ()
162+ } else if ! (strings .Contains (err .Error (), "exit status 128 - fatal: no such path" ) || notEnoughLines .MatchString (err .Error ())) {
163+ return nil , fmt .Errorf ("LineBlame[%s, %s, %s, %d]: %v" , pr .GetGitRefName (), gitRepo .Path , treePath , line , err )
164+ }
134165 }
135166 }
136167
137168 // Only fetch diff if comment is review comment
138- if reviewID != 0 {
139- headCommitID , err := gitRepo .GetRefCommitID (pr .GetGitRefName ())
140- if err != nil {
141- return nil , fmt .Errorf ("GetRefCommitID[%s]: %v" , pr .GetGitRefName (), err )
169+ if len (patch ) == 0 && reviewID != 0 {
170+ if len (commitID ) == 0 {
171+ commitID , err = gitRepo .GetRefCommitID (pr .GetGitRefName ())
172+ if err != nil {
173+ return nil , fmt .Errorf ("GetRefCommitID[%s]: %v" , pr .GetGitRefName (), err )
174+ }
142175 }
176+
143177 patchBuf := new (bytes.Buffer )
144- if err := git .GetRepoRawDiffForFile (gitRepo , pr .MergeBase , headCommitID , git .RawDiffNormal , treePath , patchBuf ); err != nil {
145- return nil , fmt .Errorf ("GetRawDiffForLine[%s, %s, %s, %s]: %v" , err , gitRepo .Path , pr .MergeBase , headCommitID , treePath )
178+ if err := git .GetRepoRawDiffForFile (gitRepo , pr .MergeBase , commitID , git .RawDiffNormal , treePath , patchBuf ); err != nil {
179+ return nil , fmt .Errorf ("GetRawDiffForLine[%s, %s, %s, %s]: %v" , gitRepo .Path , pr .MergeBase , commitID , treePath , err )
146180 }
147181 patch = git .CutDiffAroundLine (patchBuf , int64 ((& models.Comment {Line : line }).UnsignedLine ()), line < 0 , setting .UI .CodeCommentLines )
148182 }
149183 return models .CreateComment (& models.CreateCommentOptions {
150- Type : models .CommentTypeCode ,
151- Doer : doer ,
152- Repo : repo ,
153- Issue : issue ,
154- Content : content ,
155- LineNum : line ,
156- TreePath : treePath ,
157- CommitSHA : commitID ,
158- ReviewID : reviewID ,
159- Patch : patch ,
184+ Type : models .CommentTypeCode ,
185+ Doer : doer ,
186+ Repo : repo ,
187+ Issue : issue ,
188+ Content : content ,
189+ LineNum : line ,
190+ TreePath : treePath ,
191+ CommitSHA : commitID ,
192+ ReviewID : reviewID ,
193+ Patch : patch ,
194+ Invalidated : invalidated ,
160195 })
161196}
162197
0 commit comments