Skip to content

Commit 2bfdb66

Browse files
committed
Fix merge/automerge a pull request from actions runner task
1 parent a989404 commit 2bfdb66

File tree

5 files changed

+11
-19
lines changed

5 files changed

+11
-19
lines changed

cmd/hook.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ Gitea or set your environment appropriately.`, "")
197197
PullRequestID: prID,
198198
DeployKeyID: deployKeyID,
199199
ActionPerm: int(actionPerm),
200+
PushTrigger: repo_module.PushTrigger(os.Getenv(repo_module.EnvPushTrigger)),
200201
}
201202

202203
scanner := bufio.NewScanner(os.Stdin)

models/pull/automerge.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func GetScheduledMergeByPullID(ctx context.Context, pullID int64) (bool, *AutoMe
7474
return false, nil, err
7575
}
7676

77-
doer, err := user_model.GetUserByID(ctx, scheduledPRM.DoerID)
77+
doer, err := user_model.GetPossibleUserByID(ctx, scheduledPRM.DoerID)
7878
if err != nil {
7979
return false, nil, err
8080
}

routers/private/hook_post_receive.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ func HookPostReceive(ctx *gitea_context.PrivateContext) {
332332

333333
func loadContextCacheUser(ctx context.Context, id int64) (*user_model.User, error) {
334334
return cache.GetWithContextCache(ctx, "hook_post_receive_user", id, func() (*user_model.User, error) {
335-
return user_model.GetUserByID(ctx, id)
335+
return user_model.GetPossibleUserByID(ctx, id)
336336
})
337337
}
338338

services/automerge/automerge.go

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ package automerge
55

66
import (
77
"context"
8-
"errors"
98
"fmt"
109
"strconv"
1110
"strings"
1211

1312
"code.gitea.io/gitea/models/db"
1413
issues_model "code.gitea.io/gitea/models/issues"
15-
access_model "code.gitea.io/gitea/models/perm/access"
1614
pull_model "code.gitea.io/gitea/models/pull"
1715
repo_model "code.gitea.io/gitea/models/repo"
1816
user_model "code.gitea.io/gitea/models/user"
@@ -275,26 +273,15 @@ func handlePullRequestAutoMerge(pullID int64, sha string) {
275273
}
276274

277275
// Merge if all checks succeeded
278-
doer, err := user_model.GetUserByID(ctx, scheduledPRM.DoerID)
276+
// Use GetPossibleUserByID to allow merging by deleted users or bot users
277+
doer, err := user_model.GetPossibleUserByID(ctx, scheduledPRM.DoerID)
279278
if err != nil {
280279
log.Error("Unable to get scheduled User[%d]: %v", scheduledPRM.DoerID, err)
281280
return
282281
}
283282

284-
perm, err := access_model.GetUserRepoPermission(ctx, pr.HeadRepo, doer)
285-
if err != nil {
286-
log.Error("GetUserRepoPermission %-v: %v", pr.HeadRepo, err)
287-
return
288-
}
289-
290-
if err := pull_service.CheckPullMergeable(ctx, doer, &perm, pr, pull_service.MergeCheckTypeGeneral, false); err != nil {
291-
if errors.Is(err, pull_service.ErrUserNotAllowedToMerge) {
292-
log.Info("%-v was scheduled to automerge by an unauthorized user", pr)
293-
return
294-
}
295-
log.Error("%-v CheckPullMergeable: %v", pr, err)
296-
return
297-
}
283+
// We don't check doer's permission here because their permissions have been checked
284+
// before ids were written to the auto_merge table
298285

299286
if err := pull_service.Merge(ctx, pr, doer, baseGitRepo, scheduledPRM.MergeStyle, "", scheduledPRM.Message, true); err != nil {
300287
log.Error("pull_service.Merge: %v", err)

services/pull/merge.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"code.gitea.io/gitea/models/db"
1818
git_model "code.gitea.io/gitea/models/git"
1919
issues_model "code.gitea.io/gitea/models/issues"
20+
"code.gitea.io/gitea/models/perm"
2021
access_model "code.gitea.io/gitea/models/perm/access"
2122
repo_model "code.gitea.io/gitea/models/repo"
2223
"code.gitea.io/gitea/models/unit"
@@ -331,6 +332,9 @@ func doMergeAndPush(ctx context.Context, pr *issues_model.PullRequest, doer *use
331332
)
332333

333334
mergeCtx.env = append(mergeCtx.env, repo_module.EnvPushTrigger+"="+string(pushTrigger))
335+
if pushTrigger == repo_module.PushTriggerPRMergeToBase {
336+
mergeCtx.env = append(mergeCtx.env, fmt.Sprintf("%s=%d", repo_module.EnvActionPerm, perm.AccessModeWrite))
337+
}
334338
pushCmd := git.NewCommand(ctx, "push", "origin").AddDynamicArguments(baseBranch + ":" + git.BranchPrefix + pr.BaseBranch)
335339

336340
// Push back to upstream.

0 commit comments

Comments
 (0)