aboutsummaryrefslogtreecommitdiffstats
path: root/services/pull
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2022-12-10 10:46:31 +0800
committerGitHub <noreply@github.com>2022-12-10 10:46:31 +0800
commit68704532c28cf09db96c988291b2f82c5e615984 (patch)
treec6537092dc11054f96b202fdb957755ed116cd99 /services/pull
parent097d4e30b180eef30600beef2c08095e2571319c (diff)
downloadgitea-68704532c28cf09db96c988291b2f82c5e615984.tar.gz
gitea-68704532c28cf09db96c988291b2f82c5e615984.zip
Rename almost all Ctx functions (#22071)
Diffstat (limited to 'services/pull')
-rw-r--r--services/pull/check.go2
-rw-r--r--services/pull/comment.go162
-rw-r--r--services/pull/merge.go8
-rw-r--r--services/pull/patch.go2
-rw-r--r--services/pull/pull.go6
-rw-r--r--services/pull/review.go5
-rw-r--r--services/pull/update.go2
7 files changed, 175 insertions, 12 deletions
diff --git a/services/pull/check.go b/services/pull/check.go
index 4f720f0a0c..ed4b18107c 100644
--- a/services/pull/check.go
+++ b/services/pull/check.go
@@ -236,7 +236,7 @@ func manuallyMerged(ctx context.Context, pr *issues_model.PullRequest) bool {
return false
}
- if unit, err := pr.BaseRepo.GetUnit(unit.TypePullRequests); err == nil {
+ if unit, err := pr.BaseRepo.GetUnit(ctx, unit.TypePullRequests); err == nil {
config := unit.PullRequestsConfig()
if !config.AutodetectManualMerge {
return false
diff --git a/services/pull/comment.go b/services/pull/comment.go
new file mode 100644
index 0000000000..068aca6cd1
--- /dev/null
+++ b/services/pull/comment.go
@@ -0,0 +1,162 @@
+// Copyright 2022 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package pull
+
+import (
+ "context"
+
+ issues_model "code.gitea.io/gitea/models/issues"
+ repo_model "code.gitea.io/gitea/models/repo"
+ user_model "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/json"
+ issue_service "code.gitea.io/gitea/services/issue"
+)
+
+type commitBranchCheckItem struct {
+ Commit *git.Commit
+ Checked bool
+}
+
+func commitBranchCheck(gitRepo *git.Repository, startCommit *git.Commit, endCommitID, baseBranch string, commitList map[string]*commitBranchCheckItem) error {
+ if startCommit.ID.String() == endCommitID {
+ return nil
+ }
+
+ checkStack := make([]string, 0, 10)
+ checkStack = append(checkStack, startCommit.ID.String())
+
+ for len(checkStack) > 0 {
+ commitID := checkStack[0]
+ checkStack = checkStack[1:]
+
+ item, ok := commitList[commitID]
+ if !ok {
+ continue
+ }
+
+ if item.Commit.ID.String() == endCommitID {
+ continue
+ }
+
+ if err := item.Commit.LoadBranchName(); err != nil {
+ return err
+ }
+
+ if item.Commit.Branch == baseBranch {
+ continue
+ }
+
+ if item.Checked {
+ continue
+ }
+
+ item.Checked = true
+
+ parentNum := item.Commit.ParentCount()
+ for i := 0; i < parentNum; i++ {
+ parentCommit, err := item.Commit.Parent(i)
+ if err != nil {
+ return err
+ }
+ checkStack = append(checkStack, parentCommit.ID.String())
+ }
+ }
+ return nil
+}
+
+// getCommitIDsFromRepo get commit IDs from repo in between oldCommitID and newCommitID
+// isForcePush will be true if oldCommit isn't on the branch
+// Commit on baseBranch will skip
+func getCommitIDsFromRepo(ctx context.Context, repo *repo_model.Repository, oldCommitID, newCommitID, baseBranch string) (commitIDs []string, isForcePush bool, err error) {
+ repoPath := repo.RepoPath()
+ gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repoPath)
+ if err != nil {
+ return nil, false, err
+ }
+ defer closer.Close()
+
+ oldCommit, err := gitRepo.GetCommit(oldCommitID)
+ if err != nil {
+ return nil, false, err
+ }
+
+ if err = oldCommit.LoadBranchName(); err != nil {
+ return nil, false, err
+ }
+
+ if len(oldCommit.Branch) == 0 {
+ commitIDs = make([]string, 2)
+ commitIDs[0] = oldCommitID
+ commitIDs[1] = newCommitID
+
+ return commitIDs, true, err
+ }
+
+ newCommit, err := gitRepo.GetCommit(newCommitID)
+ if err != nil {
+ return nil, false, err
+ }
+
+ commits, err := newCommit.CommitsBeforeUntil(oldCommitID)
+ if err != nil {
+ return nil, false, err
+ }
+
+ commitIDs = make([]string, 0, len(commits))
+ commitChecks := make(map[string]*commitBranchCheckItem)
+
+ for _, commit := range commits {
+ commitChecks[commit.ID.String()] = &commitBranchCheckItem{
+ Commit: commit,
+ Checked: false,
+ }
+ }
+
+ if err = commitBranchCheck(gitRepo, newCommit, oldCommitID, baseBranch, commitChecks); err != nil {
+ return
+ }
+
+ for i := len(commits) - 1; i >= 0; i-- {
+ commitID := commits[i].ID.String()
+ if item, ok := commitChecks[commitID]; ok && item.Checked {
+ commitIDs = append(commitIDs, commitID)
+ }
+ }
+
+ return commitIDs, isForcePush, err
+}
+
+// CreatePushPullComment create push code to pull base comment
+func CreatePushPullComment(ctx context.Context, pusher *user_model.User, pr *issues_model.PullRequest, oldCommitID, newCommitID string) (comment *issues_model.Comment, err error) {
+ if pr.HasMerged || oldCommitID == "" || newCommitID == "" {
+ return nil, nil
+ }
+
+ ops := &issues_model.CreateCommentOptions{
+ Type: issues_model.CommentTypePullRequestPush,
+ Doer: pusher,
+ Repo: pr.BaseRepo,
+ }
+
+ var data issues_model.PushActionContent
+
+ data.CommitIDs, data.IsForcePush, err = getCommitIDsFromRepo(ctx, pr.BaseRepo, oldCommitID, newCommitID, pr.BaseBranch)
+ if err != nil {
+ return nil, err
+ }
+
+ ops.Issue = pr.Issue
+
+ dataJSON, err := json.Marshal(data)
+ if err != nil {
+ return nil, err
+ }
+
+ ops.Content = string(dataJSON)
+
+ comment, err = issue_service.CreateComment(ops)
+
+ return comment, err
+}
diff --git a/services/pull/merge.go b/services/pull/merge.go
index 9270fb8cbc..1c42c1c17b 100644
--- a/services/pull/merge.go
+++ b/services/pull/merge.go
@@ -54,7 +54,7 @@ func GetDefaultMergeMessage(ctx context.Context, baseGitRepo *git.Repository, pr
return "", err
}
- isExternalTracker := pr.BaseRepo.UnitEnabled(unit.TypeExternalTracker)
+ isExternalTracker := pr.BaseRepo.UnitEnabled(ctx, unit.TypeExternalTracker)
issueReference := "#"
if isExternalTracker {
issueReference = "!"
@@ -145,11 +145,11 @@ func Merge(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.U
defer pullWorkingPool.CheckOut(fmt.Sprint(pr.ID))
// Removing an auto merge pull and ignore if not exist
- if err := pull_model.DeleteScheduledAutoMerge(db.DefaultContext, pr.ID); err != nil && !db.IsErrNotExist(err) {
+ if err := pull_model.DeleteScheduledAutoMerge(ctx, pr.ID); err != nil && !db.IsErrNotExist(err) {
return err
}
- prUnit, err := pr.BaseRepo.GetUnit(unit.TypePullRequests)
+ prUnit, err := pr.BaseRepo.GetUnit(ctx, unit.TypePullRequests)
if err != nil {
log.Error("pr.BaseRepo.GetUnit(unit.TypePullRequests): %v", err)
return err
@@ -828,7 +828,7 @@ func MergedManually(pr *issues_model.PullRequest, doer *user_model.User, baseGit
defer pullWorkingPool.CheckOut(fmt.Sprint(pr.ID))
if err := db.WithTx(db.DefaultContext, func(ctx context.Context) error {
- prUnit, err := pr.BaseRepo.GetUnitCtx(ctx, unit.TypePullRequests)
+ prUnit, err := pr.BaseRepo.GetUnit(ctx, unit.TypePullRequests)
if err != nil {
return err
}
diff --git a/services/pull/patch.go b/services/pull/patch.go
index 2d495a3d72..809b75e6b4 100644
--- a/services/pull/patch.go
+++ b/services/pull/patch.go
@@ -354,7 +354,7 @@ func checkConflicts(ctx context.Context, pr *issues_model.PullRequest, gitRepo *
}
// 5. Now get the pull request configuration to check if we need to ignore whitespace
- prUnit, err := pr.BaseRepo.GetUnit(unit.TypePullRequests)
+ prUnit, err := pr.BaseRepo.GetUnit(ctx, unit.TypePullRequests)
if err != nil {
return false, err
}
diff --git a/services/pull/pull.go b/services/pull/pull.go
index fd907491d4..afb0fa2442 100644
--- a/services/pull/pull.go
+++ b/services/pull/pull.go
@@ -123,7 +123,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, pull *issu
Content: string(dataJSON),
}
- _, _ = issues_model.CreateComment(ops)
+ _, _ = issue_service.CreateComment(ops)
}
return nil
@@ -222,7 +222,7 @@ func ChangeTargetBranch(ctx context.Context, pr *issues_model.PullRequest, doer
OldRef: oldBranch,
NewRef: targetBranch,
}
- if _, err = issues_model.CreateComment(options); err != nil {
+ if _, err = issue_service.CreateComment(options); err != nil {
return fmt.Errorf("CreateChangeTargetBranchComment: %w", err)
}
@@ -317,7 +317,7 @@ func AddTestPullRequestTask(doer *user_model.User, repoID int64, branch string,
}
AddToTaskQueue(pr)
- comment, err := issues_model.CreatePushPullComment(ctx, doer, pr, oldCommitID, newCommitID)
+ comment, err := CreatePushPullComment(ctx, doer, pr, oldCommitID, newCommitID)
if err == nil && comment != nil {
notification.NotifyPullRequestPushCommits(ctx, doer, pr, comment)
}
diff --git a/services/pull/review.go b/services/pull/review.go
index 1f2bc77e2c..67a10d7aad 100644
--- a/services/pull/review.go
+++ b/services/pull/review.go
@@ -20,6 +20,7 @@ import (
"code.gitea.io/gitea/modules/notification"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
+ issue_service "code.gitea.io/gitea/services/issue"
)
// CreateCodeComment creates a comment on the code line
@@ -202,7 +203,7 @@ func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_mo
return nil, err
}
}
- return issues_model.CreateComment(&issues_model.CreateCommentOptions{
+ return issue_service.CreateComment(&issues_model.CreateCommentOptions{
Type: issues_model.CommentTypeCode,
Doer: doer,
Repo: repo,
@@ -322,7 +323,7 @@ func DismissReview(ctx context.Context, reviewID, repoID int64, message string,
return
}
- comment, err = issues_model.CreateComment(&issues_model.CreateCommentOptions{
+ comment, err = issue_service.CreateComment(&issues_model.CreateCommentOptions{
Doer: doer,
Content: message,
Type: issues_model.CommentTypeDismissReview,
diff --git a/services/pull/update.go b/services/pull/update.go
index bd6a37b277..e09dbf6244 100644
--- a/services/pull/update.go
+++ b/services/pull/update.go
@@ -106,7 +106,7 @@ func IsUserAllowedToUpdate(ctx context.Context, pull *issues_model.PullRequest,
// can't do rebase on protected branch because need force push
if pr.ProtectedBranch == nil {
- prUnit, err := pr.BaseRepo.GetUnit(unit.TypePullRequests)
+ prUnit, err := pr.BaseRepo.GetUnit(ctx, unit.TypePullRequests)
if err != nil {
log.Error("pr.BaseRepo.GetUnit(unit.TypePullRequests): %v", err)
return false, false, err