mirror of
https://github.com/go-gitea/gitea.git
synced 2025-07-14 21:54:40 +02:00
Merge branch 'main' into fix-oauth2
This commit is contained in:
commit
28e5b428cf
@ -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…
x
Reference in New Issue
Block a user