mirror of
https://github.com/go-gitea/gitea.git
synced 2025-07-12 15:39:45 +00:00
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>
This commit is contained in:
parent
f35dcfd489
commit
32152a0ac0
@ -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.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.
|
// 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.
|
// 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 {
|
if doer == nil {
|
||||||
return []*RecentlyPushedNewBranch{}, nil
|
return []*RecentlyPushedNewBranch{}, nil
|
||||||
}
|
}
|
||||||
|
@ -652,7 +652,13 @@ func (repo *Repository) AllowsPulls(ctx context.Context) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CanEnableEditor returns true if repository meets the requirements of web editor.
|
// 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 {
|
func (repo *Repository) CanEnableEditor() bool {
|
||||||
|
return repo.CanContentChange()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repository) CanContentChange() bool {
|
||||||
return !repo.IsMirror && !repo.IsArchived
|
return !repo.IsMirror && !repo.IsArchived
|
||||||
}
|
}
|
||||||
|
|
||||||
|
73
routers/web/repo/common_recentbranches.go
Normal file
73
routers/web/repo/common_recentbranches.go
Normal file
@ -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}
|
||||||
|
}
|
||||||
|
}
|
@ -767,6 +767,10 @@ func Issues(ctx *context.Context) {
|
|||||||
}
|
}
|
||||||
ctx.Data["Title"] = ctx.Tr("repo.pulls")
|
ctx.Data["Title"] = ctx.Tr("repo.pulls")
|
||||||
ctx.Data["PageIsPullList"] = true
|
ctx.Data["PageIsPullList"] = true
|
||||||
|
prepareRecentlyPushedNewBranches(ctx)
|
||||||
|
if ctx.Written() {
|
||||||
|
return
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
MustEnableIssues(ctx)
|
MustEnableIssues(ctx)
|
||||||
if ctx.Written() {
|
if ctx.Written() {
|
||||||
|
@ -15,7 +15,6 @@ import (
|
|||||||
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
git_model "code.gitea.io/gitea/models/git"
|
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"
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
unit_model "code.gitea.io/gitea/models/unit"
|
unit_model "code.gitea.io/gitea/models/unit"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
@ -196,56 +195,6 @@ func prepareUpstreamDivergingInfo(ctx *context.Context) {
|
|||||||
ctx.Data["UpstreamDivergingInfo"] = upstreamDivergingInfo
|
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) {
|
func updateContextRepoEmptyAndStatus(ctx *context.Context, empty bool, status repo_model.RepositoryStatus) {
|
||||||
if ctx.Repo.Repository.IsEmpty == empty && ctx.Repo.Repository.Status == status {
|
if ctx.Repo.Repository.IsEmpty == empty && ctx.Repo.Repository.Status == status {
|
||||||
return
|
return
|
||||||
|
@ -1,12 +1,18 @@
|
|||||||
{{range .RecentlyPushedNewBranches}}
|
{{/* Template Attributes:
|
||||||
<div class="ui positive message tw-flex tw-items-center tw-gap-2">
|
* RecentBranchesPromptData
|
||||||
<div class="tw-flex-1 tw-break-anywhere">
|
*/}}
|
||||||
{{$timeSince := DateUtils.TimeSince .CommitTime}}
|
{{$data := .RecentBranchesPromptData}}
|
||||||
{{$branchLink := HTMLFormat `<a href="%s">%s</a>` .BranchLink .BranchDisplayName}}
|
{{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}}
|
{{ctx.Locale.Tr "repo.pulls.recently_pushed_new_branches" $branchLink $timeSince}}
|
||||||
</div>
|
</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"}}
|
{{ctx.Locale.Tr "repo.pulls.compare_changes"}}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
{{end}}
|
||||||
{{end}}
|
{{end}}
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{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="{{Iif $showSidebar "repo-grid-filelist-sidebar" "repo-grid-filelist-only"}}">
|
||||||
<div class="repo-home-filelist">
|
<div class="repo-home-filelist">
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
<div class="ui container">
|
<div class="ui container">
|
||||||
{{template "base/alert" .}}
|
{{template "base/alert" .}}
|
||||||
|
|
||||||
|
{{template "repo/code/recently_pushed_new_branches" dict "RecentBranchesPromptData" .RecentBranchesPromptData}}
|
||||||
|
|
||||||
{{if .PinnedIssues}}
|
{{if .PinnedIssues}}
|
||||||
<div id="issue-pins" {{if .IsRepoAdmin}}data-is-repo-admin{{end}}>
|
<div id="issue-pins" {{if .IsRepoAdmin}}data-is-repo-admin{{end}}>
|
||||||
{{range .PinnedIssues}}
|
{{range .PinnedIssues}}
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{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="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}}>
|
<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}}>
|
||||||
|
Loading…
Reference in New Issue
Block a user