diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2023-02-16 21:21:25 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-16 21:21:25 +0800 |
commit | 1d191f9b5a262a9933c6024e051161dc90aa7f22 (patch) | |
tree | a47d1d233930bc4379fe09043ee60db15c126ffc /services/pull | |
parent | 2e1afd54b2b1040ee259ee19e6614b76da4b25e0 (diff) | |
download | gitea-1d191f9b5a262a9933c6024e051161dc90aa7f22.tar.gz gitea-1d191f9b5a262a9933c6024e051161dc90aa7f22.zip |
some refactor about code comments(#20821) (#22707)
fix #22691
backport #20821
Co-authored-by: zeripath <art27@cantab.net>
Diffstat (limited to 'services/pull')
-rw-r--r-- | services/pull/pull.go | 2 | ||||
-rw-r--r-- | services/pull/review.go | 49 |
2 files changed, 48 insertions, 3 deletions
diff --git a/services/pull/pull.go b/services/pull/pull.go index fbfc31d4e7..3ec7ec92b7 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -240,7 +240,7 @@ func checkForInvalidation(ctx context.Context, requests issues_model.PullRequest } go func() { // FIXME: graceful: We need to tell the manager we're doing something... - err := requests.InvalidateCodeComments(ctx, doer, gitRepo, branch) + err := InvalidateCodeComments(ctx, requests, doer, gitRepo, branch) if err != nil { log.Error("PullRequestList.InvalidateCodeComments: %v", err) } diff --git a/services/pull/review.go b/services/pull/review.go index 16c9e108ee..5c86b7a9f3 100644 --- a/services/pull/review.go +++ b/services/pull/review.go @@ -23,6 +23,53 @@ import ( "code.gitea.io/gitea/modules/util" ) +var notEnoughLines = regexp.MustCompile(`fatal: file .* has only \d+ lines?`) + +// checkInvalidation checks if the line of code comment got changed by another commit. +// If the line got changed the comment is going to be invalidated. +func checkInvalidation(ctx context.Context, c *issues_model.Comment, doer *user_model.User, repo *git.Repository, branch string) error { + // FIXME differentiate between previous and proposed line + commit, err := repo.LineBlame(branch, repo.Path, c.TreePath, uint(c.UnsignedLine())) + if err != nil && (strings.Contains(err.Error(), "fatal: no such path") || notEnoughLines.MatchString(err.Error())) { + c.Invalidated = true + return issues_model.UpdateCommentInvalidate(ctx, c) + } + if err != nil { + return err + } + if c.CommitSHA != "" && c.CommitSHA != commit.ID.String() { + c.Invalidated = true + return issues_model.UpdateCommentInvalidate(ctx, c) + } + return nil +} + +// InvalidateCodeComments will lookup the prs for code comments which got invalidated by change +func InvalidateCodeComments(ctx context.Context, prs issues_model.PullRequestList, doer *user_model.User, repo *git.Repository, branch string) error { + if len(prs) == 0 { + return nil + } + issueIDs := prs.GetIssueIDs() + var codeComments []*issues_model.Comment + + if err := db.Find(ctx, &issues_model.FindCommentsOptions{ + ListOptions: db.ListOptions{ + ListAll: true, + }, + Type: issues_model.CommentTypeCode, + Invalidated: util.OptionalBoolFalse, + IssueIDs: issueIDs, + }, &codeComments); err != nil { + return fmt.Errorf("find code comments: %v", err) + } + for _, comment := range codeComments { + if err := checkInvalidation(ctx, comment, doer, repo, branch); err != nil { + return err + } + } + return nil +} + // CreateCodeComment creates a comment on the code line func CreateCodeComment(ctx context.Context, doer *user_model.User, gitRepo *git.Repository, issue *issues_model.Issue, line int64, content, treePath string, isReview bool, replyReviewID int64, latestCommitID string) (*issues_model.Comment, error) { var ( @@ -114,8 +161,6 @@ func CreateCodeComment(ctx context.Context, doer *user_model.User, gitRepo *git. return comment, nil } -var notEnoughLines = regexp.MustCompile(`exit status 128 - fatal: file .* has only \d+ lines?`) - // createCodeComment creates a plain code comment at the specified line / path func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, issue *issues_model.Issue, content, treePath string, line, reviewID int64) (*issues_model.Comment, error) { var commitID, patch string |