forked from NYANDEV/forgejo
Handle missing default branch better in owner/repo/branches page (#18290)
This PR more nicely handles a missing default branch in owner/repo/branches Fix #18265 Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
parent
4d0a72a271
commit
52bfb7f012
2 changed files with 65 additions and 54 deletions
|
@ -72,11 +72,12 @@ func Branches(ctx *context.Context) {
|
||||||
|
|
||||||
skip := (page - 1) * limit
|
skip := (page - 1) * limit
|
||||||
log.Debug("Branches: skip: %d limit: %d", skip, limit)
|
log.Debug("Branches: skip: %d limit: %d", skip, limit)
|
||||||
branches, branchesCount := loadBranches(ctx, skip, limit)
|
defaultBranchBranch, branches, branchesCount := loadBranches(ctx, skip, limit)
|
||||||
if ctx.Written() {
|
if ctx.Written() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ctx.Data["Branches"] = branches
|
ctx.Data["Branches"] = branches
|
||||||
|
ctx.Data["DefaultBranchBranch"] = defaultBranchBranch
|
||||||
pager := context.NewPagination(int(branchesCount), setting.Git.BranchesRangeSize, page, 5)
|
pager := context.NewPagination(int(branchesCount), setting.Git.BranchesRangeSize, page, 5)
|
||||||
pager.SetDefaultParams(ctx)
|
pager.SetDefaultParams(ctx)
|
||||||
ctx.Data["Page"] = pager
|
ctx.Data["Page"] = pager
|
||||||
|
@ -165,25 +166,28 @@ func redirect(ctx *context.Context) {
|
||||||
|
|
||||||
// loadBranches loads branches from the repository limited by page & pageSize.
|
// loadBranches loads branches from the repository limited by page & pageSize.
|
||||||
// NOTE: May write to context on error.
|
// NOTE: May write to context on error.
|
||||||
func loadBranches(ctx *context.Context, skip, limit int) ([]*Branch, int) {
|
func loadBranches(ctx *context.Context, skip, limit int) (*Branch, []*Branch, int) {
|
||||||
defaultBranch, err := ctx.Repo.GitRepo.GetBranch(ctx.Repo.Repository.DefaultBranch)
|
defaultBranch, err := ctx.Repo.GitRepo.GetBranch(ctx.Repo.Repository.DefaultBranch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("loadBranches: get default branch: %v", err)
|
if !git.IsErrBranchNotExist(err) {
|
||||||
ctx.ServerError("GetDefaultBranch", err)
|
log.Error("loadBranches: get default branch: %v", err)
|
||||||
return nil, 0
|
ctx.ServerError("GetDefaultBranch", err)
|
||||||
|
return nil, nil, 0
|
||||||
|
}
|
||||||
|
log.Warn("loadBranches: missing default branch %s for %-v", ctx.Repo.Repository.DefaultBranch, ctx.Repo.Repository)
|
||||||
}
|
}
|
||||||
|
|
||||||
rawBranches, totalNumOfBranches, err := ctx.Repo.GitRepo.GetBranches(skip, limit)
|
rawBranches, totalNumOfBranches, err := ctx.Repo.GitRepo.GetBranches(skip, limit)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("GetBranches: %v", err)
|
log.Error("GetBranches: %v", err)
|
||||||
ctx.ServerError("GetBranches", err)
|
ctx.ServerError("GetBranches", err)
|
||||||
return nil, 0
|
return nil, nil, 0
|
||||||
}
|
}
|
||||||
|
|
||||||
protectedBranches, err := models.GetProtectedBranches(ctx.Repo.Repository.ID)
|
protectedBranches, err := models.GetProtectedBranches(ctx.Repo.Repository.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ServerError("GetProtectedBranches", err)
|
ctx.ServerError("GetProtectedBranches", err)
|
||||||
return nil, 0
|
return nil, nil, 0
|
||||||
}
|
}
|
||||||
|
|
||||||
repoIDToRepo := map[int64]*repo_model.Repository{}
|
repoIDToRepo := map[int64]*repo_model.Repository{}
|
||||||
|
@ -194,36 +198,40 @@ func loadBranches(ctx *context.Context, skip, limit int) ([]*Branch, int) {
|
||||||
|
|
||||||
var branches []*Branch
|
var branches []*Branch
|
||||||
for i := range rawBranches {
|
for i := range rawBranches {
|
||||||
if rawBranches[i].Name == defaultBranch.Name {
|
if defaultBranch != nil && rawBranches[i].Name == defaultBranch.Name {
|
||||||
// Skip default branch
|
// Skip default branch
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
var branch = loadOneBranch(ctx, rawBranches[i], protectedBranches, repoIDToRepo, repoIDToGitRepo)
|
var branch = loadOneBranch(ctx, rawBranches[i], defaultBranch, protectedBranches, repoIDToRepo, repoIDToGitRepo)
|
||||||
if branch == nil {
|
if branch == nil {
|
||||||
return nil, 0
|
return nil, nil, 0
|
||||||
}
|
}
|
||||||
|
|
||||||
branches = append(branches, branch)
|
branches = append(branches, branch)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always add the default branch
|
var defaultBranchBranch *Branch
|
||||||
log.Debug("loadOneBranch: load default: '%s'", defaultBranch.Name)
|
if defaultBranch != nil {
|
||||||
branches = append(branches, loadOneBranch(ctx, defaultBranch, protectedBranches, repoIDToRepo, repoIDToGitRepo))
|
// Always add the default branch
|
||||||
|
log.Debug("loadOneBranch: load default: '%s'", defaultBranch.Name)
|
||||||
|
defaultBranchBranch = loadOneBranch(ctx, defaultBranch, defaultBranch, protectedBranches, repoIDToRepo, repoIDToGitRepo)
|
||||||
|
branches = append(branches, defaultBranchBranch)
|
||||||
|
}
|
||||||
|
|
||||||
if ctx.Repo.CanWrite(unit.TypeCode) {
|
if ctx.Repo.CanWrite(unit.TypeCode) {
|
||||||
deletedBranches, err := getDeletedBranches(ctx)
|
deletedBranches, err := getDeletedBranches(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ServerError("getDeletedBranches", err)
|
ctx.ServerError("getDeletedBranches", err)
|
||||||
return nil, 0
|
return nil, nil, 0
|
||||||
}
|
}
|
||||||
branches = append(branches, deletedBranches...)
|
branches = append(branches, deletedBranches...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return branches, totalNumOfBranches
|
return defaultBranchBranch, branches, totalNumOfBranches
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadOneBranch(ctx *context.Context, rawBranch *git.Branch, protectedBranches []*models.ProtectedBranch,
|
func loadOneBranch(ctx *context.Context, rawBranch, defaultBranch *git.Branch, protectedBranches []*models.ProtectedBranch,
|
||||||
repoIDToRepo map[int64]*repo_model.Repository,
|
repoIDToRepo map[int64]*repo_model.Repository,
|
||||||
repoIDToGitRepo map[int64]*git.Repository) *Branch {
|
repoIDToGitRepo map[int64]*git.Repository) *Branch {
|
||||||
log.Trace("loadOneBranch: '%s'", rawBranch.Name)
|
log.Trace("loadOneBranch: '%s'", rawBranch.Name)
|
||||||
|
@ -243,10 +251,15 @@ func loadOneBranch(ctx *context.Context, rawBranch *git.Branch, protectedBranche
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
divergence, divergenceError := files_service.CountDivergingCommits(ctx.Repo.Repository, git.BranchPrefix+branchName)
|
divergence := &git.DivergeObject{
|
||||||
if divergenceError != nil {
|
Ahead: -1,
|
||||||
ctx.ServerError("CountDivergingCommits", divergenceError)
|
Behind: -1,
|
||||||
return nil
|
}
|
||||||
|
if defaultBranch != nil {
|
||||||
|
divergence, err = files_service.CountDivergingCommits(ctx.Repo.Repository, git.BranchPrefix+branchName)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("CountDivergingCommits", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pr, err := models.GetLatestPullRequestByHeadInfo(ctx.Repo.Repository.ID, branchName)
|
pr, err := models.GetLatestPullRequestByHeadInfo(ctx.Repo.Repository.ID, branchName)
|
||||||
|
|
|
@ -4,43 +4,41 @@
|
||||||
<div class="ui container">
|
<div class="ui container">
|
||||||
{{template "base/alert" .}}
|
{{template "base/alert" .}}
|
||||||
{{template "repo/sub_menu" .}}
|
{{template "repo/sub_menu" .}}
|
||||||
<h4 class="ui top attached header">
|
{{if .DefaultBranchBranch}}
|
||||||
{{.i18n.Tr "repo.default_branch"}}
|
<h4 class="ui top attached header">
|
||||||
</h4>
|
{{.i18n.Tr "repo.default_branch"}}
|
||||||
|
</h4>
|
||||||
|
|
||||||
<div class="ui attached table segment">
|
<div class="ui attached table segment">
|
||||||
<table class="ui very basic striped fixed table single line">
|
<table class="ui very basic striped fixed table single line">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
{{range .Branches}}
|
{{if .DefaultBranchBranch.IsProtected}}
|
||||||
{{if eq .Name $.DefaultBranch}}
|
|
||||||
{{if .IsProtected}}
|
|
||||||
{{svg "octicon-shield-lock"}}
|
{{svg "octicon-shield-lock"}}
|
||||||
{{end}}
|
{{end}}
|
||||||
<a href="{{$.RepoLink}}/src/branch/{{PathEscapeSegments $.DefaultBranch}}">{{$.DefaultBranch}}</a>
|
<a href="{{.RepoLink}}/src/branch/{{PathEscapeSegments .DefaultBranch}}">{{.DefaultBranch}}</a>
|
||||||
<p class="info df ac my-2">{{svg "octicon-git-commit" 16 "mr-2"}}<a href="{{$.RepoLink}}/commit/{{PathEscape .Commit.ID.String}}">{{ShortSha .Commit.ID.String}}</a> · <span class="commit-message">{{RenderCommitMessage .Commit.CommitMessage $.RepoLink $.Repository.ComposeMetas}}</span> · {{$.i18n.Tr "org.repo_updated"}} {{TimeSince .Commit.Committer.When $.i18n.Lang}}</p>
|
<p class="info df ac my-2">{{svg "octicon-git-commit" 16 "mr-2"}}<a href="{{.RepoLink}}/commit/{{PathEscape .DefaultBranchBranch.Commit.ID.String}}">{{ShortSha .DefaultBranchBranch.Commit.ID.String}}</a> · <span class="commit-message">{{RenderCommitMessage .DefaultBranchBranch.Commit.CommitMessage .RepoLink .Repository.ComposeMetas}}</span> · {{.i18n.Tr "org.repo_updated"}} {{TimeSince .DefaultBranchBranch.Commit.Committer.When .i18n.Lang}}</p>
|
||||||
{{end}}
|
</td>
|
||||||
{{end}}
|
<td class="right aligned overflow-visible">
|
||||||
</td>
|
{{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted)}}
|
||||||
<td class="right aligned overflow-visible">
|
<div class="ui basic jump button icon tooltip show-create-branch-modal" data-content="{{$.i18n.Tr "repo.branch.new_branch_from" ($.DefaultBranch)}}" data-branch-from="{{$.DefaultBranch}}" data-branch-from-urlcomponent="{{PathEscapeSegments $.DefaultBranch}}" data-modal="#create-branch-modal" data-position="top right">
|
||||||
{{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted)}}
|
{{svg "octicon-git-branch"}}
|
||||||
<div class="ui basic jump button icon tooltip show-create-branch-modal" data-content="{{$.i18n.Tr "repo.branch.new_branch_from" ($.DefaultBranch)}}" data-branch-from="{{$.DefaultBranch}}" data-branch-from-urlcomponent="{{PathEscapeSegments $.DefaultBranch}}" data-modal="#create-branch-modal" data-position="top right">
|
</div>
|
||||||
{{svg "octicon-git-branch"}}
|
{{end}}
|
||||||
|
<div class="ui basic jump dropdown icon button tooltip" data-content="{{$.i18n.Tr "repo.branch.download" ($.DefaultBranch)}}" data-position="top right">
|
||||||
|
{{svg "octicon-download"}}
|
||||||
|
<div class="menu">
|
||||||
|
<a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments $.DefaultBranch}}.zip" rel="nofollow">{{svg "octicon-file-zip"}} ZIP</a>
|
||||||
|
<a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments $.DefaultBranch}}.tar.gz" rel="nofollow">{{svg "octicon-file-zip"}} TAR.GZ</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
</td>
|
||||||
<div class="ui basic jump dropdown icon button tooltip" data-content="{{$.i18n.Tr "repo.branch.download" ($.DefaultBranch)}}" data-position="top right">
|
</tr>
|
||||||
{{svg "octicon-download"}}
|
</tbody>
|
||||||
<div class="menu">
|
</table>
|
||||||
<a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments $.DefaultBranch}}.zip" rel="nofollow">{{svg "octicon-file-zip"}} ZIP</a>
|
</div>
|
||||||
<a class="item archive-link" href="{{$.RepoLink}}/archive/{{PathEscapeSegments $.DefaultBranch}}.tar.gz" rel="nofollow">{{svg "octicon-file-zip"}} TAR.GZ</a>
|
{{end}}
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{if gt (len .Branches) 1}}
|
{{if gt (len .Branches) 1}}
|
||||||
<h4 class="ui top attached header">
|
<h4 class="ui top attached header">
|
||||||
|
@ -65,7 +63,7 @@
|
||||||
{{end}}
|
{{end}}
|
||||||
</td>
|
</td>
|
||||||
<td class="three wide ui">
|
<td class="three wide ui">
|
||||||
{{if not .IsDeleted}}
|
{{if and (not .IsDeleted) $.DefaultBranchBranch}}
|
||||||
<div class="commit-divergence">
|
<div class="commit-divergence">
|
||||||
<div class="bar-group">
|
<div class="bar-group">
|
||||||
<div class="count count-behind">{{.CommitsBehind}}</div>
|
<div class="count count-behind">{{.CommitsBehind}}</div>
|
||||||
|
|
Loading…
Reference in a new issue