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
import (
2014-03-27 20:07:22 +04:00
"container/list"
"path"
2014-03-30 20:11:28 +04:00
"github.com/go-martini/martini"
2014-03-27 20:07:22 +04:00
2014-03-24 14:25:15 +04:00
"github.com/gogits/gogs/models"
2014-03-27 21:17:09 +04:00
"github.com/gogits/gogs/modules/base"
2014-03-24 14:25:15 +04:00
"github.com/gogits/gogs/modules/middleware"
)
func Commits ( ctx * middleware . Context , params martini . Params ) {
2014-03-27 20:07:22 +04:00
userName := params [ "username" ]
repoName := params [ "reponame" ]
branchName := params [ "branchname" ]
brs , err := models . GetBranches ( userName , repoName )
2014-03-24 14:25:15 +04:00
if err != nil {
2014-04-12 03:44:13 +04:00
ctx . Handle ( 500 , "repo.Commits" , err )
2014-03-24 14:25:15 +04:00
return
} else if len ( brs ) == 0 {
ctx . Handle ( 404 , "repo.Commits" , nil )
return
}
2014-04-12 04:23:34 +04:00
repoPath := models . RepoPath ( userName , repoName )
commitsCount , err := models . GetCommitsCount ( repoPath , branchName )
if err != nil {
ctx . Handle ( 500 , "repo.Commits(GetCommitsCount)" , err )
return
}
// Calculate and validate page number.
page , _ := base . StrTo ( ctx . Query ( "p" ) ) . Int ( )
if page < 1 {
page = 1
}
lastPage := page - 1
if lastPage < 0 {
lastPage = 0
}
nextPage := page + 1
if nextPage * 50 > commitsCount {
nextPage = 0
}
2014-04-12 06:57:25 +04:00
//both `git log branchName` and `git log commitId` work
commits , err := models . GetCommitsByRange ( repoPath , branchName , page )
2014-04-12 07:52:08 +04:00
if err != nil {
ctx . Handle ( 500 , "repo.Commits(get commits)" , err )
return
}
2014-03-27 20:07:22 +04:00
ctx . Data [ "Username" ] = userName
ctx . Data [ "Reponame" ] = repoName
2014-04-12 04:23:34 +04:00
ctx . Data [ "CommitCount" ] = commitsCount
2014-03-24 14:25:15 +04:00
ctx . Data [ "Commits" ] = commits
2014-04-12 04:23:34 +04:00
ctx . Data [ "LastPageNum" ] = lastPage
ctx . Data [ "NextPageNum" ] = nextPage
2014-03-27 20:07:22 +04:00
ctx . Data [ "IsRepoToolbarCommits" ] = true
2014-03-24 14:25:15 +04:00
ctx . HTML ( 200 , "repo/commits" )
}
2014-03-24 17:27:19 +04:00
2014-03-26 07:53:01 +04:00
func Diff ( ctx * middleware . Context , params martini . Params ) {
2014-03-30 06:13:02 +04:00
userName := ctx . Repo . Owner . Name
repoName := ctx . Repo . Repository . Name
branchName := ctx . Repo . BranchName
commitId := ctx . Repo . CommitId
2014-03-27 21:17:09 +04:00
2014-03-30 06:13:02 +04:00
commit := ctx . Repo . Commit
2014-03-26 07:53:01 +04:00
2014-03-27 21:17:09 +04:00
diff , err := models . GetDiff ( models . RepoPath ( userName , repoName ) , commitId )
2014-03-26 07:53:01 +04:00
if err != nil {
ctx . Handle ( 404 , "repo.Diff" , err )
return
}
2014-03-27 21:17:09 +04:00
isImageFile := func ( name string ) bool {
repoFile , err := models . GetTargetFile ( userName , repoName ,
branchName , commitId , name )
if err != nil {
return false
}
blob , err := repoFile . LookupBlob ( )
if err != nil {
return false
}
data := blob . Contents ( )
_ , isImage := base . IsImageFile ( data )
return isImage
}
ctx . Data [ "IsImageFile" ] = isImageFile
2014-03-30 06:13:02 +04:00
ctx . Data [ "Title" ] = commit . Message ( ) + " · " + base . ShortSha ( commitId )
2014-03-26 07:53:01 +04:00
ctx . Data [ "Commit" ] = commit
ctx . Data [ "Diff" ] = diff
2014-03-24 17:27:19 +04:00
ctx . Data [ "IsRepoToolbarCommits" ] = true
2014-03-27 21:17:09 +04:00
ctx . Data [ "SourcePath" ] = "/" + path . Join ( userName , repoName , "src" , commitId )
ctx . Data [ "RawPath" ] = "/" + path . Join ( userName , repoName , "raw" , commitId )
2014-03-26 07:53:01 +04:00
ctx . HTML ( 200 , "repo/diff" )
2014-03-24 17:27:19 +04:00
}
2014-04-12 03:44:13 +04:00
func SearchCommits ( ctx * middleware . Context , params martini . Params ) {
keyword := ctx . Query ( "q" )
if len ( keyword ) == 0 {
ctx . Redirect ( ctx . Repo . RepoLink + "/commits/" + ctx . Repo . BranchName )
return
}
userName := params [ "username" ]
repoName := params [ "reponame" ]
branchName := params [ "branchname" ]
brs , err := models . GetBranches ( userName , repoName )
if err != nil {
ctx . Handle ( 500 , "repo.SearchCommits(GetBranches)" , err )
return
} else if len ( brs ) == 0 {
ctx . Handle ( 404 , "repo.SearchCommits(GetBranches)" , nil )
return
}
var commits * list . List
if ! models . IsBranchExist ( userName , repoName , branchName ) {
ctx . Handle ( 404 , "repo.SearchCommits(IsBranchExist)" , err )
return
} else if commits , err = models . SearchCommits ( models . RepoPath ( userName , repoName ) , branchName , keyword ) ; err != nil {
ctx . Handle ( 500 , "repo.SearchCommits(SearchCommits)" , err )
return
}
ctx . Data [ "Keyword" ] = keyword
ctx . Data [ "Username" ] = userName
ctx . Data [ "Reponame" ] = repoName
ctx . Data [ "CommitCount" ] = commits . Len ( )
ctx . Data [ "Commits" ] = commits
2014-04-12 04:23:34 +04:00
ctx . Data [ "IsSearchPage" ] = true
2014-04-12 03:44:13 +04:00
ctx . Data [ "IsRepoToolbarCommits" ] = true
ctx . HTML ( 200 , "repo/commits" )
}