mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-11-04 00:11:04 +00:00 
			
		
		
		
	Turn RepoRef and RepoAssignment back into func(*Context) (#15372)
Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
This commit is contained in:
		
					parent
					
						
							
								d0eeba9ff9
							
						
					
				
			
			
				commit
				
					
						136a20926c
					
				
			
		
					 2 changed files with 312 additions and 325 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue