From eaf179570bf1b34f743fbe57484ecad948535405 Mon Sep 17 00:00:00 2001 From: hiifong Date: Mon, 11 Aug 2025 11:07:11 +0800 Subject: [PATCH 1/9] squash merge message --- routers/web/repo/issue_view.go | 49 ++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/routers/web/repo/issue_view.go b/routers/web/repo/issue_view.go index d0064e763ef82..c18e5e6213309 100644 --- a/routers/web/repo/issue_view.go +++ b/routers/web/repo/issue_view.go @@ -389,6 +389,7 @@ func ViewIssue(ctx *context.Context) { prepareIssueViewSidebarPin, func(ctx *context.Context, issue *issues_model.Issue) { preparePullViewPullInfo(ctx, issue) }, preparePullViewReviewAndMerge, + prepareIssueViewSquashMergeMsg, } for _, prepareFunc := range prepareFuncs { @@ -442,6 +443,7 @@ func ViewPullMergeBox(ctx *context.Context) { } preparePullViewPullInfo(ctx, issue) preparePullViewReviewAndMerge(ctx, issue) + prepareIssueViewSquashMergeMsg(ctx, issue) ctx.Data["PullMergeBoxReloading"] = issue.PullRequest.IsChecking() // TODO: it should use a dedicated struct to render the pull merge box, to make sure all data is prepared correctly @@ -928,14 +930,6 @@ func preparePullViewReviewAndMerge(ctx *context.Context, issue *issues_model.Iss ctx.Data["DefaultMergeMessage"] = defaultMergeMessage ctx.Data["DefaultMergeBody"] = defaultMergeBody - defaultSquashMergeMessage, defaultSquashMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, repo_model.MergeStyleSquash) - if err != nil { - ctx.ServerError("GetDefaultSquashMergeMessage", err) - return - } - ctx.Data["DefaultSquashMergeMessage"] = defaultSquashMergeMessage - ctx.Data["DefaultSquashMergeBody"] = defaultSquashMergeBody - pb, err := git_model.GetFirstMatchProtectedBranchRule(ctx, pull.BaseRepoID, pull.BaseBranch) if err != nil { ctx.ServerError("LoadProtectedBranch", err) @@ -1006,3 +1000,42 @@ func prepareIssueViewContent(ctx *context.Context, issue *issues_model.Issue) { return } } + +func getIssueViewSquashMergeCommits(ctx *context.Context, issue *issues_model.Issue) (string, error) { + pull := issue.PullRequest + pull.Issue = issue + + baseCommit := GetMergedBaseCommitID(ctx, issue) + + compareInfo, err := ctx.Repo.GitRepo.GetCompareInfo(ctx.Repo.Repository.RepoPath(), + baseCommit, pull.GetGitHeadRefName(), false, false) + if err != nil { + return "", err + } + + commits := "" + for _, c := range compareInfo.Commits { + commits += fmt.Sprintf("* %s\n", c.CommitMessage) + } + + return commits, nil +} + +func prepareIssueViewSquashMergeMsg(ctx *context.Context, issue *issues_model.Issue) { + pull := issue.PullRequest + + defaultSquashMergeMessage, defaultSquashMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, repo_model.MergeStyleSquash) + if err != nil { + ctx.ServerError("GetDefaultSquashMergeMessage", err) + return + } + + commitsMsg, err := getIssueViewSquashMergeCommits(ctx, issue) + if err != nil { + ctx.ServerError("getIssueViewSquashMergeCommits", err) + return + } + + ctx.Data["DefaultSquashMergeMessage"] = defaultSquashMergeMessage + ctx.Data["DefaultSquashMergeBody"] = fmt.Sprintf("--------------------\n%s\n%s", commitsMsg, defaultSquashMergeBody) +} From 3df6e9397aed1c184c6f28ca7a661029ab2d128e Mon Sep 17 00:00:00 2001 From: hiifong Date: Mon, 11 Aug 2025 11:47:53 +0800 Subject: [PATCH 2/9] fix bug --- routers/web/repo/issue_view.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/routers/web/repo/issue_view.go b/routers/web/repo/issue_view.go index c18e5e6213309..9805e2fa63fe8 100644 --- a/routers/web/repo/issue_view.go +++ b/routers/web/repo/issue_view.go @@ -389,7 +389,10 @@ func ViewIssue(ctx *context.Context) { prepareIssueViewSidebarPin, func(ctx *context.Context, issue *issues_model.Issue) { preparePullViewPullInfo(ctx, issue) }, preparePullViewReviewAndMerge, - prepareIssueViewSquashMergeMsg, + } + + if ctx.PathParam("type") == "pulls" { + prepareFuncs = append(prepareFuncs, prepareIssueViewSquashMergeMsg) } for _, prepareFunc := range prepareFuncs { From 1e67f18f255b1249f5a9e05734ffbb3971e8e69b Mon Sep 17 00:00:00 2001 From: hiifong Date: Mon, 11 Aug 2025 11:51:50 +0800 Subject: [PATCH 3/9] fix bug --- routers/web/repo/issue_view.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/web/repo/issue_view.go b/routers/web/repo/issue_view.go index 9805e2fa63fe8..e51d1b5cdc36e 100644 --- a/routers/web/repo/issue_view.go +++ b/routers/web/repo/issue_view.go @@ -391,7 +391,7 @@ func ViewIssue(ctx *context.Context) { preparePullViewReviewAndMerge, } - if ctx.PathParam("type") == "pulls" { + if issue.IsPull { prepareFuncs = append(prepareFuncs, prepareIssueViewSquashMergeMsg) } From 5039cc98ac0bea990c0c9ecf9b96fd5fd4e18c55 Mon Sep 17 00:00:00 2001 From: hiifong Date: Mon, 11 Aug 2025 12:17:35 +0800 Subject: [PATCH 4/9] Update --- routers/web/repo/issue_view.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/routers/web/repo/issue_view.go b/routers/web/repo/issue_view.go index e51d1b5cdc36e..7f6f2c569c73c 100644 --- a/routers/web/repo/issue_view.go +++ b/routers/web/repo/issue_view.go @@ -392,7 +392,7 @@ func ViewIssue(ctx *context.Context) { } if issue.IsPull { - prepareFuncs = append(prepareFuncs, prepareIssueViewSquashMergeMsg) + prepareFuncs = append(prepareFuncs, preparePullViewSquashMergeMsg) } for _, prepareFunc := range prepareFuncs { @@ -446,7 +446,7 @@ func ViewPullMergeBox(ctx *context.Context) { } preparePullViewPullInfo(ctx, issue) preparePullViewReviewAndMerge(ctx, issue) - prepareIssueViewSquashMergeMsg(ctx, issue) + preparePullViewSquashMergeMsg(ctx, issue) ctx.Data["PullMergeBoxReloading"] = issue.PullRequest.IsChecking() // TODO: it should use a dedicated struct to render the pull merge box, to make sure all data is prepared correctly @@ -1024,7 +1024,7 @@ func getIssueViewSquashMergeCommits(ctx *context.Context, issue *issues_model.Is return commits, nil } -func prepareIssueViewSquashMergeMsg(ctx *context.Context, issue *issues_model.Issue) { +func preparePullViewSquashMergeMsg(ctx *context.Context, issue *issues_model.Issue) { pull := issue.PullRequest defaultSquashMergeMessage, defaultSquashMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, repo_model.MergeStyleSquash) From 11c3f7f900c00dbd558a72942af2bb6e97c44b5d Mon Sep 17 00:00:00 2001 From: hiifong Date: Mon, 11 Aug 2025 12:20:11 +0800 Subject: [PATCH 5/9] Update --- routers/web/repo/issue_view.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routers/web/repo/issue_view.go b/routers/web/repo/issue_view.go index 7f6f2c569c73c..a75ba758ebd21 100644 --- a/routers/web/repo/issue_view.go +++ b/routers/web/repo/issue_view.go @@ -1004,7 +1004,7 @@ func prepareIssueViewContent(ctx *context.Context, issue *issues_model.Issue) { } } -func getIssueViewSquashMergeCommits(ctx *context.Context, issue *issues_model.Issue) (string, error) { +func getPullViewSquashMergeCommits(ctx *context.Context, issue *issues_model.Issue) (string, error) { pull := issue.PullRequest pull.Issue = issue @@ -1033,7 +1033,7 @@ func preparePullViewSquashMergeMsg(ctx *context.Context, issue *issues_model.Iss return } - commitsMsg, err := getIssueViewSquashMergeCommits(ctx, issue) + commitsMsg, err := getPullViewSquashMergeCommits(ctx, issue) if err != nil { ctx.ServerError("getIssueViewSquashMergeCommits", err) return From 485a27ccdd6259378909b88feac34d5c772e315f Mon Sep 17 00:00:00 2001 From: hiifong Date: Mon, 11 Aug 2025 14:45:03 +0800 Subject: [PATCH 6/9] Update --- routers/web/repo/issue_view.go | 42 +++++++++++++++------------------- routers/web/repo/pull.go | 2 +- services/pull/pull.go | 39 ++++++++++++++++--------------- 3 files changed, 39 insertions(+), 44 deletions(-) diff --git a/routers/web/repo/issue_view.go b/routers/web/repo/issue_view.go index a75ba758ebd21..c89391dc7416a 100644 --- a/routers/web/repo/issue_view.go +++ b/routers/web/repo/issue_view.go @@ -391,10 +391,6 @@ func ViewIssue(ctx *context.Context) { preparePullViewReviewAndMerge, } - if issue.IsPull { - prepareFuncs = append(prepareFuncs, preparePullViewSquashMergeMsg) - } - for _, prepareFunc := range prepareFuncs { prepareFunc(ctx, issue) if ctx.Written() { @@ -446,7 +442,6 @@ func ViewPullMergeBox(ctx *context.Context) { } preparePullViewPullInfo(ctx, issue) preparePullViewReviewAndMerge(ctx, issue) - preparePullViewSquashMergeMsg(ctx, issue) ctx.Data["PullMergeBoxReloading"] = issue.PullRequest.IsChecking() // TODO: it should use a dedicated struct to render the pull merge box, to make sure all data is prepared correctly @@ -933,6 +928,24 @@ func preparePullViewReviewAndMerge(ctx *context.Context, issue *issues_model.Iss ctx.Data["DefaultMergeMessage"] = defaultMergeMessage ctx.Data["DefaultMergeBody"] = defaultMergeBody + defaultSquashMergeMessage, defaultSquashMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, repo_model.MergeStyleSquash) + if err != nil { + ctx.ServerError("GetDefaultSquashMergeMessage", err) + return + } + _, coAuthors := pull_service.GetSquashMergeCommitMessages(ctx, pull) + + defaultSquashMergeBody += fmt.Sprintf("\n%s", coAuthors) + + commitsMsg, err := getPullViewSquashMergeCommits(ctx, issue) + if err != nil { + ctx.ServerError("getIssueViewSquashMergeCommits", err) + return + } + + ctx.Data["DefaultSquashMergeMessage"] = defaultSquashMergeMessage + ctx.Data["DefaultSquashMergeBody"] = fmt.Sprintf("--------------------\n%s\n%s", commitsMsg, defaultSquashMergeBody) + pb, err := git_model.GetFirstMatchProtectedBranchRule(ctx, pull.BaseRepoID, pull.BaseBranch) if err != nil { ctx.ServerError("LoadProtectedBranch", err) @@ -1023,22 +1036,3 @@ func getPullViewSquashMergeCommits(ctx *context.Context, issue *issues_model.Iss return commits, nil } - -func preparePullViewSquashMergeMsg(ctx *context.Context, issue *issues_model.Issue) { - pull := issue.PullRequest - - defaultSquashMergeMessage, defaultSquashMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, repo_model.MergeStyleSquash) - if err != nil { - ctx.ServerError("GetDefaultSquashMergeMessage", err) - return - } - - commitsMsg, err := getPullViewSquashMergeCommits(ctx, issue) - if err != nil { - ctx.ServerError("getIssueViewSquashMergeCommits", err) - return - } - - ctx.Data["DefaultSquashMergeMessage"] = defaultSquashMergeMessage - ctx.Data["DefaultSquashMergeBody"] = fmt.Sprintf("--------------------\n%s\n%s", commitsMsg, defaultSquashMergeBody) -} diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index bc58efeb6f693..cfad56c11e226 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -430,7 +430,7 @@ func prepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C ctx.ServerError("IsUserAllowedToUpdate", err) return nil } - ctx.Data["GetCommitMessages"] = pull_service.GetSquashMergeCommitMessages(ctx, pull) + ctx.Data["GetCommitMessages"], _ = pull_service.GetSquashMergeCommitMessages(ctx, pull) } else { ctx.Data["GetCommitMessages"] = "" } diff --git a/services/pull/pull.go b/services/pull/pull.go index e55d4f5bb194f..dd1688d47ffcb 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -784,15 +784,15 @@ func CloseRepoBranchesPulls(ctx context.Context, doer *user_model.User, repo *re var commitMessageTrailersPattern = regexp.MustCompile(`(?:^|\n\n)(?:[\w-]+[ \t]*:[^\n]+\n*(?:[ \t]+[^\n]+\n*)*)+$`) // GetSquashMergeCommitMessages returns the commit messages between head and merge base (if there is one) -func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequest) string { +func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequest) (string, string) { if err := pr.LoadIssue(ctx); err != nil { log.Error("Cannot load issue %d for PR id %d: Error: %v", pr.IssueID, pr.ID, err) - return "" + return "", "" } if err := pr.Issue.LoadPoster(ctx); err != nil { log.Error("Cannot load poster %d for pr id %d, index %d Error: %v", pr.Issue.PosterID, pr.ID, pr.Index, err) - return "" + return "", "" } if pr.HeadRepo == nil { @@ -800,14 +800,14 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ pr.HeadRepo, err = repo_model.GetRepositoryByID(ctx, pr.HeadRepoID) if err != nil { log.Error("GetRepositoryByIdCtx[%d]: %v", pr.HeadRepoID, err) - return "" + return "", "" } } gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.HeadRepo) if err != nil { log.Error("Unable to open head repository: Error: %v", err) - return "" + return "", "" } defer closer.Close() @@ -818,19 +818,19 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ pr.HeadCommitID, err = gitRepo.GetRefCommitID(pr.GetGitHeadRefName()) if err != nil { log.Error("Unable to get head commit: %s Error: %v", pr.GetGitHeadRefName(), err) - return "" + return "", "" } headCommit, err = gitRepo.GetCommit(pr.HeadCommitID) } if err != nil { log.Error("Unable to get head commit: %s Error: %v", pr.HeadBranch, err) - return "" + return "", "" } mergeBase, err := gitRepo.GetCommit(pr.MergeBase) if err != nil { log.Error("Unable to get merge base commit: %s Error: %v", pr.MergeBase, err) - return "" + return "", "" } limit := setting.Repository.PullRequest.DefaultMergeMessageCommitsLimit @@ -838,7 +838,7 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ commits, err := gitRepo.CommitsBetweenLimit(headCommit, mergeBase, limit, 0) if err != nil { log.Error("Unable to get commits between: %s %s Error: %v", pr.HeadBranch, pr.MergeBase, err) - return "" + return "", "" } posterSig := pr.Issue.Poster.NewGitSig().String() @@ -846,6 +846,7 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ uniqueAuthors := make(container.Set[string]) authors := make([]string, 0, len(commits)) stringBuilder := strings.Builder{} + coAuthorStringBuilder := strings.Builder{} if !setting.Repository.PullRequest.PopulateSquashCommentWithCommitMessages { message := strings.TrimSpace(pr.Issue.Content) @@ -879,12 +880,12 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ } if _, err := stringBuilder.Write(toWrite); err != nil { log.Error("Unable to write commit message Error: %v", err) - return "" + return "", "" } if _, err := stringBuilder.WriteRune('\n'); err != nil { log.Error("Unable to write commit message Error: %v", err) - return "" + return "", "" } } } @@ -908,7 +909,7 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ commits, err := gitRepo.CommitsBetweenLimit(headCommit, mergeBase, limit, skip) if err != nil { log.Error("Unable to get commits between: %s %s Error: %v", pr.HeadBranch, pr.MergeBase, err) - return "" + return "", "" } if len(commits) == 0 { break @@ -927,21 +928,21 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ } for _, author := range authors { - if _, err := stringBuilder.WriteString("Co-authored-by: "); err != nil { + if _, err := coAuthorStringBuilder.WriteString("Co-authored-by: "); err != nil { log.Error("Unable to write to string builder Error: %v", err) - return "" + return "", "" } - if _, err := stringBuilder.WriteString(author); err != nil { + if _, err := coAuthorStringBuilder.WriteString(author); err != nil { log.Error("Unable to write to string builder Error: %v", err) - return "" + return "", "" } - if _, err := stringBuilder.WriteRune('\n'); err != nil { + if _, err := coAuthorStringBuilder.WriteRune('\n'); err != nil { log.Error("Unable to write to string builder Error: %v", err) - return "" + return "", "" } } - return stringBuilder.String() + return stringBuilder.String(), coAuthorStringBuilder.String() } // GetIssuesAllCommitStatus returns a map of issue ID to a list of all statuses for the most recent commit as well as a map of issue ID to only the commit's latest status From 2a2400102b7fc9850bd905908488d233bb43918d Mon Sep 17 00:00:00 2001 From: hiifong Date: Mon, 11 Aug 2025 14:48:32 +0800 Subject: [PATCH 7/9] Update --- routers/web/repo/issue_view.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/web/repo/issue_view.go b/routers/web/repo/issue_view.go index c89391dc7416a..1ca22da0aa0eb 100644 --- a/routers/web/repo/issue_view.go +++ b/routers/web/repo/issue_view.go @@ -939,7 +939,7 @@ func preparePullViewReviewAndMerge(ctx *context.Context, issue *issues_model.Iss commitsMsg, err := getPullViewSquashMergeCommits(ctx, issue) if err != nil { - ctx.ServerError("getIssueViewSquashMergeCommits", err) + ctx.ServerError("getPullViewSquashMergeCommits", err) return } From 5807ae0fc12ac77e9abbc9d1a1337c6e68bb09f8 Mon Sep 17 00:00:00 2001 From: hiifong Date: Mon, 11 Aug 2025 14:54:53 +0800 Subject: [PATCH 8/9] Update --- routers/web/repo/issue_view.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/routers/web/repo/issue_view.go b/routers/web/repo/issue_view.go index 1ca22da0aa0eb..13056dce007f2 100644 --- a/routers/web/repo/issue_view.go +++ b/routers/web/repo/issue_view.go @@ -10,6 +10,7 @@ import ( "net/url" "sort" "strconv" + "strings" activities_model "code.gitea.io/gitea/models/activities" "code.gitea.io/gitea/models/db" @@ -1029,10 +1030,12 @@ func getPullViewSquashMergeCommits(ctx *context.Context, issue *issues_model.Iss return "", err } - commits := "" + commitsBuilder := strings.Builder{} for _, c := range compareInfo.Commits { - commits += fmt.Sprintf("* %s\n", c.CommitMessage) + commitsBuilder.WriteString("* ") + commitsBuilder.WriteString(c.CommitMessage) + commitsBuilder.WriteRune('\n') } - return commits, nil + return commitsBuilder.String(), nil } From c318cd08b6f3a438f8b05ce1d651d4d7ca629cfe Mon Sep 17 00:00:00 2001 From: hiifong Date: Mon, 11 Aug 2025 15:07:21 +0800 Subject: [PATCH 9/9] fix lint --- routers/web/repo/issue_view.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/web/repo/issue_view.go b/routers/web/repo/issue_view.go index 13056dce007f2..18c1207144256 100644 --- a/routers/web/repo/issue_view.go +++ b/routers/web/repo/issue_view.go @@ -936,7 +936,7 @@ func preparePullViewReviewAndMerge(ctx *context.Context, issue *issues_model.Iss } _, coAuthors := pull_service.GetSquashMergeCommitMessages(ctx, pull) - defaultSquashMergeBody += fmt.Sprintf("\n%s", coAuthors) + defaultSquashMergeBody = fmt.Sprintf("%s\n%s", defaultSquashMergeBody, coAuthors) commitsMsg, err := getPullViewSquashMergeCommits(ctx, issue) if err != nil {