Files
Atay-Makhzan/routers/repo/commit.go
T

348 lines
9.2 KiB
Go
Raw Normal View History

2014-03-24 18:25:15 +08:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Copyright 2019 The Gitea Authors. All rights reserved.
2014-03-24 18:25:15 +08:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package repo
2014-07-26 02:28:04 -04:00
import (
"path"
"strings"
2014-07-26 02:28:04 -04:00
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/base"
2019-08-15 09:07:28 -03:00
"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"
2014-07-26 02:28:04 -04:00
)
const (
tplCommits base.TplName = "repo/commits"
tplGraph base.TplName = "repo/graph"
tplCommitPage base.TplName = "repo/commit_page"
2014-07-26 02:28:04 -04:00
)
2016-11-24 15:04:31 +08:00
// RefCommits render commits page
2016-03-11 11:56:52 -05:00
func RefCommits(ctx *context.Context) {
2014-11-06 22:06:41 -05:00
switch {
2016-08-24 21:35:03 -07:00
case len(ctx.Repo.TreePath) == 0:
2014-11-06 22:06:41 -05:00
Commits(ctx)
2016-08-24 21:35:03 -07:00
case ctx.Repo.TreePath == "search":
2014-11-06 22:06:41 -05:00
SearchCommits(ctx)
default:
FileHistory(ctx)
}
}
2016-11-24 15:04:31 +08:00
// Commits render branch's commits
2016-03-11 11:56:52 -05:00
func Commits(ctx *context.Context) {
2015-08-20 20:18:49 +08:00
ctx.Data["PageIsCommits"] = true
2017-07-31 03:23:10 +02:00
if ctx.Repo.Commit == nil {
2018-01-10 22:34:17 +01:00
ctx.NotFound("Commit not found", nil)
2017-07-31 03:23:10 +02:00
return
}
2017-10-26 02:49:16 +02:00
ctx.Data["PageIsViewCode"] = true
2014-07-26 02:28:04 -04:00
2017-10-26 04:37:33 +03:00
commitsCount, err := ctx.Repo.GetCommitsCount()
2014-07-26 02:28:04 -04:00
if err != nil {
2018-01-10 22:34:17 +01:00
ctx.ServerError("GetCommitsCount", err)
2014-07-26 02:28:04 -04:00
return
}
2015-08-20 20:18:49 +08:00
page := ctx.QueryInt("page")
if page <= 1 {
2014-07-26 02:28:04 -04:00
page = 1
}
2020-01-24 19:00:29 +00:00
pageSize := ctx.QueryInt("limit")
if pageSize <= 0 {
pageSize = git.CommitsRangeSize
}
2014-07-26 02:28:04 -04:00
// Both `git log branchName` and `git log commitId` work.
2020-01-24 19:00:29 +00:00
commits, err := ctx.Repo.Commit.CommitsByRange(page, pageSize)
2014-07-26 02:28:04 -04:00
if err != nil {
2018-01-10 22:34:17 +01:00
ctx.ServerError("CommitsByRange", err)
2014-07-26 02:28:04 -04:00
return
}
2014-09-26 08:55:13 -04:00
commits = models.ValidateCommitsWithEmails(commits)
commits = models.ParseCommitsWithSignature(commits, ctx.Repo.Repository)
commits = models.ParseCommitsWithStatus(commits, ctx.Repo.Repository)
2014-09-23 15:30:04 -04:00
ctx.Data["Commits"] = commits
2015-11-10 16:46:17 -05:00
ctx.Data["Username"] = ctx.Repo.Owner.Name
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
2014-07-26 02:28:04 -04:00
ctx.Data["CommitCount"] = commitsCount
2015-11-10 16:46:17 -05:00
ctx.Data["Branch"] = ctx.Repo.BranchName
pager := context.NewPagination(int(commitsCount), git.CommitsRangeSize, page, 5)
pager.SetDefaultParams(ctx)
ctx.Data["Page"] = pager
2016-11-24 15:04:31 +08:00
ctx.HTML(200, tplCommits)
2014-07-26 02:28:04 -04:00
}
2016-12-29 00:44:32 +01:00
// Graph render commit graph - show commits from all branches.
func Graph(ctx *context.Context) {
ctx.Data["PageIsCommits"] = true
2017-10-26 02:49:16 +02:00
ctx.Data["PageIsViewCode"] = true
2020-08-06 09:04:08 +01:00
mode := strings.ToLower(ctx.QueryTrim("mode"))
if mode != "monochrome" {
mode = "color"
}
ctx.Data["Mode"] = mode
2016-12-29 00:44:32 +01:00
2017-10-26 04:37:33 +03:00
commitsCount, err := ctx.Repo.GetCommitsCount()
2016-12-29 00:44:32 +01:00
if err != nil {
2018-01-10 22:34:17 +01:00
ctx.ServerError("GetCommitsCount", err)
2016-12-29 00:44:32 +01:00
return
}
allCommitsCount, err := ctx.Repo.GitRepo.GetAllCommitsCount()
if err != nil {
ctx.ServerError("GetAllCommitsCount", err)
return
}
2019-10-15 00:38:35 +03:00
page := ctx.QueryInt("page")
2020-08-06 09:04:08 +01:00
graph, err := gitgraph.GetCommitGraph(ctx.Repo.GitRepo, page, 0)
2016-12-29 00:44:32 +01:00
if err != nil {
2018-01-10 22:34:17 +01:00
ctx.ServerError("GetCommitGraph", err)
2016-12-29 00:44:32 +01:00
return
}
ctx.Data["Graph"] = graph
ctx.Data["Username"] = ctx.Repo.Owner.Name
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
ctx.Data["CommitCount"] = commitsCount
ctx.Data["Branch"] = ctx.Repo.BranchName
2020-08-06 09:04:08 +01:00
paginator := context.NewPagination(int(allCommitsCount), setting.UI.GraphMaxCommitNum, page, 5)
paginator.AddParam(ctx, "mode", "Mode")
ctx.Data["Page"] = paginator
2016-12-29 00:44:32 +01:00
ctx.HTML(200, tplGraph)
}
2016-11-24 15:04:31 +08:00
// SearchCommits render commits filtered by keyword
2016-03-11 11:56:52 -05:00
func SearchCommits(ctx *context.Context) {
2015-08-20 20:18:49 +08:00
ctx.Data["PageIsCommits"] = true
2017-10-26 02:49:16 +02:00
ctx.Data["PageIsViewCode"] = true
2014-07-26 02:28:04 -04:00
query := strings.Trim(ctx.Query("q"), " ")
if len(query) == 0 {
2017-10-29 19:04:25 -07:00
ctx.Redirect(ctx.Repo.RepoLink + "/commits/" + ctx.Repo.BranchNameSubURL())
2014-07-26 02:28:04 -04:00
return
}
all := ctx.QueryBool("all")
opts := git.NewSearchCommitsOptions(query, all)
commits, err := ctx.Repo.Commit.SearchCommits(opts)
2014-07-26 02:28:04 -04:00
if err != nil {
2018-01-10 22:34:17 +01:00
ctx.ServerError("SearchCommits", err)
2014-07-26 02:28:04 -04:00
return
}
2014-09-26 08:55:13 -04:00
commits = models.ValidateCommitsWithEmails(commits)
commits = models.ParseCommitsWithSignature(commits, ctx.Repo.Repository)
commits = models.ParseCommitsWithStatus(commits, ctx.Repo.Repository)
2015-11-10 16:46:17 -05:00
ctx.Data["Commits"] = commits
2014-07-26 02:28:04 -04:00
ctx.Data["Keyword"] = query
if all {
ctx.Data["All"] = "checked"
}
2015-11-10 16:46:17 -05:00
ctx.Data["Username"] = ctx.Repo.Owner.Name
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
2014-07-26 02:28:04 -04:00
ctx.Data["CommitCount"] = commits.Len()
2015-11-10 16:46:17 -05:00
ctx.Data["Branch"] = ctx.Repo.BranchName
2016-11-24 15:04:31 +08:00
ctx.HTML(200, tplCommits)
2014-07-26 02:28:04 -04:00
}
2016-11-24 15:04:31 +08:00
// FileHistory show a file's reversions
2016-03-11 11:56:52 -05:00
func FileHistory(ctx *context.Context) {
2014-11-06 22:06:41 -05:00
ctx.Data["IsRepoToolbarCommits"] = true
2016-08-24 21:35:03 -07:00
fileName := ctx.Repo.TreePath
2014-11-06 22:06:41 -05:00
if len(fileName) == 0 {
Commits(ctx)
return
}
branchName := ctx.Repo.BranchName
commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(branchName, fileName)
if err != nil {
2018-01-10 22:34:17 +01:00
ctx.ServerError("FileCommitsCount", err)
2014-11-06 22:06:41 -05:00
return
} else if commitsCount == 0 {
2018-01-10 22:34:17 +01:00
ctx.NotFound("FileCommitsCount", nil)
2014-11-06 22:06:41 -05:00
return
}
2015-11-10 16:46:17 -05:00
page := ctx.QueryInt("page")
if page <= 1 {
2014-11-06 22:06:41 -05:00
page = 1
}
2015-11-10 16:46:17 -05:00
commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange(branchName, fileName, page)
2014-11-06 22:06:41 -05:00
if err != nil {
2018-01-10 22:34:17 +01:00
ctx.ServerError("CommitsByFileAndRange", err)
2014-11-06 22:06:41 -05:00
return
}
commits = models.ValidateCommitsWithEmails(commits)
commits = models.ParseCommitsWithSignature(commits, ctx.Repo.Repository)
commits = models.ParseCommitsWithStatus(commits, ctx.Repo.Repository)
2014-11-06 22:06:41 -05:00
ctx.Data["Commits"] = commits
2015-11-10 16:46:17 -05:00
ctx.Data["Username"] = ctx.Repo.Owner.Name
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
2014-11-06 22:06:41 -05:00
ctx.Data["FileName"] = fileName
ctx.Data["CommitCount"] = commitsCount
2015-11-10 16:46:17 -05:00
ctx.Data["Branch"] = branchName
pager := context.NewPagination(int(commitsCount), git.CommitsRangeSize, page, 5)
pager.SetDefaultParams(ctx)
ctx.Data["Page"] = pager
2016-11-24 15:04:31 +08:00
ctx.HTML(200, tplCommits)
2014-11-06 22:06:41 -05:00
}
2016-11-24 15:04:31 +08:00
// Diff show different from current commit to previous commit
2016-03-11 11:56:52 -05:00
func Diff(ctx *context.Context) {
2015-08-21 00:18:30 +08:00
ctx.Data["PageIsDiff"] = true
2016-08-16 07:31:54 -07:00
ctx.Data["RequireHighlightJS"] = true
ctx.Data["RequireSimpleMDE"] = true
ctx.Data["RequireTribute"] = true
2014-07-26 02:28:04 -04:00
userName := ctx.Repo.Owner.Name
repoName := ctx.Repo.Repository.Name
2016-03-21 10:49:46 -04:00
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)
}
2016-03-21 10:49:46 -04:00
commit, err := gitRepo.GetCommit(commitID)
2016-03-21 10:49:46 -04:00
if err != nil {
2016-08-15 15:27:19 -07:00
if git.IsErrNotExist(err) {
2018-01-10 22:34:17 +01:00
ctx.NotFound("Repo.GitRepo.GetCommit", err)
2016-08-15 15:27:19 -07:00
} else {
2018-01-10 22:34:17 +01:00
ctx.ServerError("Repo.GitRepo.GetCommit", err)
2016-08-15 15:27:19 -07:00
}
2016-03-21 10:49:46 -04:00
return
}
2016-11-06 22:15:44 +01:00
if len(commitID) != 40 {
commitID = commit.ID.String()
}
statuses, err := models.GetLatestCommitStatus(ctx.Repo.Repository, commitID, 0)
if err != nil {
2019-04-02 08:48:31 +01:00
log.Error("GetLatestCommitStatus: %v", err)
}
ctx.Data["CommitStatus"] = models.CalcCommitStatus(statuses)
diff, err := gitdiff.GetDiffCommit(repoPath,
commitID, setting.Git.MaxGitDiffLines,
setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles)
2014-07-26 02:28:04 -04:00
if err != nil {
2018-01-10 22:34:17 +01:00
ctx.NotFound("GetDiffCommit", err)
2014-07-26 02:28:04 -04:00
return
}
parents := make([]string, commit.ParentCount())
for i := 0; i < commit.ParentCount(); i++ {
sha, err := commit.ParentID(i)
2014-07-26 02:28:04 -04:00
if err != nil {
2018-01-10 22:34:17 +01:00
ctx.NotFound("repo.Diff", err)
2014-07-26 02:28:04 -04:00
return
}
2020-02-28 00:10:27 +01:00
parents[i] = sha.String()
2014-07-26 02:28:04 -04:00
}
2016-03-21 10:49:46 -04:00
ctx.Data["CommitID"] = commitID
ctx.Data["AfterCommitID"] = commitID
2014-07-26 02:28:04 -04:00
ctx.Data["Username"] = userName
ctx.Data["Reponame"] = repoName
var parentCommit *git.Commit
2019-09-16 11:03:22 +02:00
if commit.ParentCount() > 0 {
parentCommit, err = gitRepo.GetCommit(parents[0])
2019-09-16 11:03:22 +02:00
if err != nil {
ctx.NotFound("GetParentCommit", err)
return
}
}
setImageCompareContext(ctx, parentCommit, commit)
headTarget := path.Join(userName, repoName)
setPathsCompareContext(ctx, parentCommit, commit, headTarget)
2015-08-31 16:24:28 +09:00
ctx.Data["Title"] = commit.Summary() + " · " + base.ShortSha(commitID)
2014-07-26 02:28:04 -04:00
ctx.Data["Commit"] = commit
verification := models.ParseCommitWithSignature(commit)
ctx.Data["Verification"] = verification
2014-10-10 21:40:51 -04:00
ctx.Data["Author"] = models.ValidateCommitWithEmail(commit)
2014-07-26 02:28:04 -04:00
ctx.Data["Diff"] = diff
ctx.Data["Parents"] = parents
ctx.Data["DiffNotAvailable"] = diff.NumFiles == 0
2019-05-24 10:52:05 +03:00
if err := models.CalculateTrustStatus(verification, ctx.Repo.Repository, nil); err != nil {
ctx.ServerError("CalculateTrustStatus", err)
return
}
2019-05-24 10:52:05 +03:00
note := &git.Note{}
err = git.GetNote(ctx.Repo.GitRepo, commitID, note)
if err == nil {
2019-08-15 09:07:28 -03:00
ctx.Data["Note"] = string(charset.ToUTF8WithFallback(note.Message))
2019-05-24 10:52:05 +03:00
ctx.Data["NoteCommit"] = note.Commit
ctx.Data["NoteAuthor"] = models.ValidateCommitWithEmail(note.Commit)
}
ctx.Data["BranchName"], err = commit.GetBranchName()
2019-06-12 21:41:28 +02:00
if err != nil {
ctx.ServerError("commit.GetBranchName", err)
return
2019-06-12 21:41:28 +02:00
}
ctx.Data["TagName"], err = commit.GetTagName()
if err != nil {
ctx.ServerError("commit.GetTagName", err)
return
}
ctx.HTML(200, tplCommitPage)
2014-07-26 02:28:04 -04:00
}
2016-11-24 15:04:31 +08:00
// RawDiff dumps diff results of repository in given commit ID to io.Writer
2016-03-21 10:49:46 -04:00
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,
2016-07-30 11:02:22 -04:00
ctx.Params(":sha"),
git.RawDiffType(ctx.Params(":ext")),
ctx.Resp,
); err != nil {
2018-01-10 22:34:17 +01:00
ctx.ServerError("GetRawDiff", err)
2016-07-30 11:02:22 -04:00
return
}
2016-03-21 10:49:46 -04:00
}