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 ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io/ioutil" | 	"io/ioutil" | ||||||
| 	"net/http" |  | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"path" | 	"path" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | @ -394,238 +393,231 @@ func RepoIDAssignment() func(ctx *Context) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // RepoAssignment returns a middleware to handle repository assignment
 | // RepoAssignment returns a middleware to handle repository assignment
 | ||||||
| func RepoAssignment() func(http.Handler) http.Handler { | func RepoAssignment(ctx *Context) { | ||||||
| 	return func(next http.Handler) http.Handler { | 	var ( | ||||||
| 		return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { | 		owner *models.User | ||||||
| 			var ( | 		err   error | ||||||
| 				owner *models.User | 	) | ||||||
| 				err   error |  | ||||||
| 				ctx   = GetContext(req) |  | ||||||
| 			) |  | ||||||
| 
 | 
 | ||||||
| 			userName := ctx.Params(":username") | 	userName := ctx.Params(":username") | ||||||
| 			repoName := ctx.Params(":reponame") | 	repoName := ctx.Params(":reponame") | ||||||
| 			repoName = strings.TrimSuffix(repoName, ".git") | 	repoName = strings.TrimSuffix(repoName, ".git") | ||||||
| 
 | 
 | ||||||
| 			// Check if the user is the same as the repository owner
 | 	// Check if the user is the same as the repository owner
 | ||||||
| 			if ctx.IsSigned && ctx.User.LowerName == strings.ToLower(userName) { | 	if ctx.IsSigned && ctx.User.LowerName == strings.ToLower(userName) { | ||||||
| 				owner = ctx.User | 		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 { | 			} else { | ||||||
| 				owner, err = models.GetUserByName(userName) | 				ctx.ServerError("GetUserByName", err) | ||||||
| 				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.Repo.Owner = owner | 			return | ||||||
| 			ctx.Data["Username"] = ctx.Repo.Owner.Name | 		} | ||||||
|  | 	} | ||||||
|  | 	ctx.Repo.Owner = owner | ||||||
|  | 	ctx.Data["Username"] = ctx.Repo.Owner.Name | ||||||
| 
 | 
 | ||||||
| 			// Get repository.
 | 	// Get repository.
 | ||||||
| 			repo, err := models.GetRepositoryByName(owner.ID, repoName) | 	repo, err := models.GetRepositoryByName(owner.ID, repoName) | ||||||
| 			if err != nil { | 	if err != nil { | ||||||
| 				if models.IsErrRepoNotExist(err) { | 		if models.IsErrRepoNotExist(err) { | ||||||
| 					redirectRepoID, err := models.LookupRepoRedirect(owner.ID, repoName) | 			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) |  | ||||||
| 			if err == nil { | 			if err == nil { | ||||||
| 				ctx.Data["RepoExternalIssuesLink"] = unit.ExternalTrackerConfig().ExternalTrackerURL | 				RedirectToRepo(ctx, redirectRepoID) | ||||||
| 			} | 			} else if models.IsErrRepoRedirectNotExist(err) { | ||||||
| 
 | 				if ctx.Query("go-get") == "1" { | ||||||
| 			ctx.Data["NumTags"], err = models.GetReleaseCountByRepoID(ctx.Repo.Repository.ID, models.FindReleasesOptions{ | 					EarlyResponseForGoGetMeta(ctx) | ||||||
| 				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() { |  | ||||||
| 					return | 					return | ||||||
| 				} | 				} | ||||||
|  | 				ctx.NotFound("GetRepositoryByName", nil) | ||||||
|  | 			} else { | ||||||
|  | 				ctx.ServerError("LookupRepoRedirect", err) | ||||||
| 			} | 			} | ||||||
|  | 		} else { | ||||||
|  | 			ctx.ServerError("GetRepositoryByName", err) | ||||||
|  | 		} | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	repo.Owner = owner | ||||||
| 
 | 
 | ||||||
| 			if repo.IsGenerated() { | 	repoAssignment(ctx, repo) | ||||||
| 				RetrieveTemplateRepo(ctx, repo) | 	if ctx.Written() { | ||||||
| 				if ctx.Written() { | 		return | ||||||
| 					return | 	} | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 
 | 
 | ||||||
| 			// Disable everything when the repo is being created
 | 	ctx.Repo.RepoLink = repo.Link() | ||||||
| 			if ctx.Repo.Repository.IsBeingCreated() { | 	ctx.Data["RepoLink"] = ctx.Repo.RepoLink | ||||||
| 				ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch | 	ctx.Data["RepoRelPath"] = ctx.Repo.Owner.Name + "/" + ctx.Repo.Repository.Name | ||||||
| 				return |  | ||||||
| 			} |  | ||||||
| 
 | 
 | ||||||
| 			gitRepo, err := git.OpenRepository(models.RepoPath(userName, repoName)) | 	unit, err := ctx.Repo.Repository.GetUnit(models.UnitTypeExternalTracker) | ||||||
| 			if err != nil { | 	if err == nil { | ||||||
| 				ctx.ServerError("RepoAssignment Invalid repo "+models.RepoPath(userName, repoName), err) | 		ctx.Data["RepoExternalIssuesLink"] = unit.ExternalTrackerConfig().ExternalTrackerURL | ||||||
| 				return | 	} | ||||||
| 			} |  | ||||||
| 			ctx.Repo.GitRepo = gitRepo |  | ||||||
| 
 | 
 | ||||||
| 			// We opened it, we should close it
 | 	ctx.Data["NumTags"], err = models.GetReleaseCountByRepoID(ctx.Repo.Repository.ID, models.FindReleasesOptions{ | ||||||
| 			defer func() { | 		IncludeTags: true, | ||||||
| 				// If it's been set to nil then assume someone else has closed it.
 | 	}) | ||||||
| 				if ctx.Repo.GitRepo != nil { | 	if err != nil { | ||||||
| 					ctx.Repo.GitRepo.Close() | 		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.
 | 	ctx.Data["Title"] = owner.Name + "/" + repo.Name | ||||||
| 			if ctx.Repo.Repository.IsEmpty { | 	ctx.Data["Repository"] = repo | ||||||
| 				ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch | 	ctx.Data["Owner"] = ctx.Repo.Repository.Owner | ||||||
| 				next.ServeHTTP(w, req) | 	ctx.Data["IsRepositoryOwner"] = ctx.Repo.IsOwner() | ||||||
| 				return | 	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 ctx.Data["CanSignedUserFork"], err = ctx.Repo.Repository.CanUserFork(ctx.User); err != nil { | ||||||
| 			if err != nil { | 		ctx.ServerError("CanUserFork", err) | ||||||
| 				ctx.ServerError("GetTags", err) | 		return | ||||||
| 				return | 	} | ||||||
| 			} |  | ||||||
| 			ctx.Data["Tags"] = tags |  | ||||||
| 
 | 
 | ||||||
| 			brs, _, err := ctx.Repo.GitRepo.GetBranches(0, 0) | 	ctx.Data["DisableSSH"] = setting.SSH.Disabled | ||||||
| 			if err != nil { | 	ctx.Data["ExposeAnonSSH"] = setting.SSH.ExposeAnonymous | ||||||
| 				ctx.ServerError("GetBranches", err) | 	ctx.Data["DisableHTTP"] = setting.Repository.DisableHTTPGit | ||||||
| 				return | 	ctx.Data["RepoSearchEnabled"] = setting.Indexer.RepoIndexerEnabled | ||||||
| 			} | 	ctx.Data["CloneLink"] = repo.CloneLink() | ||||||
| 			ctx.Data["Branches"] = brs | 	ctx.Data["WikiCloneLink"] = repo.WikiCloneLink() | ||||||
| 			ctx.Data["BranchesCount"] = len(brs) |  | ||||||
| 
 | 
 | ||||||
| 			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 repo.IsFork { | ||||||
| 			// If default branch doesn't exists, fall back to some other branch.
 | 		RetrieveBaseRepo(ctx, repo) | ||||||
| 			if len(ctx.Repo.BranchName) == 0 { | 		if ctx.Written() { | ||||||
| 				if len(ctx.Repo.Repository.DefaultBranch) > 0 && gitRepo.IsBranchExist(ctx.Repo.Repository.DefaultBranch) { | 			return | ||||||
| 					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.
 | 	if repo.IsGenerated() { | ||||||
| 			canPush := ctx.Repo.CanWrite(models.UnitTypeCode) || (ctx.IsSigned && ctx.User.HasForkedRepo(ctx.Repo.Repository.ID)) | 		RetrieveTemplateRepo(ctx, repo) | ||||||
| 			canCompare := false | 		if ctx.Written() { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 			// Pull request is allowed if this is a fork repository
 | 	// Disable everything when the repo is being created
 | ||||||
| 			// and base repository accepts pull requests.
 | 	if ctx.Repo.Repository.IsBeingCreated() { | ||||||
| 			if repo.BaseRepo != nil && repo.BaseRepo.AllowsPulls() { | 		ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch | ||||||
| 				canCompare = true | 		return | ||||||
| 				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 { | 	gitRepo, err := git.OpenRepository(models.RepoPath(userName, repoName)) | ||||||
| 				repoTransfer, err := models.GetPendingRepositoryTransfer(ctx.Repo.Repository) | 	if err != nil { | ||||||
| 				if err != nil { | 		ctx.ServerError("RepoAssignment Invalid repo "+models.RepoPath(userName, repoName), err) | ||||||
| 					ctx.ServerError("GetPendingRepositoryTransfer", err) | 		return | ||||||
| 					return | 	} | ||||||
| 				} | 	ctx.Repo.GitRepo = gitRepo | ||||||
| 
 | 
 | ||||||
| 				if err := repoTransfer.LoadAttributes(); err != nil { | 	// We opened it, we should close it
 | ||||||
| 					ctx.ServerError("LoadRecipient", err) | 	defer func() { | ||||||
| 					return | 		// 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 | 	// Stop at this point when the repo is empty.
 | ||||||
| 				if ctx.User != nil { | 	if ctx.Repo.Repository.IsEmpty { | ||||||
| 					ctx.Data["CanUserAcceptTransfer"] = repoTransfer.CanUserAcceptTransfer(ctx.User) | 		ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch | ||||||
| 				} | 		return | ||||||
| 			} | 	} | ||||||
| 
 | 
 | ||||||
| 			if ctx.Query("go-get") == "1" { | 	tags, err := ctx.Repo.GitRepo.GetTags() | ||||||
| 				ctx.Data["GoGetImport"] = ComposeGoGetImport(owner.Name, repo.Name) | 	if err != nil { | ||||||
| 				prefix := setting.AppURL + path.Join(owner.Name, repo.Name, "src", "branch", ctx.Repo.BranchName) | 		ctx.ServerError("GetTags", err) | ||||||
| 				ctx.Data["GoDocDirectory"] = prefix + "{/dir}" | 		return | ||||||
| 				ctx.Data["GoDocFile"] = prefix + "{/dir}/{file}#L{line}" | 	} | ||||||
| 			} | 	ctx.Data["Tags"] = tags | ||||||
| 			next.ServeHTTP(w, req) | 
 | ||||||
| 		}) | 	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
 | // RepoRef handles repository reference names when the ref name is not
 | ||||||
| // explicitly given
 | // 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
 | 	// since no ref name is explicitly specified, ok to just use branch
 | ||||||
| 	return RepoRefByType(RepoRefBranch) | 	return RepoRefByType(RepoRefBranch) | ||||||
| } | } | ||||||
|  | @ -730,130 +722,125 @@ func getRefName(ctx *Context, pathType RepoRefType) string { | ||||||
| 
 | 
 | ||||||
| // RepoRefByType handles repository reference name for a specific type
 | // RepoRefByType handles repository reference name for a specific type
 | ||||||
| // of repository reference
 | // of repository reference
 | ||||||
| func RepoRefByType(refType RepoRefType) func(http.Handler) http.Handler { | func RepoRefByType(refType RepoRefType) func(*Context) { | ||||||
| 	return func(next http.Handler) http.Handler { | 	return func(ctx *Context) { | ||||||
| 		return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { | 		// Empty repository does not have reference information.
 | ||||||
| 			ctx := GetContext(req) | 		if ctx.Repo.Repository.IsEmpty { | ||||||
| 			// Empty repository does not have reference information.
 | 			return | ||||||
| 			if ctx.Repo.Repository.IsEmpty { | 		} | ||||||
|  | 
 | ||||||
|  | 		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 | 				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 ( | 		// Get default branch.
 | ||||||
| 				refName string | 		if len(ctx.Params("*")) == 0 { | ||||||
| 				err     error | 			refName = ctx.Repo.Repository.DefaultBranch | ||||||
| 			) | 			ctx.Repo.BranchName = refName | ||||||
| 
 | 			if !ctx.Repo.GitRepo.IsBranchExist(refName) { | ||||||
| 			if ctx.Repo.GitRepo == nil { | 				brs, _, err := ctx.Repo.GitRepo.GetBranches(0, 0) | ||||||
| 				repoPath := models.RepoPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name) |  | ||||||
| 				ctx.Repo.GitRepo, err = git.OpenRepository(repoPath) |  | ||||||
| 				if err != nil { | 				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 | 					return | ||||||
| 				} | 				} | ||||||
| 				// We opened it, we should close it
 | 				refName = brs[0] | ||||||
| 				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.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) | 				ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(refName) | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					ctx.ServerError("GetBranchCommit", err) | 					ctx.ServerError("GetBranchCommit", err) | ||||||
| 					return | 					return | ||||||
| 				} | 				} | ||||||
| 				ctx.Repo.CommitID = ctx.Repo.Commit.ID.String() | 				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 { | 			} else { | ||||||
| 				refName = getRefName(ctx, refType) | 				ctx.NotFound("RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName)) | ||||||
| 				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) |  | ||||||
| 				return | 				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) | 	}, reqSignIn) | ||||||
| 
 | 
 | ||||||
| 	// ***** Release Attachment Download without Signin
 | 	// ***** 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("/{username}/{reponame}", func() { | ||||||
| 		m.Group("/settings", func() { | 		m.Group("/settings", func() { | ||||||
|  | @ -771,9 +771,9 @@ func RegisterRoutes(m *web.Route) { | ||||||
| 			ctx.Data["PageIsSettings"] = true | 			ctx.Data["PageIsSettings"] = true | ||||||
| 			ctx.Data["LFSStartServer"] = setting.LFS.StartServer | 			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
 | 	// Grouping for those endpoints not requiring authentication
 | ||||||
| 	m.Group("/{username}/{reponame}", func() { | 	m.Group("/{username}/{reponame}", func() { | ||||||
|  | @ -783,7 +783,7 @@ func RegisterRoutes(m *web.Route) { | ||||||
| 		m.Combo("/compare/*", repo.MustBeNotEmpty, reqRepoCodeReader, repo.SetEditorconfigIfExists). | 		m.Combo("/compare/*", repo.MustBeNotEmpty, reqRepoCodeReader, repo.SetEditorconfigIfExists). | ||||||
| 			Get(ignSignIn, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.CompareDiff). | 			Get(ignSignIn, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.CompareDiff). | ||||||
| 			Post(reqSignIn, context.RepoMustNotBeArchived(), reqRepoPullsReader, repo.MustAllowPulls, bindIgnErr(forms.CreateIssueForm{}), repo.SetWhitespaceBehavior, repo.CompareAndPullRequestPost) | 			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
 | 	// Grouping for those endpoints that do require authentication
 | ||||||
| 	m.Group("/{username}/{reponame}", func() { | 	m.Group("/{username}/{reponame}", func() { | ||||||
|  | @ -890,7 +890,7 @@ func RegisterRoutes(m *web.Route) { | ||||||
| 			m.Post("/restore", repo.RestoreBranchPost) | 			m.Post("/restore", repo.RestoreBranchPost) | ||||||
| 		}, context.RepoMustNotBeArchived(), reqRepoCodeWriter, repo.MustBeNotEmpty) | 		}, context.RepoMustNotBeArchived(), reqRepoCodeWriter, repo.MustBeNotEmpty) | ||||||
| 
 | 
 | ||||||
| 	}, reqSignIn, context.RepoAssignment(), context.UnitTypes()) | 	}, reqSignIn, context.RepoAssignment, context.UnitTypes()) | ||||||
| 
 | 
 | ||||||
| 	// Releases
 | 	// Releases
 | ||||||
| 	m.Group("/{username}/{reponame}", func() { | 	m.Group("/{username}/{reponame}", func() { | ||||||
|  | @ -928,11 +928,11 @@ func RegisterRoutes(m *web.Route) { | ||||||
| 			} | 			} | ||||||
| 			ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount | 			ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount | ||||||
| 		}) | 		}) | ||||||
| 	}, ignSignIn, context.RepoAssignment(), context.UnitTypes(), reqRepoReleaseReader) | 	}, ignSignIn, context.RepoAssignment, context.UnitTypes(), reqRepoReleaseReader) | ||||||
| 
 | 
 | ||||||
| 	m.Group("/{username}/{reponame}", func() { | 	m.Group("/{username}/{reponame}", func() { | ||||||
| 		m.Post("/topics", repo.TopicsPost) | 		m.Post("/topics", repo.TopicsPost) | ||||||
| 	}, context.RepoAssignment(), context.RepoMustNotBeArchived(), reqRepoAdmin) | 	}, context.RepoAssignment, context.RepoMustNotBeArchived(), reqRepoAdmin) | ||||||
| 
 | 
 | ||||||
| 	m.Group("/{username}/{reponame}", func() { | 	m.Group("/{username}/{reponame}", func() { | ||||||
| 		m.Group("", func() { | 		m.Group("", func() { | ||||||
|  | @ -1080,17 +1080,17 @@ func RegisterRoutes(m *web.Route) { | ||||||
| 		}, context.RepoRef(), reqRepoCodeReader) | 		}, context.RepoRef(), reqRepoCodeReader) | ||||||
| 		m.Get("/commit/{sha:([a-f0-9]{7,40})}.{ext:patch|diff}", | 		m.Get("/commit/{sha:([a-f0-9]{7,40})}.{ext:patch|diff}", | ||||||
| 			repo.MustBeNotEmpty, reqRepoCodeReader, repo.RawDiff) | 			repo.MustBeNotEmpty, reqRepoCodeReader, repo.RawDiff) | ||||||
| 	}, ignSignIn, context.RepoAssignment(), context.UnitTypes()) | 	}, ignSignIn, context.RepoAssignment, context.UnitTypes()) | ||||||
| 	m.Group("/{username}/{reponame}", func() { | 	m.Group("/{username}/{reponame}", func() { | ||||||
| 		m.Get("/stars", repo.Stars) | 		m.Get("/stars", repo.Stars) | ||||||
| 		m.Get("/watchers", repo.Watchers) | 		m.Get("/watchers", repo.Watchers) | ||||||
| 		m.Get("/search", reqRepoCodeReader, repo.Search) | 		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("/{username}", func() { | ||||||
| 		m.Group("/{reponame}", func() { | 		m.Group("/{reponame}", func() { | ||||||
| 			m.Get("", repo.SetEditorconfigIfExists, repo.Home) | 			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("/{reponame}", func() { | ||||||
| 			m.Group("/info/lfs", func() { | 			m.Group("/info/lfs", func() { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue