diff --git a/cmd/hook.go b/cmd/hook.go index 11d0d072c9..b1ece0ede9 100644 --- a/cmd/hook.go +++ b/cmd/hook.go @@ -197,6 +197,7 @@ Gitea or set your environment appropriately.`, "") PullRequestID: prID, DeployKeyID: deployKeyID, ActionPerm: int(actionPerm), + PushTrigger: repo_module.PushTrigger(os.Getenv(repo_module.EnvPushTrigger)), } scanner := bufio.NewScanner(os.Stdin) diff --git a/models/pull/automerge.go b/models/pull/automerge.go index f69fcb60d1..f31159a8d8 100644 --- a/models/pull/automerge.go +++ b/models/pull/automerge.go @@ -74,7 +74,7 @@ func GetScheduledMergeByPullID(ctx context.Context, pullID int64) (bool, *AutoMe return false, nil, err } - doer, err := user_model.GetUserByID(ctx, scheduledPRM.DoerID) + doer, err := user_model.GetPossibleUserByID(ctx, scheduledPRM.DoerID) if err != nil { return false, nil, err } diff --git a/routers/private/hook_post_receive.go b/routers/private/hook_post_receive.go index 5c01216356..9b8430d6c1 100644 --- a/routers/private/hook_post_receive.go +++ b/routers/private/hook_post_receive.go @@ -332,7 +332,7 @@ func HookPostReceive(ctx *gitea_context.PrivateContext) { func loadContextCacheUser(ctx context.Context, id int64) (*user_model.User, error) { return cache.GetWithContextCache(ctx, "hook_post_receive_user", id, func() (*user_model.User, error) { - return user_model.GetUserByID(ctx, id) + return user_model.GetPossibleUserByID(ctx, id) }) } diff --git a/services/automerge/automerge.go b/services/automerge/automerge.go index a1ee204882..361eae9e47 100644 --- a/services/automerge/automerge.go +++ b/services/automerge/automerge.go @@ -5,14 +5,12 @@ package automerge import ( "context" - "errors" "fmt" "strconv" "strings" "code.gitea.io/gitea/models/db" issues_model "code.gitea.io/gitea/models/issues" - access_model "code.gitea.io/gitea/models/perm/access" pull_model "code.gitea.io/gitea/models/pull" repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" @@ -275,26 +273,15 @@ func handlePullRequestAutoMerge(pullID int64, sha string) { } // Merge if all checks succeeded - doer, err := user_model.GetUserByID(ctx, scheduledPRM.DoerID) + // Use GetPossibleUserByID to allow merging by deleted users or bot users + doer, err := user_model.GetPossibleUserByID(ctx, scheduledPRM.DoerID) if err != nil { log.Error("Unable to get scheduled User[%d]: %v", scheduledPRM.DoerID, err) return } - perm, err := access_model.GetUserRepoPermission(ctx, pr.HeadRepo, doer) - if err != nil { - log.Error("GetUserRepoPermission %-v: %v", pr.HeadRepo, err) - return - } - - if err := pull_service.CheckPullMergeable(ctx, doer, &perm, pr, pull_service.MergeCheckTypeGeneral, false); err != nil { - if errors.Is(err, pull_service.ErrUserNotAllowedToMerge) { - log.Info("%-v was scheduled to automerge by an unauthorized user", pr) - return - } - log.Error("%-v CheckPullMergeable: %v", pr, err) - return - } + // We don't check doer's permission here because their permissions have been checked + // before ids were written to the auto_merge table if err := pull_service.Merge(ctx, pr, doer, baseGitRepo, scheduledPRM.MergeStyle, "", scheduledPRM.Message, true); err != nil { log.Error("pull_service.Merge: %v", err) diff --git a/services/pull/merge.go b/services/pull/merge.go index a3fbe4f627..03da80c905 100644 --- a/services/pull/merge.go +++ b/services/pull/merge.go @@ -17,6 +17,7 @@ import ( "code.gitea.io/gitea/models/db" git_model "code.gitea.io/gitea/models/git" issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/perm" access_model "code.gitea.io/gitea/models/perm/access" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" @@ -331,6 +332,9 @@ func doMergeAndPush(ctx context.Context, pr *issues_model.PullRequest, doer *use ) mergeCtx.env = append(mergeCtx.env, repo_module.EnvPushTrigger+"="+string(pushTrigger)) + if pushTrigger == repo_module.PushTriggerPRMergeToBase { + mergeCtx.env = append(mergeCtx.env, fmt.Sprintf("%s=%d", repo_module.EnvActionPerm, perm.AccessModeWrite)) + } pushCmd := git.NewCommand(ctx, "push", "origin").AddDynamicArguments(baseBranch + ":" + git.BranchPrefix + pr.BaseBranch) // Push back to upstream.