|
@@ -122,41 +122,76 @@ func createCodeComment(doer *models.User, repo *models.Repository, issue *models |
|
|
} |
|
|
} |
|
|
defer gitRepo.Close() |
|
|
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 { |
|
|
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 |
|
|
// 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) |
|
|
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, commitID, 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) |
|
|
patch = git.CutDiffAroundLine(patchBuf, int64((&models.Comment{Line: line}).UnsignedLine()), line < 0, setting.UI.CodeCommentLines) |
|
|
} |
|
|
} |
|
|
return models.CreateComment(&models.CreateCommentOptions{ |
|
|
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, |
|
|
}) |
|
|
}) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|