@@ -122,41 +122,76 @@ func createCodeComment(doer *models.User, repo *models.Repository, issue *models
122
122
}
123
123
defer gitRepo .Close ()
124
124
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 ()
128
127
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
+ }
134
165
}
135
166
}
136
167
137
168
// 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
+ }
142
175
}
176
+
143
177
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 )
146
180
}
147
181
patch = git .CutDiffAroundLine (patchBuf , int64 ((& models.Comment {Line : line }).UnsignedLine ()), line < 0 , setting .UI .CodeCommentLines )
148
182
}
149
183
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 ,
160
195
})
161
196
}
162
197
0 commit comments