mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 03:02:14 +01: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.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 | ||||
| 	} | ||||
|  | ||||
| @ -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 | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										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["PageIsPullList"] = true | ||||
| 		prepareRecentlyPushedNewBranches(ctx) | ||||
| 		if ctx.Written() { | ||||
| 			return | ||||
| 		} | ||||
| 	} else { | ||||
| 		MustEnableIssues(ctx) | ||||
| 		if ctx.Written() { | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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}} | ||||
|  | ||||
| @ -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"> | ||||
|  | ||||
| @ -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}} | ||||
|  | ||||
| @ -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}}> | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user