Skip to content

Commit 3d4c608

Browse files
committed
Fix merge/automerge a pull request from actions runner task
1 parent d612a24 commit 3d4c608

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
@@ -323,7 +323,7 @@ func HookPostReceive(ctx *gitea_context.PrivateContext) {
323323

324324
func loadContextCacheUser(ctx context.Context, id int64) (*user_model.User, error) {
325325
return cache.GetWithContextCache(ctx, "hook_post_receive_user", id, func() (*user_model.User, error) {
326-
return user_model.GetUserByID(ctx, id)
326+
return user_model.GetPossibleUserByID(ctx, id)
327327
})
328328
}
329329

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"
@@ -263,26 +261,15 @@ func handlePullRequestAutoMerge(pullID int64, sha string) {
263261
}
264262

265263
// Merge if all checks succeeded
266-
doer, err := user_model.GetUserByID(ctx, scheduledPRM.DoerID)
264+
// Use GetPossibleUserByID to allow merging by deleted users or bot users
265+
doer, err := user_model.GetPossibleUserByID(ctx, scheduledPRM.DoerID)
267266
if err != nil {
268267
log.Error("Unable to get scheduled User[%d]: %v", scheduledPRM.DoerID, err)
269268
return
270269
}
271270

272-
perm, err := access_model.GetUserRepoPermission(ctx, pr.HeadRepo, doer)
273-
if err != nil {
274-
log.Error("GetUserRepoPermission %-v: %v", pr.HeadRepo, err)
275-
return
276-
}
277-
278-
if err := pull_service.CheckPullMergeable(ctx, doer, &perm, pr, pull_service.MergeCheckTypeGeneral, false); err != nil {
279-
if errors.Is(pull_service.ErrUserNotAllowedToMerge, err) {
280-
log.Info("%-v was scheduled to automerge by an unauthorized user", pr)
281-
return
282-
}
283-
log.Error("%-v CheckPullMergeable: %v", pr, err)
284-
return
285-
}
271+
// We don't check doer's permission here because their permissions have been checked
272+
// before ids were written to the auto_merge table
286273

287274
if err := pull_service.Merge(ctx, pr, doer, baseGitRepo, scheduledPRM.MergeStyle, "", scheduledPRM.Message, true); err != nil {
288275
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"
@@ -311,6 +312,9 @@ func doMergeAndPush(ctx context.Context, pr *issues_model.PullRequest, doer *use
311312
)
312313

313314
mergeCtx.env = append(mergeCtx.env, repo_module.EnvPushTrigger+"="+string(pushTrigger))
315+
if pushTrigger == repo_module.PushTriggerPRMergeToBase {
316+
mergeCtx.env = append(mergeCtx.env, fmt.Sprintf("%s=%d", repo_module.EnvActionPerm, perm.AccessModeWrite))
317+
}
314318
pushCmd := git.NewCommand(ctx, "push", "origin").AddDynamicArguments(baseBranch + ":" + git.BranchPrefix + pr.BaseBranch)
315319

316320
// Push back to upstream.

0 commit comments

Comments
 (0)