From f7eb4918d4f4afb75629ecaacd5e646df3f3e00a Mon Sep 17 00:00:00 2001 From: nachtjasmin Date: Fri, 28 Nov 2025 07:57:31 +0100 Subject: [PATCH] chore: move code for manual merges into merge_manual.go (#10141) This is merely a small refactoring, aimed to reduce the diff size of #10129. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10141 Reviewed-by: Michael Kriese Reviewed-by: Gusted Co-authored-by: nachtjasmin Co-committed-by: nachtjasmin --- services/pull/check.go | 63 --------------- services/pull/merge.go | 68 ---------------- services/pull/merge_manual.go | 145 ++++++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 131 deletions(-) create mode 100644 services/pull/merge_manual.go diff --git a/services/pull/check.go b/services/pull/check.go index c31d107605..64bddf497c 100644 --- a/services/pull/check.go +++ b/services/pull/check.go @@ -17,7 +17,6 @@ import ( issues_model "forgejo.org/models/issues" access_model "forgejo.org/models/perm/access" repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" user_model "forgejo.org/models/user" "forgejo.org/modules/git" "forgejo.org/modules/gitrepo" @@ -25,9 +24,7 @@ import ( "forgejo.org/modules/log" "forgejo.org/modules/process" "forgejo.org/modules/queue" - "forgejo.org/modules/timeutil" asymkey_service "forgejo.org/services/asymkey" - notify_service "forgejo.org/services/notify" shared_automerge "forgejo.org/services/shared/automerge" ) @@ -253,66 +250,6 @@ func getMergeCommit(ctx context.Context, pr *issues_model.PullRequest) (*git.Com return commit, nil } -// manuallyMerged checks if a pull request got manually merged -// When a pull request got manually merged mark the pull request as merged -func manuallyMerged(ctx context.Context, pr *issues_model.PullRequest) bool { - if err := pr.LoadBaseRepo(ctx); err != nil { - log.Error("%-v LoadBaseRepo: %v", pr, err) - return false - } - - if unit, err := pr.BaseRepo.GetUnit(ctx, unit.TypePullRequests); err == nil { - config := unit.PullRequestsConfig() - if !config.AutodetectManualMerge { - return false - } - } else { - log.Error("%-v BaseRepo.GetUnit(unit.TypePullRequests): %v", pr, err) - return false - } - - commit, err := getMergeCommit(ctx, pr) - if err != nil { - log.Error("%-v getMergeCommit: %v", pr, err) - return false - } - - if commit == nil { - // no merge commit found - return false - } - - pr.MergedCommitID = commit.ID.String() - pr.MergedUnix = timeutil.TimeStamp(commit.Author.When.Unix()) - pr.Status = issues_model.PullRequestStatusManuallyMerged - merger, _ := user_model.GetUserByEmail(ctx, commit.Author.Email) - - // When the commit author is unknown set the BaseRepo owner as merger - if merger == nil { - if pr.BaseRepo.Owner == nil { - if err = pr.BaseRepo.LoadOwner(ctx); err != nil { - log.Error("%-v BaseRepo.LoadOwner: %v", pr, err) - return false - } - } - merger = pr.BaseRepo.Owner - } - pr.Merger = merger - pr.MergerID = merger.ID - - if merged, err := pr.SetMerged(ctx); err != nil { - log.Error("%-v setMerged : %v", pr, err) - return false - } else if !merged { - return false - } - - notify_service.MergePullRequest(ctx, merger, pr) - - log.Info("manuallyMerged[%-v]: Marked as manually merged into %s/%s by commit id: %s", pr, pr.BaseRepo.Name, pr.BaseBranch, commit.ID.String()) - return true -} - // InitializePullRequests checks and tests untested patches of pull requests. func InitializePullRequests(ctx context.Context) { prs, err := issues_model.GetPullRequestIDsByCheckStatus(ctx, issues_model.PullRequestStatusChecking) diff --git a/services/pull/merge.go b/services/pull/merge.go index a2542176f0..a591ce4de2 100644 --- a/services/pull/merge.go +++ b/services/pull/merge.go @@ -6,7 +6,6 @@ package pull import ( "context" - "errors" "fmt" "net/url" "os" @@ -17,7 +16,6 @@ import ( "unicode" "forgejo.org/models" - "forgejo.org/models/db" git_model "forgejo.org/models/git" issues_model "forgejo.org/models/issues" access_model "forgejo.org/models/perm/access" @@ -30,7 +28,6 @@ import ( "forgejo.org/modules/references" repo_module "forgejo.org/modules/repository" "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" issue_service "forgejo.org/services/issue" notify_service "forgejo.org/services/notify" ) @@ -583,68 +580,3 @@ func CheckPullBranchProtections(ctx context.Context, pr *issues_model.PullReques return nil, nil } - -// MergedManually mark pr as merged manually -func MergedManually(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.User, baseGitRepo *git.Repository, commitID string) error { - pullWorkingPool.CheckIn(fmt.Sprint(pr.ID)) - defer pullWorkingPool.CheckOut(fmt.Sprint(pr.ID)) - - if err := db.WithTx(ctx, func(ctx context.Context) error { - if err := pr.LoadBaseRepo(ctx); err != nil { - return err - } - prUnit, err := pr.BaseRepo.GetUnit(ctx, unit.TypePullRequests) - if err != nil { - return err - } - prConfig := prUnit.PullRequestsConfig() - - // Check if merge style is correct and allowed - if !prConfig.IsMergeStyleAllowed(repo_model.MergeStyleManuallyMerged) { - return models.ErrInvalidMergeStyle{ID: pr.BaseRepo.ID, Style: repo_model.MergeStyleManuallyMerged} - } - - objectFormat := git.ObjectFormatFromName(pr.BaseRepo.ObjectFormatName) - if len(commitID) != objectFormat.FullLength() { - return errors.New("Wrong commit ID") - } - - commit, err := baseGitRepo.GetCommit(commitID) - if err != nil { - if git.IsErrNotExist(err) { - return errors.New("Wrong commit ID") - } - return err - } - commitID = commit.ID.String() - - ok, err := baseGitRepo.IsCommitInBranch(commitID, pr.BaseBranch) - if err != nil { - return err - } - if !ok { - return errors.New("Wrong commit ID") - } - - pr.MergedCommitID = commitID - pr.MergedUnix = timeutil.TimeStamp(commit.Author.When.Unix()) - pr.Status = issues_model.PullRequestStatusManuallyMerged - pr.Merger = doer - pr.MergerID = doer.ID - - var merged bool - if merged, err = pr.SetMerged(ctx); err != nil { - return err - } else if !merged { - return errors.New("SetMerged failed") - } - return nil - }); err != nil { - return err - } - - notify_service.MergePullRequest(baseGitRepo.Ctx, doer, pr) - log.Info("manuallyMerged[%d]: Marked as manually merged into %s/%s by commit id: %s", pr.ID, pr.BaseRepo.Name, pr.BaseBranch, commitID) - - return handleCloseCrossReferences(ctx, pr, doer) -} diff --git a/services/pull/merge_manual.go b/services/pull/merge_manual.go new file mode 100644 index 0000000000..3e4464a434 --- /dev/null +++ b/services/pull/merge_manual.go @@ -0,0 +1,145 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT +package pull + +import ( + "context" + "errors" + "fmt" + + "forgejo.org/models" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/timeutil" + notify_service "forgejo.org/services/notify" +) + +// MergedManually mark pr as merged manually +func MergedManually(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.User, baseGitRepo *git.Repository, commitID string) error { + pullWorkingPool.CheckIn(fmt.Sprint(pr.ID)) + defer pullWorkingPool.CheckOut(fmt.Sprint(pr.ID)) + + if err := db.WithTx(ctx, func(ctx context.Context) error { + if err := pr.LoadBaseRepo(ctx); err != nil { + return err + } + prUnit, err := pr.BaseRepo.GetUnit(ctx, unit.TypePullRequests) + if err != nil { + return err + } + prConfig := prUnit.PullRequestsConfig() + + // Check if merge style is correct and allowed + if !prConfig.IsMergeStyleAllowed(repo_model.MergeStyleManuallyMerged) { + return models.ErrInvalidMergeStyle{ID: pr.BaseRepo.ID, Style: repo_model.MergeStyleManuallyMerged} + } + + objectFormat := git.ObjectFormatFromName(pr.BaseRepo.ObjectFormatName) + if len(commitID) != objectFormat.FullLength() { + return errors.New("Wrong commit ID") + } + + commit, err := baseGitRepo.GetCommit(commitID) + if err != nil { + if git.IsErrNotExist(err) { + return errors.New("Wrong commit ID") + } + return err + } + commitID = commit.ID.String() + + ok, err := baseGitRepo.IsCommitInBranch(commitID, pr.BaseBranch) + if err != nil { + return err + } + if !ok { + return errors.New("Wrong commit ID") + } + + pr.MergedCommitID = commitID + pr.MergedUnix = timeutil.TimeStamp(commit.Author.When.Unix()) + pr.Status = issues_model.PullRequestStatusManuallyMerged + pr.Merger = doer + pr.MergerID = doer.ID + + var merged bool + if merged, err = pr.SetMerged(ctx); err != nil { + return err + } else if !merged { + return errors.New("SetMerged failed") + } + return nil + }); err != nil { + return err + } + + notify_service.MergePullRequest(baseGitRepo.Ctx, doer, pr) + log.Info("manuallyMerged[%d]: Marked as manually merged into %s/%s by commit id: %s", pr.ID, pr.BaseRepo.Name, pr.BaseBranch, commitID) + + return handleCloseCrossReferences(ctx, pr, doer) +} + +// manuallyMerged checks if a pull request got manually merged +// When a pull request got manually merged mark the pull request as merged +func manuallyMerged(ctx context.Context, pr *issues_model.PullRequest) bool { + if err := pr.LoadBaseRepo(ctx); err != nil { + log.Error("%-v LoadBaseRepo: %v", pr, err) + return false + } + + if unit, err := pr.BaseRepo.GetUnit(ctx, unit.TypePullRequests); err == nil { + config := unit.PullRequestsConfig() + if !config.AutodetectManualMerge { + return false + } + } else { + log.Error("%-v BaseRepo.GetUnit(unit.TypePullRequests): %v", pr, err) + return false + } + + commit, err := getMergeCommit(ctx, pr) + if err != nil { + log.Error("%-v getMergeCommit: %v", pr, err) + return false + } + + if commit == nil { + // no merge commit found + return false + } + + pr.MergedCommitID = commit.ID.String() + pr.MergedUnix = timeutil.TimeStamp(commit.Author.When.Unix()) + pr.Status = issues_model.PullRequestStatusManuallyMerged + merger, _ := user_model.GetUserByEmail(ctx, commit.Author.Email) + + // When the commit author is unknown set the BaseRepo owner as merger + if merger == nil { + if pr.BaseRepo.Owner == nil { + if err = pr.BaseRepo.LoadOwner(ctx); err != nil { + log.Error("%-v BaseRepo.LoadOwner: %v", pr, err) + return false + } + } + merger = pr.BaseRepo.Owner + } + pr.Merger = merger + pr.MergerID = merger.ID + + if merged, err := pr.SetMerged(ctx); err != nil { + log.Error("%-v setMerged : %v", pr, err) + return false + } else if !merged { + return false + } + + notify_service.MergePullRequest(ctx, merger, pr) + + log.Info("manuallyMerged[%-v]: Marked as manually merged into %s/%s by commit id: %s", pr, pr.BaseRepo.Name, pr.BaseBranch, commit.ID.String()) + return true +}