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
					
				| @ -72,11 +72,12 @@ func Branches(ctx *context.Context) { | ||||
| 
 | ||||
| 	skip := (page - 1) * 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() { | ||||
| 		return | ||||
| 	} | ||||
| 	ctx.Data["Branches"] = branches | ||||
| 	ctx.Data["DefaultBranchBranch"] = defaultBranchBranch | ||||
| 	pager := context.NewPagination(int(branchesCount), setting.Git.BranchesRangeSize, page, 5) | ||||
| 	pager.SetDefaultParams(ctx) | ||||
| 	ctx.Data["Page"] = pager | ||||
| @ -165,25 +166,28 @@ func redirect(ctx *context.Context) { | ||||
| 
 | ||||
| // loadBranches loads branches from the repository limited by page & pageSize.
 | ||||
| // 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) | ||||
| 	if err != nil { | ||||
| 		log.Error("loadBranches: get default branch: %v", err) | ||||
| 		ctx.ServerError("GetDefaultBranch", err) | ||||
| 		return nil, 0 | ||||
| 		if !git.IsErrBranchNotExist(err) { | ||||
| 			log.Error("loadBranches: get default branch: %v", err) | ||||
| 			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) | ||||
| 	if err != nil { | ||||
| 		log.Error("GetBranches: %v", err) | ||||
| 		ctx.ServerError("GetBranches", err) | ||||
| 		return nil, 0 | ||||
| 		return nil, nil, 0 | ||||
| 	} | ||||
| 
 | ||||
| 	protectedBranches, err := models.GetProtectedBranches(ctx.Repo.Repository.ID) | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("GetProtectedBranches", err) | ||||
| 		return nil, 0 | ||||
| 		return nil, nil, 0 | ||||
| 	} | ||||
| 
 | ||||
| 	repoIDToRepo := map[int64]*repo_model.Repository{} | ||||
| @ -194,36 +198,40 @@ func loadBranches(ctx *context.Context, skip, limit int) ([]*Branch, int) { | ||||
| 
 | ||||
| 	var branches []*Branch | ||||
| 	for i := range rawBranches { | ||||
| 		if rawBranches[i].Name == defaultBranch.Name { | ||||
| 		if defaultBranch != nil && rawBranches[i].Name == defaultBranch.Name { | ||||
| 			// Skip default branch
 | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		var branch = loadOneBranch(ctx, rawBranches[i], protectedBranches, repoIDToRepo, repoIDToGitRepo) | ||||
| 		var branch = loadOneBranch(ctx, rawBranches[i], defaultBranch, protectedBranches, repoIDToRepo, repoIDToGitRepo) | ||||
| 		if branch == nil { | ||||
| 			return nil, 0 | ||||
| 			return nil, nil, 0 | ||||
| 		} | ||||
| 
 | ||||
| 		branches = append(branches, branch) | ||||
| 	} | ||||
| 
 | ||||
| 	// Always add the default branch
 | ||||
| 	log.Debug("loadOneBranch: load default: '%s'", defaultBranch.Name) | ||||
| 	branches = append(branches, loadOneBranch(ctx, defaultBranch, protectedBranches, repoIDToRepo, repoIDToGitRepo)) | ||||
| 	var defaultBranchBranch *Branch | ||||
| 	if defaultBranch != nil { | ||||
| 		// 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) { | ||||
| 		deletedBranches, err := getDeletedBranches(ctx) | ||||
| 		if err != nil { | ||||
| 			ctx.ServerError("getDeletedBranches", err) | ||||
| 			return nil, 0 | ||||
| 			return nil, nil, 0 | ||||
| 		} | ||||
| 		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, | ||||
| 	repoIDToGitRepo map[int64]*git.Repository) *Branch { | ||||
| 	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) | ||||
| 	if divergenceError != nil { | ||||
| 		ctx.ServerError("CountDivergingCommits", divergenceError) | ||||
| 		return nil | ||||
| 	divergence := &git.DivergeObject{ | ||||
| 		Ahead:  -1, | ||||
| 		Behind: -1, | ||||
| 	} | ||||
| 	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) | ||||
|  | ||||
| @ -4,43 +4,41 @@ | ||||
| 	<div class="ui container"> | ||||
| 		{{template "base/alert" .}} | ||||
| 		{{template "repo/sub_menu" .}} | ||||
| 		<h4 class="ui top attached header"> | ||||
| 			{{.i18n.Tr "repo.default_branch"}} | ||||
| 		</h4> | ||||
| 		{{if .DefaultBranchBranch}} | ||||
| 			<h4 class="ui top attached header"> | ||||
| 				{{.i18n.Tr "repo.default_branch"}} | ||||
| 			</h4> | ||||
| 
 | ||||
| 		<div class="ui attached table segment"> | ||||
| 			<table class="ui very basic striped fixed table single line"> | ||||
| 				<tbody> | ||||
| 					<tr> | ||||
| 						<td> | ||||
| 						{{range .Branches}} | ||||
| 							{{if eq .Name $.DefaultBranch}} | ||||
| 								{{if .IsProtected}} | ||||
| 			<div class="ui attached table segment"> | ||||
| 				<table class="ui very basic striped fixed table single line"> | ||||
| 					<tbody> | ||||
| 						<tr> | ||||
| 							<td> | ||||
| 								{{if .DefaultBranchBranch.IsProtected}} | ||||
| 									{{svg "octicon-shield-lock"}} | ||||
| 								{{end}} | ||||
| 								<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> | ||||
| 							{{end}} | ||||
| 						{{end}} | ||||
| 						</td> | ||||
| 						<td class="right aligned overflow-visible"> | ||||
| 							{{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted)}} | ||||
| 								<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"> | ||||
| 									{{svg "octicon-git-branch"}} | ||||
| 								<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 .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> | ||||
| 							</td> | ||||
| 							<td class="right aligned overflow-visible"> | ||||
| 								{{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted)}} | ||||
| 									<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"> | ||||
| 										{{svg "octicon-git-branch"}} | ||||
| 									</div> | ||||
| 								{{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> | ||||
| 							{{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> | ||||
| 						</td> | ||||
| 					</tr> | ||||
| 				</tbody> | ||||
| 			</table> | ||||
| 		</div> | ||||
| 							</td> | ||||
| 						</tr> | ||||
| 					</tbody> | ||||
| 				</table> | ||||
| 			</div> | ||||
| 		{{end}} | ||||
| 
 | ||||
| 		{{if gt (len .Branches) 1}} | ||||
| 			<h4 class="ui top attached header"> | ||||
| @ -65,7 +63,7 @@ | ||||
| 									{{end}} | ||||
| 									</td> | ||||
| 									<td class="three wide ui"> | ||||
| 										{{if not .IsDeleted}} | ||||
| 										{{if and (not .IsDeleted) $.DefaultBranchBranch}} | ||||
| 										<div class="commit-divergence"> | ||||
| 											<div class="bar-group"> | ||||
| 												<div class="count count-behind">{{.CommitsBehind}}</div> | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user