mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Refactor routers directory (#15800)
* refactor routers directory * move func used for web and api to common * make corsHandler a function to prohibit side efects * rm unused func Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
		
							
								
								
									
										401
									
								
								routers/web/repo/commit.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										401
									
								
								routers/web/repo/commit.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,401 @@ | ||||
| // Copyright 2014 The Gogs Authors. All rights reserved. | ||||
| // Copyright 2019 The Gitea Authors. All rights reserved. | ||||
| // Use of this source code is governed by a MIT-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package repo | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"net/http" | ||||
| 	"path" | ||||
| 	"strings" | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/base" | ||||
| 	"code.gitea.io/gitea/modules/charset" | ||||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/git" | ||||
| 	"code.gitea.io/gitea/modules/gitgraph" | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
| 	"code.gitea.io/gitea/services/gitdiff" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	tplCommits    base.TplName = "repo/commits" | ||||
| 	tplGraph      base.TplName = "repo/graph" | ||||
| 	tplGraphDiv   base.TplName = "repo/graph/div" | ||||
| 	tplCommitPage base.TplName = "repo/commit_page" | ||||
| ) | ||||
|  | ||||
| // RefCommits render commits page | ||||
| func RefCommits(ctx *context.Context) { | ||||
| 	switch { | ||||
| 	case len(ctx.Repo.TreePath) == 0: | ||||
| 		Commits(ctx) | ||||
| 	case ctx.Repo.TreePath == "search": | ||||
| 		SearchCommits(ctx) | ||||
| 	default: | ||||
| 		FileHistory(ctx) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Commits render branch's commits | ||||
| func Commits(ctx *context.Context) { | ||||
| 	ctx.Data["PageIsCommits"] = true | ||||
| 	if ctx.Repo.Commit == nil { | ||||
| 		ctx.NotFound("Commit not found", nil) | ||||
| 		return | ||||
| 	} | ||||
| 	ctx.Data["PageIsViewCode"] = true | ||||
|  | ||||
| 	commitsCount, err := ctx.Repo.GetCommitsCount() | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("GetCommitsCount", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	page := ctx.QueryInt("page") | ||||
| 	if page <= 1 { | ||||
| 		page = 1 | ||||
| 	} | ||||
|  | ||||
| 	pageSize := ctx.QueryInt("limit") | ||||
| 	if pageSize <= 0 { | ||||
| 		pageSize = git.CommitsRangeSize | ||||
| 	} | ||||
|  | ||||
| 	// Both `git log branchName` and `git log commitId` work. | ||||
| 	commits, err := ctx.Repo.Commit.CommitsByRange(page, pageSize) | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("CommitsByRange", err) | ||||
| 		return | ||||
| 	} | ||||
| 	commits = models.ValidateCommitsWithEmails(commits) | ||||
| 	commits = models.ParseCommitsWithSignature(commits, ctx.Repo.Repository) | ||||
| 	commits = models.ParseCommitsWithStatus(commits, ctx.Repo.Repository) | ||||
| 	ctx.Data["Commits"] = commits | ||||
|  | ||||
| 	ctx.Data["Username"] = ctx.Repo.Owner.Name | ||||
| 	ctx.Data["Reponame"] = ctx.Repo.Repository.Name | ||||
| 	ctx.Data["CommitCount"] = commitsCount | ||||
| 	ctx.Data["Branch"] = ctx.Repo.BranchName | ||||
|  | ||||
| 	pager := context.NewPagination(int(commitsCount), git.CommitsRangeSize, page, 5) | ||||
| 	pager.SetDefaultParams(ctx) | ||||
| 	ctx.Data["Page"] = pager | ||||
|  | ||||
| 	ctx.HTML(http.StatusOK, tplCommits) | ||||
| } | ||||
|  | ||||
| // Graph render commit graph - show commits from all branches. | ||||
| func Graph(ctx *context.Context) { | ||||
| 	ctx.Data["Title"] = ctx.Tr("repo.commit_graph") | ||||
| 	ctx.Data["PageIsCommits"] = true | ||||
| 	ctx.Data["PageIsViewCode"] = true | ||||
| 	mode := strings.ToLower(ctx.QueryTrim("mode")) | ||||
| 	if mode != "monochrome" { | ||||
| 		mode = "color" | ||||
| 	} | ||||
| 	ctx.Data["Mode"] = mode | ||||
| 	hidePRRefs := ctx.QueryBool("hide-pr-refs") | ||||
| 	ctx.Data["HidePRRefs"] = hidePRRefs | ||||
| 	branches := ctx.QueryStrings("branch") | ||||
| 	realBranches := make([]string, len(branches)) | ||||
| 	copy(realBranches, branches) | ||||
| 	for i, branch := range realBranches { | ||||
| 		if strings.HasPrefix(branch, "--") { | ||||
| 			realBranches[i] = "refs/heads/" + branch | ||||
| 		} | ||||
| 	} | ||||
| 	ctx.Data["SelectedBranches"] = realBranches | ||||
| 	files := ctx.QueryStrings("file") | ||||
|  | ||||
| 	commitsCount, err := ctx.Repo.GetCommitsCount() | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("GetCommitsCount", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	graphCommitsCount, err := ctx.Repo.GetCommitGraphsCount(hidePRRefs, realBranches, files) | ||||
| 	if err != nil { | ||||
| 		log.Warn("GetCommitGraphsCount error for generate graph exclude prs: %t branches: %s in %-v, Will Ignore branches and try again. Underlying Error: %v", hidePRRefs, branches, ctx.Repo.Repository, err) | ||||
| 		realBranches = []string{} | ||||
| 		branches = []string{} | ||||
| 		graphCommitsCount, err = ctx.Repo.GetCommitGraphsCount(hidePRRefs, realBranches, files) | ||||
| 		if err != nil { | ||||
| 			ctx.ServerError("GetCommitGraphsCount", err) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	page := ctx.QueryInt("page") | ||||
|  | ||||
| 	graph, err := gitgraph.GetCommitGraph(ctx.Repo.GitRepo, page, 0, hidePRRefs, realBranches, files) | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("GetCommitGraph", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if err := graph.LoadAndProcessCommits(ctx.Repo.Repository, ctx.Repo.GitRepo); err != nil { | ||||
| 		ctx.ServerError("LoadAndProcessCommits", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	ctx.Data["Graph"] = graph | ||||
|  | ||||
| 	gitRefs, err := ctx.Repo.GitRepo.GetRefs() | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("GitRepo.GetRefs", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	ctx.Data["AllRefs"] = gitRefs | ||||
|  | ||||
| 	ctx.Data["Username"] = ctx.Repo.Owner.Name | ||||
| 	ctx.Data["Reponame"] = ctx.Repo.Repository.Name | ||||
| 	ctx.Data["CommitCount"] = commitsCount | ||||
| 	ctx.Data["Branch"] = ctx.Repo.BranchName | ||||
| 	paginator := context.NewPagination(int(graphCommitsCount), setting.UI.GraphMaxCommitNum, page, 5) | ||||
| 	paginator.AddParam(ctx, "mode", "Mode") | ||||
| 	paginator.AddParam(ctx, "hide-pr-refs", "HidePRRefs") | ||||
| 	for _, branch := range branches { | ||||
| 		paginator.AddParamString("branch", branch) | ||||
| 	} | ||||
| 	for _, file := range files { | ||||
| 		paginator.AddParamString("file", file) | ||||
| 	} | ||||
| 	ctx.Data["Page"] = paginator | ||||
| 	if ctx.QueryBool("div-only") { | ||||
| 		ctx.HTML(http.StatusOK, tplGraphDiv) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	ctx.HTML(http.StatusOK, tplGraph) | ||||
| } | ||||
|  | ||||
| // SearchCommits render commits filtered by keyword | ||||
| func SearchCommits(ctx *context.Context) { | ||||
| 	ctx.Data["PageIsCommits"] = true | ||||
| 	ctx.Data["PageIsViewCode"] = true | ||||
|  | ||||
| 	query := strings.Trim(ctx.Query("q"), " ") | ||||
| 	if len(query) == 0 { | ||||
| 		ctx.Redirect(ctx.Repo.RepoLink + "/commits/" + ctx.Repo.BranchNameSubURL()) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	all := ctx.QueryBool("all") | ||||
| 	opts := git.NewSearchCommitsOptions(query, all) | ||||
| 	commits, err := ctx.Repo.Commit.SearchCommits(opts) | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("SearchCommits", err) | ||||
| 		return | ||||
| 	} | ||||
| 	commits = models.ValidateCommitsWithEmails(commits) | ||||
| 	commits = models.ParseCommitsWithSignature(commits, ctx.Repo.Repository) | ||||
| 	commits = models.ParseCommitsWithStatus(commits, ctx.Repo.Repository) | ||||
| 	ctx.Data["Commits"] = commits | ||||
|  | ||||
| 	ctx.Data["Keyword"] = query | ||||
| 	if all { | ||||
| 		ctx.Data["All"] = "checked" | ||||
| 	} | ||||
| 	ctx.Data["Username"] = ctx.Repo.Owner.Name | ||||
| 	ctx.Data["Reponame"] = ctx.Repo.Repository.Name | ||||
| 	ctx.Data["CommitCount"] = commits.Len() | ||||
| 	ctx.Data["Branch"] = ctx.Repo.BranchName | ||||
| 	ctx.HTML(http.StatusOK, tplCommits) | ||||
| } | ||||
|  | ||||
| // FileHistory show a file's reversions | ||||
| func FileHistory(ctx *context.Context) { | ||||
| 	ctx.Data["IsRepoToolbarCommits"] = true | ||||
|  | ||||
| 	fileName := ctx.Repo.TreePath | ||||
| 	if len(fileName) == 0 { | ||||
| 		Commits(ctx) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	branchName := ctx.Repo.BranchName | ||||
| 	commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(branchName, fileName) | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("FileCommitsCount", err) | ||||
| 		return | ||||
| 	} else if commitsCount == 0 { | ||||
| 		ctx.NotFound("FileCommitsCount", nil) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	page := ctx.QueryInt("page") | ||||
| 	if page <= 1 { | ||||
| 		page = 1 | ||||
| 	} | ||||
|  | ||||
| 	commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange(branchName, fileName, page) | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("CommitsByFileAndRange", err) | ||||
| 		return | ||||
| 	} | ||||
| 	commits = models.ValidateCommitsWithEmails(commits) | ||||
| 	commits = models.ParseCommitsWithSignature(commits, ctx.Repo.Repository) | ||||
| 	commits = models.ParseCommitsWithStatus(commits, ctx.Repo.Repository) | ||||
| 	ctx.Data["Commits"] = commits | ||||
|  | ||||
| 	ctx.Data["Username"] = ctx.Repo.Owner.Name | ||||
| 	ctx.Data["Reponame"] = ctx.Repo.Repository.Name | ||||
| 	ctx.Data["FileName"] = fileName | ||||
| 	ctx.Data["CommitCount"] = commitsCount | ||||
| 	ctx.Data["Branch"] = branchName | ||||
|  | ||||
| 	pager := context.NewPagination(int(commitsCount), git.CommitsRangeSize, page, 5) | ||||
| 	pager.SetDefaultParams(ctx) | ||||
| 	ctx.Data["Page"] = pager | ||||
|  | ||||
| 	ctx.HTML(http.StatusOK, tplCommits) | ||||
| } | ||||
|  | ||||
| // Diff show different from current commit to previous commit | ||||
| func Diff(ctx *context.Context) { | ||||
| 	ctx.Data["PageIsDiff"] = true | ||||
| 	ctx.Data["RequireHighlightJS"] = true | ||||
| 	ctx.Data["RequireSimpleMDE"] = true | ||||
| 	ctx.Data["RequireTribute"] = true | ||||
|  | ||||
| 	userName := ctx.Repo.Owner.Name | ||||
| 	repoName := ctx.Repo.Repository.Name | ||||
| 	commitID := ctx.Params(":sha") | ||||
| 	var ( | ||||
| 		gitRepo  *git.Repository | ||||
| 		err      error | ||||
| 		repoPath string | ||||
| 	) | ||||
|  | ||||
| 	if ctx.Data["PageIsWiki"] != nil { | ||||
| 		gitRepo, err = git.OpenRepository(ctx.Repo.Repository.WikiPath()) | ||||
| 		if err != nil { | ||||
| 			ctx.ServerError("Repo.GitRepo.GetCommit", err) | ||||
| 			return | ||||
| 		} | ||||
| 		repoPath = ctx.Repo.Repository.WikiPath() | ||||
| 	} else { | ||||
| 		gitRepo = ctx.Repo.GitRepo | ||||
| 		repoPath = models.RepoPath(userName, repoName) | ||||
| 	} | ||||
|  | ||||
| 	commit, err := gitRepo.GetCommit(commitID) | ||||
| 	if err != nil { | ||||
| 		if git.IsErrNotExist(err) { | ||||
| 			ctx.NotFound("Repo.GitRepo.GetCommit", err) | ||||
| 		} else { | ||||
| 			ctx.ServerError("Repo.GitRepo.GetCommit", err) | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
| 	if len(commitID) != 40 { | ||||
| 		commitID = commit.ID.String() | ||||
| 	} | ||||
|  | ||||
| 	statuses, err := models.GetLatestCommitStatus(ctx.Repo.Repository.ID, commitID, models.ListOptions{}) | ||||
| 	if err != nil { | ||||
| 		log.Error("GetLatestCommitStatus: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	ctx.Data["CommitStatus"] = models.CalcCommitStatus(statuses) | ||||
| 	ctx.Data["CommitStatuses"] = statuses | ||||
|  | ||||
| 	diff, err := gitdiff.GetDiffCommitWithWhitespaceBehavior(repoPath, | ||||
| 		commitID, setting.Git.MaxGitDiffLines, | ||||
| 		setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, | ||||
| 		gitdiff.GetWhitespaceFlag(ctx.Data["WhitespaceBehavior"].(string))) | ||||
| 	if err != nil { | ||||
| 		ctx.NotFound("GetDiffCommitWithWhitespaceBehavior", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	parents := make([]string, commit.ParentCount()) | ||||
| 	for i := 0; i < commit.ParentCount(); i++ { | ||||
| 		sha, err := commit.ParentID(i) | ||||
| 		if err != nil { | ||||
| 			ctx.NotFound("repo.Diff", err) | ||||
| 			return | ||||
| 		} | ||||
| 		parents[i] = sha.String() | ||||
| 	} | ||||
|  | ||||
| 	ctx.Data["CommitID"] = commitID | ||||
| 	ctx.Data["AfterCommitID"] = commitID | ||||
| 	ctx.Data["Username"] = userName | ||||
| 	ctx.Data["Reponame"] = repoName | ||||
|  | ||||
| 	var parentCommit *git.Commit | ||||
| 	if commit.ParentCount() > 0 { | ||||
| 		parentCommit, err = gitRepo.GetCommit(parents[0]) | ||||
| 		if err != nil { | ||||
| 			ctx.NotFound("GetParentCommit", err) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 	headTarget := path.Join(userName, repoName) | ||||
| 	setCompareContext(ctx, parentCommit, commit, headTarget) | ||||
| 	ctx.Data["Title"] = commit.Summary() + " · " + base.ShortSha(commitID) | ||||
| 	ctx.Data["Commit"] = commit | ||||
| 	verification := models.ParseCommitWithSignature(commit) | ||||
| 	ctx.Data["Verification"] = verification | ||||
| 	ctx.Data["Author"] = models.ValidateCommitWithEmail(commit) | ||||
| 	ctx.Data["Diff"] = diff | ||||
| 	ctx.Data["Parents"] = parents | ||||
| 	ctx.Data["DiffNotAvailable"] = diff.NumFiles == 0 | ||||
|  | ||||
| 	if err := models.CalculateTrustStatus(verification, ctx.Repo.Repository, nil); err != nil { | ||||
| 		ctx.ServerError("CalculateTrustStatus", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	note := &git.Note{} | ||||
| 	err = git.GetNote(ctx, ctx.Repo.GitRepo, commitID, note) | ||||
| 	if err == nil { | ||||
| 		ctx.Data["Note"] = string(charset.ToUTF8WithFallback(note.Message)) | ||||
| 		ctx.Data["NoteCommit"] = note.Commit | ||||
| 		ctx.Data["NoteAuthor"] = models.ValidateCommitWithEmail(note.Commit) | ||||
| 	} | ||||
|  | ||||
| 	ctx.Data["BranchName"], err = commit.GetBranchName() | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("commit.GetBranchName", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	ctx.Data["TagName"], err = commit.GetTagName() | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("commit.GetTagName", err) | ||||
| 		return | ||||
| 	} | ||||
| 	ctx.HTML(http.StatusOK, tplCommitPage) | ||||
| } | ||||
|  | ||||
| // RawDiff dumps diff results of repository in given commit ID to io.Writer | ||||
| func RawDiff(ctx *context.Context) { | ||||
| 	var repoPath string | ||||
| 	if ctx.Data["PageIsWiki"] != nil { | ||||
| 		repoPath = ctx.Repo.Repository.WikiPath() | ||||
| 	} else { | ||||
| 		repoPath = models.RepoPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name) | ||||
| 	} | ||||
| 	if err := git.GetRawDiff( | ||||
| 		repoPath, | ||||
| 		ctx.Params(":sha"), | ||||
| 		git.RawDiffType(ctx.Params(":ext")), | ||||
| 		ctx.Resp, | ||||
| 	); err != nil { | ||||
| 		if git.IsErrNotExist(err) { | ||||
| 			ctx.NotFound("GetRawDiff", | ||||
| 				errors.New("commit "+ctx.Params(":sha")+" does not exist.")) | ||||
| 			return | ||||
| 		} | ||||
| 		ctx.ServerError("GetRawDiff", err) | ||||
| 		return | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user