diff --git a/modules/context/repo.go b/modules/context/repo.go
index ba3cfe9bf2..5ce31e9e35 100644
--- a/modules/context/repo.go
+++ b/modules/context/repo.go
@@ -8,7 +8,6 @@ package context
 import (
 	"fmt"
 	"io/ioutil"
-	"net/http"
 	"net/url"
 	"path"
 	"strings"
@@ -394,238 +393,231 @@ func RepoIDAssignment() func(ctx *Context) {
 }
 
 // RepoAssignment returns a middleware to handle repository assignment
-func RepoAssignment() func(http.Handler) http.Handler {
-	return func(next http.Handler) http.Handler {
-		return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
-			var (
-				owner *models.User
-				err   error
-				ctx   = GetContext(req)
-			)
+func RepoAssignment(ctx *Context) {
+	var (
+		owner *models.User
+		err   error
+	)
 
-			userName := ctx.Params(":username")
-			repoName := ctx.Params(":reponame")
-			repoName = strings.TrimSuffix(repoName, ".git")
+	userName := ctx.Params(":username")
+	repoName := ctx.Params(":reponame")
+	repoName = strings.TrimSuffix(repoName, ".git")
 
-			// Check if the user is the same as the repository owner
-			if ctx.IsSigned && ctx.User.LowerName == strings.ToLower(userName) {
-				owner = ctx.User
+	// Check if the user is the same as the repository owner
+	if ctx.IsSigned && ctx.User.LowerName == strings.ToLower(userName) {
+		owner = ctx.User
+	} else {
+		owner, err = models.GetUserByName(userName)
+		if err != nil {
+			if models.IsErrUserNotExist(err) {
+				if ctx.Query("go-get") == "1" {
+					EarlyResponseForGoGetMeta(ctx)
+					return
+				}
+				ctx.NotFound("GetUserByName", nil)
 			} else {
-				owner, err = models.GetUserByName(userName)
-				if err != nil {
-					if models.IsErrUserNotExist(err) {
-						if ctx.Query("go-get") == "1" {
-							EarlyResponseForGoGetMeta(ctx)
-							return
-						}
-						ctx.NotFound("GetUserByName", nil)
-					} else {
-						ctx.ServerError("GetUserByName", err)
-					}
-					return
-				}
+				ctx.ServerError("GetUserByName", err)
 			}
-			ctx.Repo.Owner = owner
-			ctx.Data["Username"] = ctx.Repo.Owner.Name
+			return
+		}
+	}
+	ctx.Repo.Owner = owner
+	ctx.Data["Username"] = ctx.Repo.Owner.Name
 
-			// Get repository.
-			repo, err := models.GetRepositoryByName(owner.ID, repoName)
-			if err != nil {
-				if models.IsErrRepoNotExist(err) {
-					redirectRepoID, err := models.LookupRepoRedirect(owner.ID, repoName)
-					if err == nil {
-						RedirectToRepo(ctx, redirectRepoID)
-					} else if models.IsErrRepoRedirectNotExist(err) {
-						if ctx.Query("go-get") == "1" {
-							EarlyResponseForGoGetMeta(ctx)
-							return
-						}
-						ctx.NotFound("GetRepositoryByName", nil)
-					} else {
-						ctx.ServerError("LookupRepoRedirect", err)
-					}
-				} else {
-					ctx.ServerError("GetRepositoryByName", err)
-				}
-				return
-			}
-			repo.Owner = owner
-
-			repoAssignment(ctx, repo)
-			if ctx.Written() {
-				return
-			}
-
-			ctx.Repo.RepoLink = repo.Link()
-			ctx.Data["RepoLink"] = ctx.Repo.RepoLink
-			ctx.Data["RepoRelPath"] = ctx.Repo.Owner.Name + "/" + ctx.Repo.Repository.Name
-
-			unit, err := ctx.Repo.Repository.GetUnit(models.UnitTypeExternalTracker)
+	// Get repository.
+	repo, err := models.GetRepositoryByName(owner.ID, repoName)
+	if err != nil {
+		if models.IsErrRepoNotExist(err) {
+			redirectRepoID, err := models.LookupRepoRedirect(owner.ID, repoName)
 			if err == nil {
-				ctx.Data["RepoExternalIssuesLink"] = unit.ExternalTrackerConfig().ExternalTrackerURL
-			}
-
-			ctx.Data["NumTags"], err = models.GetReleaseCountByRepoID(ctx.Repo.Repository.ID, models.FindReleasesOptions{
-				IncludeTags: true,
-			})
-			if err != nil {
-				ctx.ServerError("GetReleaseCountByRepoID", err)
-				return
-			}
-			ctx.Data["NumReleases"], err = models.GetReleaseCountByRepoID(ctx.Repo.Repository.ID, models.FindReleasesOptions{})
-			if err != nil {
-				ctx.ServerError("GetReleaseCountByRepoID", err)
-				return
-			}
-
-			ctx.Data["Title"] = owner.Name + "/" + repo.Name
-			ctx.Data["Repository"] = repo
-			ctx.Data["Owner"] = ctx.Repo.Repository.Owner
-			ctx.Data["IsRepositoryOwner"] = ctx.Repo.IsOwner()
-			ctx.Data["IsRepositoryAdmin"] = ctx.Repo.IsAdmin()
-			ctx.Data["RepoOwnerIsOrganization"] = repo.Owner.IsOrganization()
-			ctx.Data["CanWriteCode"] = ctx.Repo.CanWrite(models.UnitTypeCode)
-			ctx.Data["CanWriteIssues"] = ctx.Repo.CanWrite(models.UnitTypeIssues)
-			ctx.Data["CanWritePulls"] = ctx.Repo.CanWrite(models.UnitTypePullRequests)
-
-			if ctx.Data["CanSignedUserFork"], err = ctx.Repo.Repository.CanUserFork(ctx.User); err != nil {
-				ctx.ServerError("CanUserFork", err)
-				return
-			}
-
-			ctx.Data["DisableSSH"] = setting.SSH.Disabled
-			ctx.Data["ExposeAnonSSH"] = setting.SSH.ExposeAnonymous
-			ctx.Data["DisableHTTP"] = setting.Repository.DisableHTTPGit
-			ctx.Data["RepoSearchEnabled"] = setting.Indexer.RepoIndexerEnabled
-			ctx.Data["CloneLink"] = repo.CloneLink()
-			ctx.Data["WikiCloneLink"] = repo.WikiCloneLink()
-
-			if ctx.IsSigned {
-				ctx.Data["IsWatchingRepo"] = models.IsWatching(ctx.User.ID, repo.ID)
-				ctx.Data["IsStaringRepo"] = models.IsStaring(ctx.User.ID, repo.ID)
-			}
-
-			if repo.IsFork {
-				RetrieveBaseRepo(ctx, repo)
-				if ctx.Written() {
+				RedirectToRepo(ctx, redirectRepoID)
+			} else if models.IsErrRepoRedirectNotExist(err) {
+				if ctx.Query("go-get") == "1" {
+					EarlyResponseForGoGetMeta(ctx)
 					return
 				}
+				ctx.NotFound("GetRepositoryByName", nil)
+			} else {
+				ctx.ServerError("LookupRepoRedirect", err)
 			}
+		} else {
+			ctx.ServerError("GetRepositoryByName", err)
+		}
+		return
+	}
+	repo.Owner = owner
 
-			if repo.IsGenerated() {
-				RetrieveTemplateRepo(ctx, repo)
-				if ctx.Written() {
-					return
-				}
-			}
+	repoAssignment(ctx, repo)
+	if ctx.Written() {
+		return
+	}
 
-			// Disable everything when the repo is being created
-			if ctx.Repo.Repository.IsBeingCreated() {
-				ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch
-				return
-			}
+	ctx.Repo.RepoLink = repo.Link()
+	ctx.Data["RepoLink"] = ctx.Repo.RepoLink
+	ctx.Data["RepoRelPath"] = ctx.Repo.Owner.Name + "/" + ctx.Repo.Repository.Name
 
-			gitRepo, err := git.OpenRepository(models.RepoPath(userName, repoName))
-			if err != nil {
-				ctx.ServerError("RepoAssignment Invalid repo "+models.RepoPath(userName, repoName), err)
-				return
-			}
-			ctx.Repo.GitRepo = gitRepo
+	unit, err := ctx.Repo.Repository.GetUnit(models.UnitTypeExternalTracker)
+	if err == nil {
+		ctx.Data["RepoExternalIssuesLink"] = unit.ExternalTrackerConfig().ExternalTrackerURL
+	}
 
-			// We opened it, we should close it
-			defer func() {
-				// If it's been set to nil then assume someone else has closed it.
-				if ctx.Repo.GitRepo != nil {
-					ctx.Repo.GitRepo.Close()
-				}
-			}()
+	ctx.Data["NumTags"], err = models.GetReleaseCountByRepoID(ctx.Repo.Repository.ID, models.FindReleasesOptions{
+		IncludeTags: true,
+	})
+	if err != nil {
+		ctx.ServerError("GetReleaseCountByRepoID", err)
+		return
+	}
+	ctx.Data["NumReleases"], err = models.GetReleaseCountByRepoID(ctx.Repo.Repository.ID, models.FindReleasesOptions{})
+	if err != nil {
+		ctx.ServerError("GetReleaseCountByRepoID", err)
+		return
+	}
 
-			// Stop at this point when the repo is empty.
-			if ctx.Repo.Repository.IsEmpty {
-				ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch
-				next.ServeHTTP(w, req)
-				return
-			}
+	ctx.Data["Title"] = owner.Name + "/" + repo.Name
+	ctx.Data["Repository"] = repo
+	ctx.Data["Owner"] = ctx.Repo.Repository.Owner
+	ctx.Data["IsRepositoryOwner"] = ctx.Repo.IsOwner()
+	ctx.Data["IsRepositoryAdmin"] = ctx.Repo.IsAdmin()
+	ctx.Data["RepoOwnerIsOrganization"] = repo.Owner.IsOrganization()
+	ctx.Data["CanWriteCode"] = ctx.Repo.CanWrite(models.UnitTypeCode)
+	ctx.Data["CanWriteIssues"] = ctx.Repo.CanWrite(models.UnitTypeIssues)
+	ctx.Data["CanWritePulls"] = ctx.Repo.CanWrite(models.UnitTypePullRequests)
 
-			tags, err := ctx.Repo.GitRepo.GetTags()
-			if err != nil {
-				ctx.ServerError("GetTags", err)
-				return
-			}
-			ctx.Data["Tags"] = tags
+	if ctx.Data["CanSignedUserFork"], err = ctx.Repo.Repository.CanUserFork(ctx.User); err != nil {
+		ctx.ServerError("CanUserFork", err)
+		return
+	}
 
-			brs, _, err := ctx.Repo.GitRepo.GetBranches(0, 0)
-			if err != nil {
-				ctx.ServerError("GetBranches", err)
-				return
-			}
-			ctx.Data["Branches"] = brs
-			ctx.Data["BranchesCount"] = len(brs)
+	ctx.Data["DisableSSH"] = setting.SSH.Disabled
+	ctx.Data["ExposeAnonSSH"] = setting.SSH.ExposeAnonymous
+	ctx.Data["DisableHTTP"] = setting.Repository.DisableHTTPGit
+	ctx.Data["RepoSearchEnabled"] = setting.Indexer.RepoIndexerEnabled
+	ctx.Data["CloneLink"] = repo.CloneLink()
+	ctx.Data["WikiCloneLink"] = repo.WikiCloneLink()
 
-			ctx.Data["TagName"] = ctx.Repo.TagName
+	if ctx.IsSigned {
+		ctx.Data["IsWatchingRepo"] = models.IsWatching(ctx.User.ID, repo.ID)
+		ctx.Data["IsStaringRepo"] = models.IsStaring(ctx.User.ID, repo.ID)
+	}
 
-			// If not branch selected, try default one.
-			// If default branch doesn't exists, fall back to some other branch.
-			if len(ctx.Repo.BranchName) == 0 {
-				if len(ctx.Repo.Repository.DefaultBranch) > 0 && gitRepo.IsBranchExist(ctx.Repo.Repository.DefaultBranch) {
-					ctx.Repo.BranchName = ctx.Repo.Repository.DefaultBranch
-				} else if len(brs) > 0 {
-					ctx.Repo.BranchName = brs[0]
-				}
-			}
-			ctx.Data["BranchName"] = ctx.Repo.BranchName
-			ctx.Data["CommitID"] = ctx.Repo.CommitID
+	if repo.IsFork {
+		RetrieveBaseRepo(ctx, repo)
+		if ctx.Written() {
+			return
+		}
+	}
 
-			// People who have push access or have forked repository can propose a new pull request.
-			canPush := ctx.Repo.CanWrite(models.UnitTypeCode) || (ctx.IsSigned && ctx.User.HasForkedRepo(ctx.Repo.Repository.ID))
-			canCompare := false
+	if repo.IsGenerated() {
+		RetrieveTemplateRepo(ctx, repo)
+		if ctx.Written() {
+			return
+		}
+	}
 
-			// Pull request is allowed if this is a fork repository
-			// and base repository accepts pull requests.
-			if repo.BaseRepo != nil && repo.BaseRepo.AllowsPulls() {
-				canCompare = true
-				ctx.Data["BaseRepo"] = repo.BaseRepo
-				ctx.Repo.PullRequest.BaseRepo = repo.BaseRepo
-				ctx.Repo.PullRequest.Allowed = canPush
-				ctx.Repo.PullRequest.HeadInfo = ctx.Repo.Owner.Name + ":" + ctx.Repo.BranchName
-			} else if repo.AllowsPulls() {
-				// Or, this is repository accepts pull requests between branches.
-				canCompare = true
-				ctx.Data["BaseRepo"] = repo
-				ctx.Repo.PullRequest.BaseRepo = repo
-				ctx.Repo.PullRequest.Allowed = canPush
-				ctx.Repo.PullRequest.SameRepo = true
-				ctx.Repo.PullRequest.HeadInfo = ctx.Repo.BranchName
-			}
-			ctx.Data["CanCompareOrPull"] = canCompare
-			ctx.Data["PullRequestCtx"] = ctx.Repo.PullRequest
+	// Disable everything when the repo is being created
+	if ctx.Repo.Repository.IsBeingCreated() {
+		ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch
+		return
+	}
 
-			if ctx.Repo.Repository.Status == models.RepositoryPendingTransfer {
-				repoTransfer, err := models.GetPendingRepositoryTransfer(ctx.Repo.Repository)
-				if err != nil {
-					ctx.ServerError("GetPendingRepositoryTransfer", err)
-					return
-				}
+	gitRepo, err := git.OpenRepository(models.RepoPath(userName, repoName))
+	if err != nil {
+		ctx.ServerError("RepoAssignment Invalid repo "+models.RepoPath(userName, repoName), err)
+		return
+	}
+	ctx.Repo.GitRepo = gitRepo
 
-				if err := repoTransfer.LoadAttributes(); err != nil {
-					ctx.ServerError("LoadRecipient", err)
-					return
-				}
+	// We opened it, we should close it
+	defer func() {
+		// If it's been set to nil then assume someone else has closed it.
+		if ctx.Repo.GitRepo != nil {
+			ctx.Repo.GitRepo.Close()
+		}
+	}()
 
-				ctx.Data["RepoTransfer"] = repoTransfer
-				if ctx.User != nil {
-					ctx.Data["CanUserAcceptTransfer"] = repoTransfer.CanUserAcceptTransfer(ctx.User)
-				}
-			}
+	// Stop at this point when the repo is empty.
+	if ctx.Repo.Repository.IsEmpty {
+		ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch
+		return
+	}
 
-			if ctx.Query("go-get") == "1" {
-				ctx.Data["GoGetImport"] = ComposeGoGetImport(owner.Name, repo.Name)
-				prefix := setting.AppURL + path.Join(owner.Name, repo.Name, "src", "branch", ctx.Repo.BranchName)
-				ctx.Data["GoDocDirectory"] = prefix + "{/dir}"
-				ctx.Data["GoDocFile"] = prefix + "{/dir}/{file}#L{line}"
-			}
-			next.ServeHTTP(w, req)
-		})
+	tags, err := ctx.Repo.GitRepo.GetTags()
+	if err != nil {
+		ctx.ServerError("GetTags", err)
+		return
+	}
+	ctx.Data["Tags"] = tags
+
+	brs, _, err := ctx.Repo.GitRepo.GetBranches(0, 0)
+	if err != nil {
+		ctx.ServerError("GetBranches", err)
+		return
+	}
+	ctx.Data["Branches"] = brs
+	ctx.Data["BranchesCount"] = len(brs)
+
+	ctx.Data["TagName"] = ctx.Repo.TagName
+
+	// If not branch selected, try default one.
+	// If default branch doesn't exists, fall back to some other branch.
+	if len(ctx.Repo.BranchName) == 0 {
+		if len(ctx.Repo.Repository.DefaultBranch) > 0 && gitRepo.IsBranchExist(ctx.Repo.Repository.DefaultBranch) {
+			ctx.Repo.BranchName = ctx.Repo.Repository.DefaultBranch
+		} else if len(brs) > 0 {
+			ctx.Repo.BranchName = brs[0]
+		}
+	}
+	ctx.Data["BranchName"] = ctx.Repo.BranchName
+	ctx.Data["CommitID"] = ctx.Repo.CommitID
+
+	// People who have push access or have forked repository can propose a new pull request.
+	canPush := ctx.Repo.CanWrite(models.UnitTypeCode) || (ctx.IsSigned && ctx.User.HasForkedRepo(ctx.Repo.Repository.ID))
+	canCompare := false
+
+	// Pull request is allowed if this is a fork repository
+	// and base repository accepts pull requests.
+	if repo.BaseRepo != nil && repo.BaseRepo.AllowsPulls() {
+		canCompare = true
+		ctx.Data["BaseRepo"] = repo.BaseRepo
+		ctx.Repo.PullRequest.BaseRepo = repo.BaseRepo
+		ctx.Repo.PullRequest.Allowed = canPush
+		ctx.Repo.PullRequest.HeadInfo = ctx.Repo.Owner.Name + ":" + ctx.Repo.BranchName
+	} else if repo.AllowsPulls() {
+		// Or, this is repository accepts pull requests between branches.
+		canCompare = true
+		ctx.Data["BaseRepo"] = repo
+		ctx.Repo.PullRequest.BaseRepo = repo
+		ctx.Repo.PullRequest.Allowed = canPush
+		ctx.Repo.PullRequest.SameRepo = true
+		ctx.Repo.PullRequest.HeadInfo = ctx.Repo.BranchName
+	}
+	ctx.Data["CanCompareOrPull"] = canCompare
+	ctx.Data["PullRequestCtx"] = ctx.Repo.PullRequest
+
+	if ctx.Repo.Repository.Status == models.RepositoryPendingTransfer {
+		repoTransfer, err := models.GetPendingRepositoryTransfer(ctx.Repo.Repository)
+		if err != nil {
+			ctx.ServerError("GetPendingRepositoryTransfer", err)
+			return
+		}
+
+		if err := repoTransfer.LoadAttributes(); err != nil {
+			ctx.ServerError("LoadRecipient", err)
+			return
+		}
+
+		ctx.Data["RepoTransfer"] = repoTransfer
+		if ctx.User != nil {
+			ctx.Data["CanUserAcceptTransfer"] = repoTransfer.CanUserAcceptTransfer(ctx.User)
+		}
+	}
+
+	if ctx.Query("go-get") == "1" {
+		ctx.Data["GoGetImport"] = ComposeGoGetImport(owner.Name, repo.Name)
+		prefix := setting.AppURL + path.Join(owner.Name, repo.Name, "src", "branch", ctx.Repo.BranchName)
+		ctx.Data["GoDocDirectory"] = prefix + "{/dir}"
+		ctx.Data["GoDocFile"] = prefix + "{/dir}/{file}#L{line}"
 	}
 }
 
@@ -651,7 +643,7 @@ const (
 
 // RepoRef handles repository reference names when the ref name is not
 // explicitly given
-func RepoRef() func(http.Handler) http.Handler {
+func RepoRef() func(*Context) {
 	// since no ref name is explicitly specified, ok to just use branch
 	return RepoRefByType(RepoRefBranch)
 }
@@ -730,130 +722,125 @@ func getRefName(ctx *Context, pathType RepoRefType) string {
 
 // RepoRefByType handles repository reference name for a specific type
 // of repository reference
-func RepoRefByType(refType RepoRefType) func(http.Handler) http.Handler {
-	return func(next http.Handler) http.Handler {
-		return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
-			ctx := GetContext(req)
-			// Empty repository does not have reference information.
-			if ctx.Repo.Repository.IsEmpty {
+func RepoRefByType(refType RepoRefType) func(*Context) {
+	return func(ctx *Context) {
+		// Empty repository does not have reference information.
+		if ctx.Repo.Repository.IsEmpty {
+			return
+		}
+
+		var (
+			refName string
+			err     error
+		)
+
+		if ctx.Repo.GitRepo == nil {
+			repoPath := models.RepoPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name)
+			ctx.Repo.GitRepo, err = git.OpenRepository(repoPath)
+			if err != nil {
+				ctx.ServerError("RepoRef Invalid repo "+repoPath, err)
 				return
 			}
+			// We opened it, we should close it
+			defer func() {
+				// If it's been set to nil then assume someone else has closed it.
+				if ctx.Repo.GitRepo != nil {
+					ctx.Repo.GitRepo.Close()
+				}
+			}()
+		}
 
-			var (
-				refName string
-				err     error
-			)
-
-			if ctx.Repo.GitRepo == nil {
-				repoPath := models.RepoPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name)
-				ctx.Repo.GitRepo, err = git.OpenRepository(repoPath)
+		// Get default branch.
+		if len(ctx.Params("*")) == 0 {
+			refName = ctx.Repo.Repository.DefaultBranch
+			ctx.Repo.BranchName = refName
+			if !ctx.Repo.GitRepo.IsBranchExist(refName) {
+				brs, _, err := ctx.Repo.GitRepo.GetBranches(0, 0)
 				if err != nil {
-					ctx.ServerError("RepoRef Invalid repo "+repoPath, err)
+					ctx.ServerError("GetBranches", err)
+					return
+				} else if len(brs) == 0 {
+					err = fmt.Errorf("No branches in non-empty repository %s",
+						ctx.Repo.GitRepo.Path)
+					ctx.ServerError("GetBranches", err)
 					return
 				}
-				// We opened it, we should close it
-				defer func() {
-					// If it's been set to nil then assume someone else has closed it.
-					if ctx.Repo.GitRepo != nil {
-						ctx.Repo.GitRepo.Close()
-					}
-				}()
+				refName = brs[0]
 			}
+			ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(refName)
+			if err != nil {
+				ctx.ServerError("GetBranchCommit", err)
+				return
+			}
+			ctx.Repo.CommitID = ctx.Repo.Commit.ID.String()
+			ctx.Repo.IsViewBranch = true
+
+		} else {
+			refName = getRefName(ctx, refType)
+			ctx.Repo.BranchName = refName
+			if refType.RefTypeIncludesBranches() && ctx.Repo.GitRepo.IsBranchExist(refName) {
+				ctx.Repo.IsViewBranch = true
 
-			// Get default branch.
-			if len(ctx.Params("*")) == 0 {
-				refName = ctx.Repo.Repository.DefaultBranch
-				ctx.Repo.BranchName = refName
-				if !ctx.Repo.GitRepo.IsBranchExist(refName) {
-					brs, _, err := ctx.Repo.GitRepo.GetBranches(0, 0)
-					if err != nil {
-						ctx.ServerError("GetBranches", err)
-						return
-					} else if len(brs) == 0 {
-						err = fmt.Errorf("No branches in non-empty repository %s",
-							ctx.Repo.GitRepo.Path)
-						ctx.ServerError("GetBranches", err)
-						return
-					}
-					refName = brs[0]
-				}
 				ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(refName)
 				if err != nil {
 					ctx.ServerError("GetBranchCommit", err)
 					return
 				}
 				ctx.Repo.CommitID = ctx.Repo.Commit.ID.String()
-				ctx.Repo.IsViewBranch = true
 
+			} else if refType.RefTypeIncludesTags() && ctx.Repo.GitRepo.IsTagExist(refName) {
+				ctx.Repo.IsViewTag = true
+				ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetTagCommit(refName)
+				if err != nil {
+					ctx.ServerError("GetTagCommit", err)
+					return
+				}
+				ctx.Repo.CommitID = ctx.Repo.Commit.ID.String()
+			} else if len(refName) >= 7 && len(refName) <= 40 {
+				ctx.Repo.IsViewCommit = true
+				ctx.Repo.CommitID = refName
+
+				ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(refName)
+				if err != nil {
+					ctx.NotFound("GetCommit", err)
+					return
+				}
+				// If short commit ID add canonical link header
+				if len(refName) < 40 {
+					ctx.Header().Set("Link", fmt.Sprintf("<%s>; rel=\"canonical\"",
+						util.URLJoin(setting.AppURL, strings.Replace(ctx.Req.URL.RequestURI(), refName, ctx.Repo.Commit.ID.String(), 1))))
+				}
 			} else {
-				refName = getRefName(ctx, refType)
-				ctx.Repo.BranchName = refName
-				if refType.RefTypeIncludesBranches() && ctx.Repo.GitRepo.IsBranchExist(refName) {
-					ctx.Repo.IsViewBranch = true
-
-					ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(refName)
-					if err != nil {
-						ctx.ServerError("GetBranchCommit", err)
-						return
-					}
-					ctx.Repo.CommitID = ctx.Repo.Commit.ID.String()
-
-				} else if refType.RefTypeIncludesTags() && ctx.Repo.GitRepo.IsTagExist(refName) {
-					ctx.Repo.IsViewTag = true
-					ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetTagCommit(refName)
-					if err != nil {
-						ctx.ServerError("GetTagCommit", err)
-						return
-					}
-					ctx.Repo.CommitID = ctx.Repo.Commit.ID.String()
-				} else if len(refName) >= 7 && len(refName) <= 40 {
-					ctx.Repo.IsViewCommit = true
-					ctx.Repo.CommitID = refName
-
-					ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(refName)
-					if err != nil {
-						ctx.NotFound("GetCommit", err)
-						return
-					}
-					// If short commit ID add canonical link header
-					if len(refName) < 40 {
-						ctx.Header().Set("Link", fmt.Sprintf("<%s>; rel=\"canonical\"",
-							util.URLJoin(setting.AppURL, strings.Replace(ctx.Req.URL.RequestURI(), refName, ctx.Repo.Commit.ID.String(), 1))))
-					}
-				} else {
-					ctx.NotFound("RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
-					return
-				}
-
-				if refType == RepoRefLegacy {
-					// redirect from old URL scheme to new URL scheme
-					ctx.Redirect(path.Join(
-						setting.AppSubURL,
-						strings.TrimSuffix(ctx.Req.URL.Path, ctx.Params("*")),
-						ctx.Repo.BranchNameSubURL(),
-						ctx.Repo.TreePath))
-					return
-				}
-			}
-
-			ctx.Data["BranchName"] = ctx.Repo.BranchName
-			ctx.Data["BranchNameSubURL"] = ctx.Repo.BranchNameSubURL()
-			ctx.Data["CommitID"] = ctx.Repo.CommitID
-			ctx.Data["TreePath"] = ctx.Repo.TreePath
-			ctx.Data["IsViewBranch"] = ctx.Repo.IsViewBranch
-			ctx.Data["IsViewTag"] = ctx.Repo.IsViewTag
-			ctx.Data["IsViewCommit"] = ctx.Repo.IsViewCommit
-			ctx.Data["CanCreateBranch"] = ctx.Repo.CanCreateBranch()
-
-			ctx.Repo.CommitsCount, err = ctx.Repo.GetCommitsCount()
-			if err != nil {
-				ctx.ServerError("GetCommitsCount", err)
+				ctx.NotFound("RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
 				return
 			}
-			ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount
 
-			next.ServeHTTP(w, req)
-		})
+			if refType == RepoRefLegacy {
+				// redirect from old URL scheme to new URL scheme
+				ctx.Redirect(path.Join(
+					setting.AppSubURL,
+					strings.TrimSuffix(ctx.Req.URL.Path, ctx.Params("*")),
+					ctx.Repo.BranchNameSubURL(),
+					ctx.Repo.TreePath))
+				return
+			}
+		}
+
+		ctx.Data["BranchName"] = ctx.Repo.BranchName
+		ctx.Data["BranchNameSubURL"] = ctx.Repo.BranchNameSubURL()
+		ctx.Data["CommitID"] = ctx.Repo.CommitID
+		ctx.Data["TreePath"] = ctx.Repo.TreePath
+		ctx.Data["IsViewBranch"] = ctx.Repo.IsViewBranch
+		ctx.Data["IsViewTag"] = ctx.Repo.IsViewTag
+		ctx.Data["IsViewCommit"] = ctx.Repo.IsViewCommit
+		ctx.Data["CanCreateBranch"] = ctx.Repo.CanCreateBranch()
+
+		ctx.Repo.CommitsCount, err = ctx.Repo.GetCommitsCount()
+		if err != nil {
+			ctx.ServerError("GetCommitsCount", err)
+			return
+		}
+		ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount
 	}
 }
 
diff --git a/routers/routes/web.go b/routers/routes/web.go
index 7081b30e54..4815680c99 100644
--- a/routers/routes/web.go
+++ b/routers/routes/web.go
@@ -691,7 +691,7 @@ func RegisterRoutes(m *web.Route) {
 	}, reqSignIn)
 
 	// ***** Release Attachment Download without Signin
-	m.Get("/{username}/{reponame}/releases/download/{vTag}/{fileName}", ignSignIn, context.RepoAssignment(), repo.MustBeNotEmpty, repo.RedirectDownload)
+	m.Get("/{username}/{reponame}/releases/download/{vTag}/{fileName}", ignSignIn, context.RepoAssignment, repo.MustBeNotEmpty, repo.RedirectDownload)
 
 	m.Group("/{username}/{reponame}", func() {
 		m.Group("/settings", func() {
@@ -771,9 +771,9 @@ func RegisterRoutes(m *web.Route) {
 			ctx.Data["PageIsSettings"] = true
 			ctx.Data["LFSStartServer"] = setting.LFS.StartServer
 		})
-	}, reqSignIn, context.RepoAssignment(), context.UnitTypes(), reqRepoAdmin, context.RepoRef())
+	}, reqSignIn, context.RepoAssignment, context.UnitTypes(), reqRepoAdmin, context.RepoRef())
 
-	m.Post("/{username}/{reponame}/action/{action}", reqSignIn, context.RepoAssignment(), context.UnitTypes(), repo.Action)
+	m.Post("/{username}/{reponame}/action/{action}", reqSignIn, context.RepoAssignment, context.UnitTypes(), repo.Action)
 
 	// Grouping for those endpoints not requiring authentication
 	m.Group("/{username}/{reponame}", func() {
@@ -783,7 +783,7 @@ func RegisterRoutes(m *web.Route) {
 		m.Combo("/compare/*", repo.MustBeNotEmpty, reqRepoCodeReader, repo.SetEditorconfigIfExists).
 			Get(ignSignIn, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.CompareDiff).
 			Post(reqSignIn, context.RepoMustNotBeArchived(), reqRepoPullsReader, repo.MustAllowPulls, bindIgnErr(forms.CreateIssueForm{}), repo.SetWhitespaceBehavior, repo.CompareAndPullRequestPost)
-	}, context.RepoAssignment(), context.UnitTypes())
+	}, context.RepoAssignment, context.UnitTypes())
 
 	// Grouping for those endpoints that do require authentication
 	m.Group("/{username}/{reponame}", func() {
@@ -890,7 +890,7 @@ func RegisterRoutes(m *web.Route) {
 			m.Post("/restore", repo.RestoreBranchPost)
 		}, context.RepoMustNotBeArchived(), reqRepoCodeWriter, repo.MustBeNotEmpty)
 
-	}, reqSignIn, context.RepoAssignment(), context.UnitTypes())
+	}, reqSignIn, context.RepoAssignment, context.UnitTypes())
 
 	// Releases
 	m.Group("/{username}/{reponame}", func() {
@@ -928,11 +928,11 @@ func RegisterRoutes(m *web.Route) {
 			}
 			ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount
 		})
-	}, ignSignIn, context.RepoAssignment(), context.UnitTypes(), reqRepoReleaseReader)
+	}, ignSignIn, context.RepoAssignment, context.UnitTypes(), reqRepoReleaseReader)
 
 	m.Group("/{username}/{reponame}", func() {
 		m.Post("/topics", repo.TopicsPost)
-	}, context.RepoAssignment(), context.RepoMustNotBeArchived(), reqRepoAdmin)
+	}, context.RepoAssignment, context.RepoMustNotBeArchived(), reqRepoAdmin)
 
 	m.Group("/{username}/{reponame}", func() {
 		m.Group("", func() {
@@ -1080,17 +1080,17 @@ func RegisterRoutes(m *web.Route) {
 		}, context.RepoRef(), reqRepoCodeReader)
 		m.Get("/commit/{sha:([a-f0-9]{7,40})}.{ext:patch|diff}",
 			repo.MustBeNotEmpty, reqRepoCodeReader, repo.RawDiff)
-	}, ignSignIn, context.RepoAssignment(), context.UnitTypes())
+	}, ignSignIn, context.RepoAssignment, context.UnitTypes())
 	m.Group("/{username}/{reponame}", func() {
 		m.Get("/stars", repo.Stars)
 		m.Get("/watchers", repo.Watchers)
 		m.Get("/search", reqRepoCodeReader, repo.Search)
-	}, ignSignIn, context.RepoAssignment(), context.RepoRef(), context.UnitTypes())
+	}, ignSignIn, context.RepoAssignment, context.RepoRef(), context.UnitTypes())
 
 	m.Group("/{username}", func() {
 		m.Group("/{reponame}", func() {
 			m.Get("", repo.SetEditorconfigIfExists, repo.Home)
-		}, goGet, ignSignIn, context.RepoAssignment(), context.RepoRef(), context.UnitTypes())
+		}, goGet, ignSignIn, context.RepoAssignment, context.RepoRef(), context.UnitTypes())
 
 		m.Group("/{reponame}", func() {
 			m.Group("/info/lfs", func() {