2014-03-24 14:25:15 +04:00
// Copyright 2014 The Gogs 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
2014-07-26 10:28:04 +04:00
import (
2014-12-05 13:02:52 +03:00
"container/list"
2014-07-26 10:28:04 +04:00
"path"
2015-08-20 15:18:49 +03:00
"github.com/Unknwon/paginater"
2014-07-26 10:28:04 +04:00
2015-12-16 01:25:45 +03:00
"github.com/gogits/git-module"
2015-12-10 04:46:05 +03:00
2014-07-26 10:28:04 +04:00
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/base"
2016-03-11 19:56:52 +03:00
"github.com/gogits/gogs/modules/context"
2014-09-17 08:03:03 +04:00
"github.com/gogits/gogs/modules/setting"
2014-07-26 10:28:04 +04:00
)
const (
COMMITS base . TplName = "repo/commits"
DIFF base . TplName = "repo/diff"
)
2016-03-11 19:56:52 +03:00
func RefCommits ( ctx * context . Context ) {
2014-11-07 06:06:41 +03:00
switch {
case len ( ctx . Repo . TreeName ) == 0 :
Commits ( ctx )
case ctx . Repo . TreeName == "search" :
SearchCommits ( ctx )
default :
FileHistory ( ctx )
}
}
2014-12-09 10:18:25 +03:00
func RenderIssueLinks ( oldCommits * list . List , repoLink string ) * list . List {
newCommits := list . New ( )
for e := oldCommits . Front ( ) ; e != nil ; e = e . Next ( ) {
c := e . Value . ( * git . Commit )
newCommits . PushBack ( c )
}
return newCommits
}
2016-03-11 19:56:52 +03:00
func Commits ( ctx * context . Context ) {
2015-08-20 15:18:49 +03:00
ctx . Data [ "PageIsCommits" ] = true
2014-07-26 10:28:04 +04:00
commitsCount , err := ctx . Repo . Commit . CommitsCount ( )
if err != nil {
ctx . Handle ( 500 , "GetCommitsCount" , err )
return
}
2015-08-20 15:18:49 +03:00
page := ctx . QueryInt ( "page" )
if page <= 1 {
2014-07-26 10:28:04 +04:00
page = 1
}
2015-12-10 04:46:05 +03:00
ctx . Data [ "Page" ] = paginater . New ( int ( commitsCount ) , git . CommitsRangeSize , page , 5 )
2014-07-26 10:28:04 +04:00
// Both `git log branchName` and `git log commitId` work.
2014-09-23 23:30:04 +04:00
commits , err := ctx . Repo . Commit . CommitsByRange ( page )
2014-07-26 10:28:04 +04:00
if err != nil {
ctx . Handle ( 500 , "CommitsByRange" , err )
return
}
2014-12-05 13:02:52 +03:00
commits = RenderIssueLinks ( commits , ctx . Repo . RepoLink )
2014-09-26 16:55:13 +04:00
commits = models . ValidateCommitsWithEmails ( commits )
2014-09-23 23:30:04 +04:00
ctx . Data [ "Commits" ] = commits
2015-11-11 00:46:17 +03:00
ctx . Data [ "Username" ] = ctx . Repo . Owner . Name
ctx . Data [ "Reponame" ] = ctx . Repo . Repository . Name
2014-07-26 10:28:04 +04:00
ctx . Data [ "CommitCount" ] = commitsCount
2015-11-11 00:46:17 +03:00
ctx . Data [ "Branch" ] = ctx . Repo . BranchName
2014-07-26 10:28:04 +04:00
ctx . HTML ( 200 , COMMITS )
}
2016-03-11 19:56:52 +03:00
func SearchCommits ( ctx * context . Context ) {
2015-08-20 15:18:49 +03:00
ctx . Data [ "PageIsCommits" ] = true
2014-07-26 10:28:04 +04:00
keyword := ctx . Query ( "q" )
if len ( keyword ) == 0 {
ctx . Redirect ( ctx . Repo . RepoLink + "/commits/" + ctx . Repo . BranchName )
return
}
commits , err := ctx . Repo . Commit . SearchCommits ( keyword )
if err != nil {
2014-09-26 04:55:14 +04:00
ctx . Handle ( 500 , "SearchCommits" , err )
2014-07-26 10:28:04 +04:00
return
}
2014-12-05 13:02:52 +03:00
commits = RenderIssueLinks ( commits , ctx . Repo . RepoLink )
2014-09-26 16:55:13 +04:00
commits = models . ValidateCommitsWithEmails ( commits )
2015-11-11 00:46:17 +03:00
ctx . Data [ "Commits" ] = commits
2014-07-26 10:28:04 +04:00
ctx . Data [ "Keyword" ] = keyword
2015-11-11 00:46:17 +03:00
ctx . Data [ "Username" ] = ctx . Repo . Owner . Name
ctx . Data [ "Reponame" ] = ctx . Repo . Repository . Name
2014-07-26 10:28:04 +04:00
ctx . Data [ "CommitCount" ] = commits . Len ( )
2015-11-11 00:46:17 +03:00
ctx . Data [ "Branch" ] = ctx . Repo . BranchName
2014-07-26 10:28:04 +04:00
ctx . HTML ( 200 , COMMITS )
}
2016-03-11 19:56:52 +03:00
func FileHistory ( ctx * context . Context ) {
2014-11-07 06:06:41 +03:00
ctx . Data [ "IsRepoToolbarCommits" ] = true
fileName := ctx . Repo . TreeName
if len ( fileName ) == 0 {
Commits ( ctx )
return
}
branchName := ctx . Repo . BranchName
commitsCount , err := ctx . Repo . GitRepo . FileCommitsCount ( branchName , fileName )
if err != nil {
2015-11-11 00:46:17 +03:00
ctx . Handle ( 500 , "FileCommitsCount" , err )
2014-11-07 06:06:41 +03:00
return
} else if commitsCount == 0 {
2015-11-11 00:46:17 +03:00
ctx . Handle ( 404 , "FileCommitsCount" , nil )
2014-11-07 06:06:41 +03:00
return
}
2015-11-11 00:46:17 +03:00
page := ctx . QueryInt ( "page" )
if page <= 1 {
2014-11-07 06:06:41 +03:00
page = 1
}
2015-12-10 04:46:05 +03:00
ctx . Data [ "Page" ] = paginater . New ( int ( commitsCount ) , git . CommitsRangeSize , page , 5 )
2014-11-07 06:06:41 +03:00
2015-11-11 00:46:17 +03:00
commits , err := ctx . Repo . GitRepo . CommitsByFileAndRange ( branchName , fileName , page )
2014-11-07 06:06:41 +03:00
if err != nil {
2015-11-11 00:46:17 +03:00
ctx . Handle ( 500 , "CommitsByFileAndRange" , err )
2014-11-07 06:06:41 +03:00
return
}
2014-12-05 13:02:52 +03:00
commits = RenderIssueLinks ( commits , ctx . Repo . RepoLink )
2014-11-07 06:06:41 +03:00
commits = models . ValidateCommitsWithEmails ( commits )
ctx . Data [ "Commits" ] = commits
2015-11-11 00:46:17 +03:00
ctx . Data [ "Username" ] = ctx . Repo . Owner . Name
ctx . Data [ "Reponame" ] = ctx . Repo . Repository . Name
2014-11-07 06:06:41 +03:00
ctx . Data [ "FileName" ] = fileName
ctx . Data [ "CommitCount" ] = commitsCount
2015-11-11 00:46:17 +03:00
ctx . Data [ "Branch" ] = branchName
2014-11-07 06:06:41 +03:00
ctx . HTML ( 200 , COMMITS )
}
2016-03-11 19:56:52 +03:00
func Diff ( ctx * context . Context ) {
2015-08-20 19:18:30 +03:00
ctx . Data [ "PageIsDiff" ] = true
2014-07-26 10:28:04 +04:00
userName := ctx . Repo . Owner . Name
repoName := ctx . Repo . Repository . Name
2016-03-21 17:49:46 +03:00
commitID := ctx . Params ( ":sha" )
commit , err := ctx . Repo . GitRepo . GetCommit ( commitID )
if err != nil {
2016-08-16 01:27:19 +03:00
if git . IsErrNotExist ( err ) {
ctx . Handle ( 404 , "Repo.GitRepo.GetCommit" , err )
} else {
ctx . Handle ( 500 , "Repo.GitRepo.GetCommit" , err )
}
2016-03-21 17:49:46 +03:00
return
}
2014-07-26 10:28:04 +04:00
2014-09-17 08:03:03 +04:00
diff , err := models . GetDiffCommit ( models . RepoPath ( userName , repoName ) ,
2016-06-29 18:11:00 +03:00
commitID , setting . Git . MaxGitDiffLines ,
setting . Git . MaxGitDiffLineCharacters , setting . Git . MaxGitDiffFiles )
2014-07-26 10:28:04 +04:00
if err != nil {
2014-08-26 16:20:18 +04:00
ctx . Handle ( 404 , "GetDiffCommit" , err )
2014-07-26 10:28:04 +04:00
return
}
parents := make ( [ ] string , commit . ParentCount ( ) )
for i := 0 ; i < commit . ParentCount ( ) ; i ++ {
2015-12-10 04:46:05 +03:00
sha , err := commit . ParentID ( i )
2014-07-26 10:28:04 +04:00
parents [ i ] = sha . String ( )
if err != nil {
ctx . Handle ( 404 , "repo.Diff" , err )
return
}
}
2016-08-12 03:07:09 +03:00
ec , err := ctx . Repo . GetEditorconfig ( )
if err != nil && ! git . IsErrNotExist ( err ) {
ctx . Handle ( 500 , "ErrGettingEditorconfig" , err )
return
}
ctx . Data [ "Editorconfig" ] = ec
2016-03-21 17:49:46 +03:00
ctx . Data [ "CommitID" ] = commitID
2016-01-03 01:13:47 +03:00
ctx . Data [ "IsSplitStyle" ] = ctx . Query ( "style" ) == "split"
2014-07-26 10:28:04 +04:00
ctx . Data [ "Username" ] = userName
ctx . Data [ "Reponame" ] = repoName
2015-09-02 11:08:05 +03:00
ctx . Data [ "IsImageFile" ] = commit . IsImageFile
2015-08-31 10:24:28 +03:00
ctx . Data [ "Title" ] = commit . Summary ( ) + " · " + base . ShortSha ( commitID )
2014-07-26 10:28:04 +04:00
ctx . Data [ "Commit" ] = commit
2014-10-11 05:40:51 +04:00
ctx . Data [ "Author" ] = models . ValidateCommitWithEmail ( commit )
2014-07-26 10:28:04 +04:00
ctx . Data [ "Diff" ] = diff
ctx . Data [ "Parents" ] = parents
ctx . Data [ "DiffNotAvailable" ] = diff . NumFiles ( ) == 0
2015-08-31 10:24:28 +03:00
ctx . Data [ "SourcePath" ] = setting . AppSubUrl + "/" + path . Join ( userName , repoName , "src" , commitID )
2015-08-20 15:18:49 +03:00
if commit . ParentCount ( ) > 0 {
2015-02-06 12:02:32 +03:00
ctx . Data [ "BeforeSourcePath" ] = setting . AppSubUrl + "/" + path . Join ( userName , repoName , "src" , parents [ 0 ] )
}
2015-08-31 10:24:28 +03:00
ctx . Data [ "RawPath" ] = setting . AppSubUrl + "/" + path . Join ( userName , repoName , "raw" , commitID )
2016-01-31 19:19:02 +03:00
ctx . Data [ "RequireHighlightJS" ] = true
2014-07-26 10:28:04 +04:00
ctx . HTML ( 200 , DIFF )
}
2016-03-21 17:49:46 +03:00
func RawDiff ( ctx * context . Context ) {
2016-07-30 18:39:58 +03:00
if err := models . GetRawDiff (
2016-07-30 18:02:22 +03:00
models . RepoPath ( ctx . Repo . Owner . Name , ctx . Repo . Repository . Name ) ,
ctx . Params ( ":sha" ) ,
2016-07-30 18:39:58 +03:00
models . RawDiffType ( ctx . Params ( ":ext" ) ) ,
ctx . Resp ,
) ; err != nil {
ctx . Handle ( 500 , "GetRawDiff" , err )
2016-07-30 18:02:22 +03:00
return
}
2016-03-21 17:49:46 +03:00
}
2016-03-11 19:56:52 +03:00
func CompareDiff ( ctx * context . Context ) {
2014-08-26 16:20:18 +04:00
ctx . Data [ "IsRepoToolbarCommits" ] = true
ctx . Data [ "IsDiffCompare" ] = true
userName := ctx . Repo . Owner . Name
repoName := ctx . Repo . Repository . Name
2015-08-31 10:24:28 +03:00
beforeCommitID := ctx . Params ( ":before" )
afterCommitID := ctx . Params ( ":after" )
2014-08-26 16:20:18 +04:00
2015-08-31 10:24:28 +03:00
commit , err := ctx . Repo . GitRepo . GetCommit ( afterCommitID )
2014-08-26 16:20:18 +04:00
if err != nil {
ctx . Handle ( 404 , "GetCommit" , err )
return
}
2015-08-31 10:24:28 +03:00
diff , err := models . GetDiffRange ( models . RepoPath ( userName , repoName ) , beforeCommitID ,
2016-06-29 18:11:00 +03:00
afterCommitID , setting . Git . MaxGitDiffLines ,
setting . Git . MaxGitDiffLineCharacters , setting . Git . MaxGitDiffFiles )
2014-08-26 16:20:18 +04:00
if err != nil {
ctx . Handle ( 404 , "GetDiffRange" , err )
return
}
2015-08-31 10:24:28 +03:00
commits , err := commit . CommitsBeforeUntil ( beforeCommitID )
2014-08-26 16:20:18 +04:00
if err != nil {
ctx . Handle ( 500 , "CommitsBeforeUntil" , err )
return
}
2014-10-11 05:40:51 +04:00
commits = models . ValidateCommitsWithEmails ( commits )
2014-08-26 16:20:18 +04:00
2016-01-03 01:13:47 +03:00
ctx . Data [ "IsSplitStyle" ] = ctx . Query ( "style" ) == "split"
2015-09-02 02:07:02 +03:00
ctx . Data [ "CommitRepoLink" ] = ctx . Repo . RepoLink
2014-08-26 16:20:18 +04:00
ctx . Data [ "Commits" ] = commits
ctx . Data [ "CommitCount" ] = commits . Len ( )
2015-08-31 10:24:28 +03:00
ctx . Data [ "BeforeCommitID" ] = beforeCommitID
ctx . Data [ "AfterCommitID" ] = afterCommitID
2014-08-26 16:20:18 +04:00
ctx . Data [ "Username" ] = userName
ctx . Data [ "Reponame" ] = repoName
2015-09-02 11:08:05 +03:00
ctx . Data [ "IsImageFile" ] = commit . IsImageFile
2015-08-31 10:24:28 +03:00
ctx . Data [ "Title" ] = "Comparing " + base . ShortSha ( beforeCommitID ) + "..." + base . ShortSha ( afterCommitID ) + " · " + userName + "/" + repoName
2014-08-26 16:20:18 +04:00
ctx . Data [ "Commit" ] = commit
ctx . Data [ "Diff" ] = diff
ctx . Data [ "DiffNotAvailable" ] = diff . NumFiles ( ) == 0
2015-08-31 10:24:28 +03:00
ctx . Data [ "SourcePath" ] = setting . AppSubUrl + "/" + path . Join ( userName , repoName , "src" , afterCommitID )
ctx . Data [ "BeforeSourcePath" ] = setting . AppSubUrl + "/" + path . Join ( userName , repoName , "src" , beforeCommitID )
ctx . Data [ "RawPath" ] = setting . AppSubUrl + "/" + path . Join ( userName , repoName , "raw" , afterCommitID )
2014-08-26 16:20:18 +04:00
ctx . HTML ( 200 , DIFF )
}