From fcd096231ac2deaefbca10a7db1b9b01f1da93d7 Mon Sep 17 00:00:00 2001
From: wxiaoguang <wxiaoguang@gmail.com>
Date: Wed, 15 Jan 2025 11:15:47 +0800
Subject: [PATCH] Simplify context ref name (#33267)

---
 routers/web/repo/branch.go       |  4 ++--
 routers/web/repo/commit.go       |  6 -----
 routers/web/repo/release.go      |  4 ----
 routers/web/repo/view_file.go    |  4 ++--
 routers/web/repo/view_home.go    |  2 +-
 services/context/repo.go         | 39 ++++++++------------------------
 templates/repo/blame.tmpl        |  2 +-
 templates/repo/commit_page.tmpl  |  4 +---
 templates/repo/commits.tmpl      | 17 +++-----------
 templates/repo/home.tmpl         | 21 ++++-------------
 templates/repo/release/list.tmpl |  2 +-
 templates/repo/view_file.tmpl    |  2 +-
 12 files changed, 27 insertions(+), 80 deletions(-)

diff --git a/routers/web/repo/branch.go b/routers/web/repo/branch.go
index 51d91b7d6a..5011cbfc77 100644
--- a/routers/web/repo/branch.go
+++ b/routers/web/repo/branch.go
@@ -193,11 +193,11 @@ func CreateBranch(ctx *context.Context) {
 
 	if form.CreateTag {
 		target := ctx.Repo.CommitID
-		if ctx.Repo.IsViewBranch {
+		if ctx.Repo.RefFullName.IsBranch() {
 			target = ctx.Repo.BranchName
 		}
 		err = release_service.CreateNewTag(ctx, ctx.Doer, ctx.Repo.Repository, target, form.NewBranchName, "")
-	} else if ctx.Repo.IsViewBranch {
+	} else if ctx.Repo.RefFullName.IsBranch() {
 		err = repo_service.CreateNewBranch(ctx, ctx.Doer, ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.Repo.BranchName, form.NewBranchName)
 	} else {
 		err = repo_service.CreateNewBranchFromCommit(ctx, ctx.Doer, ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.Repo.CommitID, form.NewBranchName)
diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go
index b5498ccd2c..bad8ca56d1 100644
--- a/routers/web/repo/commit.go
+++ b/routers/web/repo/commit.go
@@ -390,12 +390,6 @@ func Diff(ctx *context.Context) {
 		}
 	}
 
-	ctx.Data["BranchName"], err = commit.GetBranchName()
-	if err != nil {
-		ctx.ServerError("commit.GetBranchName", err)
-		return
-	}
-
 	ctx.HTML(http.StatusOK, tplCommitPage)
 }
 
diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go
index 8909dedbb1..19b83915af 100644
--- a/routers/web/repo/release.go
+++ b/routers/web/repo/release.go
@@ -148,8 +148,6 @@ func getReleaseInfos(ctx *context.Context, opts *repo_model.FindReleasesOptions)
 func Releases(ctx *context.Context) {
 	ctx.Data["PageIsReleaseList"] = true
 	ctx.Data["Title"] = ctx.Tr("repo.release.releases")
-	ctx.Data["IsViewBranch"] = false
-	ctx.Data["IsViewTag"] = true
 
 	listOptions := db.ListOptions{
 		Page:     ctx.FormInt("page"),
@@ -194,8 +192,6 @@ func Releases(ctx *context.Context) {
 func TagsList(ctx *context.Context) {
 	ctx.Data["PageIsTagList"] = true
 	ctx.Data["Title"] = ctx.Tr("repo.release.tags")
-	ctx.Data["IsViewBranch"] = false
-	ctx.Data["IsViewTag"] = true
 	ctx.Data["CanCreateRelease"] = ctx.Repo.CanWrite(unit.TypeReleases) && !ctx.Repo.Repository.IsArchived
 
 	namePattern := ctx.FormTrim("q")
diff --git a/routers/web/repo/view_file.go b/routers/web/repo/view_file.go
index 0b4381edfb..5784297918 100644
--- a/routers/web/repo/view_file.go
+++ b/routers/web/repo/view_file.go
@@ -232,7 +232,7 @@ func prepareToRenderFile(ctx *context.Context, entry *git.TreeEntry) {
 					ctx.Data["CanEditFile"] = true
 					ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.edit_this_file")
 				}
-			} else if !ctx.Repo.IsViewBranch {
+			} else if !ctx.Repo.RefFullName.IsBranch() {
 				ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
 			} else if !ctx.Repo.CanWriteToBranch(ctx, ctx.Doer, ctx.Repo.BranchName) {
 				ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.fork_before_edit")
@@ -305,7 +305,7 @@ func prepareToRenderFile(ctx *context.Context, entry *git.TreeEntry) {
 			ctx.Data["CanDeleteFile"] = true
 			ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file")
 		}
-	} else if !ctx.Repo.IsViewBranch {
+	} else if !ctx.Repo.RefFullName.IsBranch() {
 		ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
 	} else if !ctx.Repo.CanWriteToBranch(ctx, ctx.Doer, ctx.Repo.BranchName) {
 		ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.must_have_write_access")
diff --git a/routers/web/repo/view_home.go b/routers/web/repo/view_home.go
index 54a58cd8be..ff2ee3c7ec 100644
--- a/routers/web/repo/view_home.go
+++ b/routers/web/repo/view_home.go
@@ -178,7 +178,7 @@ func prepareHomeSidebarLatestRelease(ctx *context.Context) {
 }
 
 func prepareUpstreamDivergingInfo(ctx *context.Context) {
-	if !ctx.Repo.Repository.IsFork || !ctx.Repo.IsViewBranch || ctx.Repo.TreePath != "" {
+	if !ctx.Repo.Repository.IsFork || !ctx.Repo.RefFullName.IsBranch() || ctx.Repo.TreePath != "" {
 		return
 	}
 	upstreamDivergingInfo, err := repo_service.GetUpstreamDivergingInfo(ctx, ctx.Repo.Repository, ctx.Repo.BranchName)
diff --git a/services/context/repo.go b/services/context/repo.go
index 33a39dced1..6c348b99cb 100644
--- a/services/context/repo.go
+++ b/services/context/repo.go
@@ -53,20 +53,15 @@ type Repository struct {
 	RepoLink string
 	GitRepo  *git.Repository
 
-	// these fields indicate the current ref type, for example: ".../src/branch/master" means IsViewBranch=true
-	IsViewBranch bool
-	IsViewTag    bool
-	IsViewCommit bool
-
+	// RefFullName is the full ref name that the user is viewing
 	RefFullName git.RefName
-	BranchName  string
-	TagName     string
+	BranchName  string // it is the RefFullName's short name if its type is "branch"
+	TagName     string // it is the RefFullName's short name if its type is "tag"
 	TreePath    string
 
-	// Commit it is always set to the commit for the branch or tag
-	Commit   *git.Commit
-	CommitID string
-
+	// Commit it is always set to the commit for the branch or tag, or just the commit that the user is viewing
+	Commit       *git.Commit
+	CommitID     string
 	CommitsCount int64
 
 	PullRequest *PullRequest
@@ -79,7 +74,7 @@ func (r *Repository) CanWriteToBranch(ctx context.Context, user *user_model.User
 
 // CanEnableEditor returns true if repository is editable and user has proper access level.
 func (r *Repository) CanEnableEditor(ctx context.Context, user *user_model.User) bool {
-	return r.IsViewBranch && r.CanWriteToBranch(ctx, user, r.BranchName) && r.Repository.CanEnableEditor() && !r.Repository.IsArchived
+	return r.RefFullName.IsBranch() && r.CanWriteToBranch(ctx, user, r.BranchName) && r.Repository.CanEnableEditor() && !r.Repository.IsArchived
 }
 
 // CanCreateBranch returns true if repository is editable and user has proper access level.
@@ -174,15 +169,9 @@ func (r *Repository) GetCommitsCount() (int64, error) {
 	if r.Commit == nil {
 		return 0, nil
 	}
-	var contextName string
-	if r.IsViewBranch {
-		contextName = r.BranchName
-	} else if r.IsViewTag {
-		contextName = r.TagName
-	} else {
-		contextName = r.CommitID
-	}
-	return cache.GetInt64(r.Repository.GetCommitsCountCacheKey(contextName, r.IsViewBranch || r.IsViewTag), func() (int64, error) {
+	contextName := r.RefFullName.ShortName()
+	isRef := r.RefFullName.IsBranch() || r.RefFullName.IsTag()
+	return cache.GetInt64(r.Repository.GetCommitsCountCacheKey(contextName, isRef), func() (int64, error) {
 		return r.Commit.CommitsCount()
 	})
 }
@@ -798,7 +787,6 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) {
 		// Empty repository does not have reference information.
 		if ctx.Repo.Repository.IsEmpty {
 			// assume the user is viewing the (non-existent) default branch
-			ctx.Repo.IsViewBranch = true
 			ctx.Repo.BranchName = ctx.Repo.Repository.DefaultBranch
 			ctx.Repo.RefFullName = git.RefNameFromBranch(ctx.Repo.BranchName)
 			// these variables are used by the template to "add/upload" new files
@@ -834,7 +822,6 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) {
 				ctx.ServerError("GetBranchCommit", err)
 				return
 			}
-			ctx.Repo.IsViewBranch = true
 		} else { // there is a path in request
 			guessLegacyPath := refType == ""
 			if guessLegacyPath {
@@ -853,7 +840,6 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) {
 			}
 
 			if refType == git.RefTypeBranch && ctx.Repo.GitRepo.IsBranchExist(refShortName) {
-				ctx.Repo.IsViewBranch = true
 				ctx.Repo.BranchName = refShortName
 				ctx.Repo.RefFullName = git.RefNameFromBranch(refShortName)
 
@@ -864,7 +850,6 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) {
 				}
 				ctx.Repo.CommitID = ctx.Repo.Commit.ID.String()
 			} else if refType == git.RefTypeTag && ctx.Repo.GitRepo.IsTagExist(refShortName) {
-				ctx.Repo.IsViewTag = true
 				ctx.Repo.RefFullName = git.RefNameFromTag(refShortName)
 				ctx.Repo.TagName = refShortName
 
@@ -879,7 +864,6 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) {
 				}
 				ctx.Repo.CommitID = ctx.Repo.Commit.ID.String()
 			} else if git.IsStringLikelyCommitID(ctx.Repo.GetObjectFormat(), refShortName, 7) {
-				ctx.Repo.IsViewCommit = true
 				ctx.Repo.RefFullName = git.RefNameFromCommit(refShortName)
 				ctx.Repo.CommitID = refShortName
 
@@ -915,13 +899,10 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) {
 		ctx.Data["RefTypeNameSubURL"] = ctx.Repo.RefTypeNameSubURL()
 		ctx.Data["TreePath"] = ctx.Repo.TreePath
 
-		ctx.Data["IsViewBranch"] = ctx.Repo.IsViewBranch
 		ctx.Data["BranchName"] = ctx.Repo.BranchName
 
-		ctx.Data["IsViewTag"] = ctx.Repo.IsViewTag
 		ctx.Data["TagName"] = ctx.Repo.TagName
 
-		ctx.Data["IsViewCommit"] = ctx.Repo.IsViewCommit
 		ctx.Data["CommitID"] = ctx.Repo.CommitID
 
 		ctx.Data["CanCreateBranch"] = ctx.Repo.CanCreateBranch() // only used by the branch selector dropdown: AllowCreateNewRef
diff --git a/templates/repo/blame.tmpl b/templates/repo/blame.tmpl
index f8bd22074f..05f79612bd 100644
--- a/templates/repo/blame.tmpl
+++ b/templates/repo/blame.tmpl
@@ -18,7 +18,7 @@
 		<div class="file-header-right file-actions tw-flex tw-items-center tw-flex-wrap">
 			<div class="ui buttons">
 				<a class="ui tiny button" href="{{$.RawFileLink}}">{{ctx.Locale.Tr "repo.file_raw"}}</a>
-				{{if not .IsViewCommit}}
+				{{if or .RefFullName.IsBranch .RefFullName.IsTag}}
 					<a class="ui tiny button" href="{{.RepoLink}}/src/commit/{{.CommitID | PathEscape}}/{{.TreePath | PathEscapeSegments}}">{{ctx.Locale.Tr "repo.file_permalink"}}</a>
 				{{end}}
 				<a class="ui tiny button" href="{{.RepoLink}}/src/{{.RefTypeNameSubURL}}/{{.TreePath | PathEscapeSegments}}">{{ctx.Locale.Tr "repo.normal_view"}}</a>
diff --git a/templates/repo/commit_page.tmpl b/templates/repo/commit_page.tmpl
index bc63db9b62..2e3ddeb228 100644
--- a/templates/repo/commit_page.tmpl
+++ b/templates/repo/commit_page.tmpl
@@ -54,13 +54,11 @@
 											<p id="cherry-pick-content" class="branch-dropdown"></p>
 
 											<form method="get">
-												{{/*FIXME: CurrentRefShortName seems not making sense here (old code),
-												because the "commit page" has no "$.BranchName" info, so only using DefaultBranch should be enough */}}
 												{{template "repo/branch_dropdown" dict
 													"Repository" .Repository
 													"ShowTabBranches" true
 													"CurrentRefType" "branch"
-													"CurrentRefShortName" (or $.BranchName $.Repository.DefaultBranch)
+													"CurrentRefShortName" $.Repository.DefaultBranch
 													"RefFormActionTemplate" (print "{RepoLink}/_cherrypick/" .CommitID "/{RefShortName}")
 												}}
 												<input type="hidden" id="cherry-pick-type" name="cherry-pick-type"><br>
diff --git a/templates/repo/commits.tmpl b/templates/repo/commits.tmpl
index d80d4ac276..07c6b5f618 100644
--- a/templates/repo/commits.tmpl
+++ b/templates/repo/commits.tmpl
@@ -5,24 +5,13 @@
 		{{template "repo/sub_menu" .}}
 		<div class="repo-button-row">
 			<div class="repo-button-row-left">
-				{{- /* for /owner/repo/commits/branch/the-name */ -}}
-				{{- $branchDropdownCurrentRefType := "branch" -}}
-				{{- $branchDropdownCurrentRefShortName := .BranchName -}}
-				{{- if .IsViewTag -}}
-					{{- /* for /owner/repo/commits/tag/the-name */ -}}
-					{{- $branchDropdownCurrentRefType = "tag" -}}
-					{{- $branchDropdownCurrentRefShortName = .TagName -}}
-				{{- else if .IsViewCommit -}}
-					{{- /* for /owner/repo/commits/commit/000000 */ -}}
-					{{- $branchDropdownCurrentRefType = "commit" -}}
-					{{- $branchDropdownCurrentRefShortName = ShortSha .CommitID -}}
-				{{- end -}}
+				{{- /* for /owner/repo/commits/{RefType}/{RefShortName} */ -}}
 				{{- template "repo/branch_dropdown" dict
 					"Repository" .Repository
 					"ShowTabBranches" true
 					"ShowTabTags" true
-					"CurrentRefType" $branchDropdownCurrentRefType
-					"CurrentRefShortName" $branchDropdownCurrentRefShortName
+					"CurrentRefType" .RefFullName.RefType
+					"CurrentRefShortName" .RefFullName.ShortName
 					"CurrentTreePath" .TreePath
 					"RefLinkTemplate" "{RepoLink}/commits/{RefType}/{RefShortName}/{TreePath}"
 					"AllowCreateNewRef" .CanCreateBranch
diff --git a/templates/repo/home.tmpl b/templates/repo/home.tmpl
index 86ad162908..31a8167b4b 100644
--- a/templates/repo/home.tmpl
+++ b/templates/repo/home.tmpl
@@ -24,30 +24,19 @@
 				{{template "repo/sub_menu" .}}
 				<div class="repo-button-row">
 					<div class="repo-button-row-left">
-						{{- /* for repo home (default branch) and /owner/repo/src/branch/the-name */ -}}
-						{{- $branchDropdownCurrentRefType := "branch" -}}
-						{{- $branchDropdownCurrentRefShortName := .BranchName -}}
-						{{- if .IsViewTag -}}
-							{{- /* for /owner/repo/src/tag/the-name */ -}}
-							{{- $branchDropdownCurrentRefType = "tag" -}}
-							{{- $branchDropdownCurrentRefShortName = .TagName -}}
-						{{- else if .IsViewCommit -}}
-							{{- /* for /owner/repo/src/commit/000000 */ -}}
-							{{- $branchDropdownCurrentRefType = "commit" -}}
-							{{- $branchDropdownCurrentRefShortName = ShortSha .CommitID -}}
-						{{- end -}}
+						{{- /* for repo home (default branch) and /owner/repo/src/{RefType}/{RefShortName} */ -}}
 						{{- template "repo/branch_dropdown" dict
 							"Repository" .Repository
 							"ShowTabBranches" true
 							"ShowTabTags" true
-							"CurrentRefType" $branchDropdownCurrentRefType
-							"CurrentRefShortName" $branchDropdownCurrentRefShortName
+							"CurrentRefType" .RefFullName.RefType
+							"CurrentRefShortName" .RefFullName.ShortName
 							"CurrentTreePath" .TreePath
 							"RefLinkTemplate" "{RepoLink}/src/{RefType}/{RefShortName}/{TreePath}"
 							"AllowCreateNewRef" .CanCreateBranch
 							"ShowViewAllRefsEntry" true
 						-}}
-						{{if and .CanCompareOrPull .IsViewBranch (not .Repository.IsArchived)}}
+						{{if and .CanCompareOrPull .RefFullName.IsBranch (not .Repository.IsArchived)}}
 							{{$cmpBranch := ""}}
 							{{if ne .Repository.ID .BaseRepo.ID}}
 								{{$cmpBranch = printf "%s/%s:" (.Repository.OwnerName|PathEscape) (.Repository.Name|PathEscape)}}
@@ -65,7 +54,7 @@
 							<a href="{{.Repository.Link}}/find/{{.RefTypeNameSubURL}}" class="ui compact basic button">{{ctx.Locale.Tr "repo.find_file.go_to_file"}}</a>
 						{{end}}
 
-						{{if and .CanWriteCode .IsViewBranch (not .Repository.IsMirror) (not .Repository.IsArchived) (not .IsViewFile)}}
+						{{if and .CanWriteCode .RefFullName.IsBranch (not .Repository.IsMirror) (not .Repository.IsArchived) (not .IsViewFile)}}
 							<button class="ui dropdown basic compact jump button"{{if not .Repository.CanEnableEditor}} disabled{{end}}>
 								{{ctx.Locale.Tr "repo.editor.add_file"}}
 								{{svg "octicon-triangle-down" 14 "dropdown icon"}}
diff --git a/templates/repo/release/list.tmpl b/templates/repo/release/list.tmpl
index 99934d2118..041890ca9c 100644
--- a/templates/repo/release/list.tmpl
+++ b/templates/repo/release/list.tmpl
@@ -24,7 +24,7 @@
 								"Repository" $.Repository
 								"ShowTabTags" true
 								"DropdownFixedText" (ctx.Locale.Tr "repo.release.compare")
-								"RefLinkTemplate" (print "{RepoLink}/compare/{RefShortName}..." (PathEscapeSegments $compareTarget))
+								"RefLinkTemplate" (print "{RepoLink}/compare/{RefShortName}" "..." (PathEscapeSegments $compareTarget))
 							}}
 						{{end}}
 					</div>
diff --git a/templates/repo/view_file.tmpl b/templates/repo/view_file.tmpl
index 69c1641613..4907d87301 100644
--- a/templates/repo/view_file.tmpl
+++ b/templates/repo/view_file.tmpl
@@ -42,7 +42,7 @@
 			{{if not .ReadmeInList}}
 				<div class="ui buttons tw-mr-1">
 					<a class="ui mini basic button" href="{{$.RawFileLink}}">{{ctx.Locale.Tr "repo.file_raw"}}</a>
-					{{if not .IsViewCommit}}
+					{{if or .RefFullName.IsBranch .RefFullName.IsTag}}
 						<a class="ui mini basic button" href="{{.RepoLink}}/src/commit/{{PathEscape .CommitID}}/{{PathEscapeSegments .TreePath}}">{{ctx.Locale.Tr "repo.file_permalink"}}</a>
 					{{end}}
 					{{if .IsRepresentableAsText}}