aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNaxdy <naxdy@naxdy.org>2025-07-10 19:17:56 +0200
committerGitHub <noreply@github.com>2025-07-10 17:17:56 +0000
commit32152a0ac03e912567a9d9a243729a9ed6288255 (patch)
tree1ad6f42246e6187a055ab0b6ae36875395c0dbaa
parentf35dcfd489490ec9ad552bb38afc237ad94ed5a2 (diff)
downloadgitea-32152a0ac03e912567a9d9a243729a9ed6288255.tar.gz
gitea-32152a0ac03e912567a9d9a243729a9ed6288255.zip
Also display "recently pushed branch" alert on PR view (#35001)
This commit adds the "You recently pushed to branch X" alert also to PR overview, as opposed to only the repository's home page. GitHub also shows this alert on the PR list, as well as the home page. --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: Giteabot <teabot@gitea.io>
-rw-r--r--models/git/branch.go2
-rw-r--r--models/repo/repo.go6
-rw-r--r--routers/web/repo/common_recentbranches.go73
-rw-r--r--routers/web/repo/issue_list.go4
-rw-r--r--routers/web/repo/view_home.go51
-rw-r--r--templates/repo/code/recently_pushed_new_branches.tmpl18
-rw-r--r--templates/repo/home.tmpl2
-rw-r--r--templates/repo/issue/list.tmpl2
-rw-r--r--templates/repo/view.tmpl2
9 files changed, 100 insertions, 60 deletions
diff --git a/models/git/branch.go b/models/git/branch.go
index 07c94a8ba5..6021e1101f 100644
--- a/models/git/branch.go
+++ b/models/git/branch.go
@@ -472,7 +472,7 @@ type RecentlyPushedNewBranch struct {
// if opts.CommitAfterUnix is 0, we will find the branches that were committed to in the last 2 hours
// if opts.ListOptions is not set, we will only display top 2 latest branches.
// Protected branches will be skipped since they are unlikely to be used to create new PRs.
-func FindRecentlyPushedNewBranches(ctx context.Context, doer *user_model.User, opts *FindRecentlyPushedNewBranchesOptions) ([]*RecentlyPushedNewBranch, error) {
+func FindRecentlyPushedNewBranches(ctx context.Context, doer *user_model.User, opts FindRecentlyPushedNewBranchesOptions) ([]*RecentlyPushedNewBranch, error) {
if doer == nil {
return []*RecentlyPushedNewBranch{}, nil
}
diff --git a/models/repo/repo.go b/models/repo/repo.go
index 34d1bf55f6..2403b3b40b 100644
--- a/models/repo/repo.go
+++ b/models/repo/repo.go
@@ -652,7 +652,13 @@ func (repo *Repository) AllowsPulls(ctx context.Context) bool {
}
// CanEnableEditor returns true if repository meets the requirements of web editor.
+// FIXME: most CanEnableEditor calls should be replaced with CanContentChange
+// And all other like CanCreateBranch / CanEnablePulls should also be updated
func (repo *Repository) CanEnableEditor() bool {
+ return repo.CanContentChange()
+}
+
+func (repo *Repository) CanContentChange() bool {
return !repo.IsMirror && !repo.IsArchived
}
diff --git a/routers/web/repo/common_recentbranches.go b/routers/web/repo/common_recentbranches.go
new file mode 100644
index 0000000000..c2083dec73
--- /dev/null
+++ b/routers/web/repo/common_recentbranches.go
@@ -0,0 +1,73 @@
+// Copyright 2025 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package repo
+
+import (
+ git_model "code.gitea.io/gitea/models/git"
+ access_model "code.gitea.io/gitea/models/perm/access"
+ unit_model "code.gitea.io/gitea/models/unit"
+ "code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/services/context"
+ repo_service "code.gitea.io/gitea/services/repository"
+)
+
+type RecentBranchesPromptDataStruct struct {
+ RecentlyPushedNewBranches []*git_model.RecentlyPushedNewBranch
+}
+
+func prepareRecentlyPushedNewBranches(ctx *context.Context) {
+ if ctx.Doer == nil {
+ return
+ }
+ if err := ctx.Repo.Repository.GetBaseRepo(ctx); err != nil {
+ log.Error("GetBaseRepo: %v", err)
+ return
+ }
+
+ opts := git_model.FindRecentlyPushedNewBranchesOptions{
+ Repo: ctx.Repo.Repository,
+ BaseRepo: ctx.Repo.Repository,
+ }
+ if ctx.Repo.Repository.IsFork {
+ opts.BaseRepo = ctx.Repo.Repository.BaseRepo
+ }
+
+ baseRepoPerm, err := access_model.GetUserRepoPermission(ctx, opts.BaseRepo, ctx.Doer)
+ if err != nil {
+ log.Error("GetUserRepoPermission: %v", err)
+ return
+ }
+ if !opts.Repo.CanContentChange() || !opts.BaseRepo.CanContentChange() {
+ return
+ }
+ if !opts.BaseRepo.UnitEnabled(ctx, unit_model.TypePullRequests) || !baseRepoPerm.CanRead(unit_model.TypePullRequests) {
+ return
+ }
+
+ var finalBranches []*git_model.RecentlyPushedNewBranch
+ branches, err := git_model.FindRecentlyPushedNewBranches(ctx, ctx.Doer, opts)
+ if err != nil {
+ log.Error("FindRecentlyPushedNewBranches failed: %v", err)
+ return
+ }
+
+ for _, branch := range branches {
+ divergingInfo, err := repo_service.GetBranchDivergingInfo(ctx,
+ branch.BranchRepo, branch.BranchName, // "base" repo for diverging info
+ opts.BaseRepo, opts.BaseRepo.DefaultBranch, // "head" repo for diverging info
+ )
+ if err != nil {
+ log.Error("GetBranchDivergingInfo failed: %v", err)
+ continue
+ }
+ branchRepoHasNewCommits := divergingInfo.BaseHasNewCommits
+ baseRepoCommitsBehind := divergingInfo.HeadCommitsBehind
+ if branchRepoHasNewCommits || baseRepoCommitsBehind > 0 {
+ finalBranches = append(finalBranches, branch)
+ }
+ }
+ if len(finalBranches) > 0 {
+ ctx.Data["RecentBranchesPromptData"] = RecentBranchesPromptDataStruct{finalBranches}
+ }
+}
diff --git a/routers/web/repo/issue_list.go b/routers/web/repo/issue_list.go
index b55f4bcc90..fd34422cfc 100644
--- a/routers/web/repo/issue_list.go
+++ b/routers/web/repo/issue_list.go
@@ -767,6 +767,10 @@ func Issues(ctx *context.Context) {
}
ctx.Data["Title"] = ctx.Tr("repo.pulls")
ctx.Data["PageIsPullList"] = true
+ prepareRecentlyPushedNewBranches(ctx)
+ if ctx.Written() {
+ return
+ }
} else {
MustEnableIssues(ctx)
if ctx.Written() {
diff --git a/routers/web/repo/view_home.go b/routers/web/repo/view_home.go
index c7396d44e3..5482780c98 100644
--- a/routers/web/repo/view_home.go
+++ b/routers/web/repo/view_home.go
@@ -15,7 +15,6 @@ import (
"code.gitea.io/gitea/models/db"
git_model "code.gitea.io/gitea/models/git"
- access_model "code.gitea.io/gitea/models/perm/access"
repo_model "code.gitea.io/gitea/models/repo"
unit_model "code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
@@ -196,56 +195,6 @@ func prepareUpstreamDivergingInfo(ctx *context.Context) {
ctx.Data["UpstreamDivergingInfo"] = upstreamDivergingInfo
}
-func prepareRecentlyPushedNewBranches(ctx *context.Context) {
- if ctx.Doer != nil {
- if err := ctx.Repo.Repository.GetBaseRepo(ctx); err != nil {
- ctx.ServerError("GetBaseRepo", err)
- return
- }
-
- opts := &git_model.FindRecentlyPushedNewBranchesOptions{
- Repo: ctx.Repo.Repository,
- BaseRepo: ctx.Repo.Repository,
- }
- if ctx.Repo.Repository.IsFork {
- opts.BaseRepo = ctx.Repo.Repository.BaseRepo
- }
-
- baseRepoPerm, err := access_model.GetUserRepoPermission(ctx, opts.BaseRepo, ctx.Doer)
- if err != nil {
- ctx.ServerError("GetUserRepoPermission", err)
- return
- }
-
- if !opts.Repo.IsMirror && !opts.BaseRepo.IsMirror &&
- opts.BaseRepo.UnitEnabled(ctx, unit_model.TypePullRequests) &&
- baseRepoPerm.CanRead(unit_model.TypePullRequests) {
- var finalBranches []*git_model.RecentlyPushedNewBranch
- branches, err := git_model.FindRecentlyPushedNewBranches(ctx, ctx.Doer, opts)
- if err != nil {
- log.Error("FindRecentlyPushedNewBranches failed: %v", err)
- }
-
- for _, branch := range branches {
- divergingInfo, err := repo_service.GetBranchDivergingInfo(ctx,
- branch.BranchRepo, branch.BranchName, // "base" repo for diverging info
- opts.BaseRepo, opts.BaseRepo.DefaultBranch, // "head" repo for diverging info
- )
- if err != nil {
- log.Error("GetBranchDivergingInfo failed: %v", err)
- continue
- }
- branchRepoHasNewCommits := divergingInfo.BaseHasNewCommits
- baseRepoCommitsBehind := divergingInfo.HeadCommitsBehind
- if branchRepoHasNewCommits || baseRepoCommitsBehind > 0 {
- finalBranches = append(finalBranches, branch)
- }
- }
- ctx.Data["RecentlyPushedNewBranches"] = finalBranches
- }
- }
-}
-
func updateContextRepoEmptyAndStatus(ctx *context.Context, empty bool, status repo_model.RepositoryStatus) {
if ctx.Repo.Repository.IsEmpty == empty && ctx.Repo.Repository.Status == status {
return
diff --git a/templates/repo/code/recently_pushed_new_branches.tmpl b/templates/repo/code/recently_pushed_new_branches.tmpl
index 4a864ba756..8569bd6c13 100644
--- a/templates/repo/code/recently_pushed_new_branches.tmpl
+++ b/templates/repo/code/recently_pushed_new_branches.tmpl
@@ -1,12 +1,18 @@
-{{range .RecentlyPushedNewBranches}}
- <div class="ui positive message tw-flex tw-items-center tw-gap-2">
- <div class="tw-flex-1 tw-break-anywhere">
- {{$timeSince := DateUtils.TimeSince .CommitTime}}
- {{$branchLink := HTMLFormat `<a href="%s">%s</a>` .BranchLink .BranchDisplayName}}
+{{/* Template Attributes:
+* RecentBranchesPromptData
+*/}}
+{{$data := .RecentBranchesPromptData}}
+{{if $data}}
+ {{range $recentBranch := $data.RecentlyPushedNewBranches}}
+ <div class="ui positive message flex-text-block">
+ <div class="tw-flex-1">
+ {{$timeSince := DateUtils.TimeSince $recentBranch.CommitTime}}
+ {{$branchLink := HTMLFormat `<a href="%s">%s</a>` $recentBranch.BranchLink .BranchDisplayName}}
{{ctx.Locale.Tr "repo.pulls.recently_pushed_new_branches" $branchLink $timeSince}}
</div>
- <a role="button" class="ui compact green button tw-m-0" href="{{QueryBuild .BranchCompareURL "expand" 1}}">
+ <a role="button" class="ui compact green button" href="{{QueryBuild $recentBranch.BranchCompareURL "expand" 1}}">
{{ctx.Locale.Tr "repo.pulls.compare_changes"}}
</a>
</div>
+ {{end}}
{{end}}
diff --git a/templates/repo/home.tmpl b/templates/repo/home.tmpl
index f86b90502d..2a6c0d2fe5 100644
--- a/templates/repo/home.tmpl
+++ b/templates/repo/home.tmpl
@@ -15,7 +15,7 @@
</div>
{{end}}
- {{template "repo/code/recently_pushed_new_branches" .}}
+ {{template "repo/code/recently_pushed_new_branches" dict "RecentBranchesPromptData" .RecentBranchesPromptData}}
<div class="{{Iif $showSidebar "repo-grid-filelist-sidebar" "repo-grid-filelist-only"}}">
<div class="repo-home-filelist">
diff --git a/templates/repo/issue/list.tmpl b/templates/repo/issue/list.tmpl
index 0ab761e038..1fe220e1b8 100644
--- a/templates/repo/issue/list.tmpl
+++ b/templates/repo/issue/list.tmpl
@@ -4,6 +4,8 @@
<div class="ui container">
{{template "base/alert" .}}
+ {{template "repo/code/recently_pushed_new_branches" dict "RecentBranchesPromptData" .RecentBranchesPromptData}}
+
{{if .PinnedIssues}}
<div id="issue-pins" {{if .IsRepoAdmin}}data-is-repo-admin{{end}}>
{{range .PinnedIssues}}
diff --git a/templates/repo/view.tmpl b/templates/repo/view.tmpl
index 85d09d03a1..f99fe2f57a 100644
--- a/templates/repo/view.tmpl
+++ b/templates/repo/view.tmpl
@@ -14,7 +14,7 @@
</div>
{{end}}
- {{template "repo/code/recently_pushed_new_branches" .}}
+ {{template "repo/code/recently_pushed_new_branches" dict "RecentBranchesPromptData" .RecentBranchesPromptData}}
<div class="repo-view-container">
<div class="tw-flex tw-flex-col repo-view-file-tree-container not-mobile {{if not .UserSettingCodeViewShowFileTree}}tw-hidden{{end}}" {{if .IsSigned}}data-user-is-signed-in{{end}}>