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
"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-04-13 05:35:36 +04:00
userName := ctx . Repo . Owner . Name
repoName := ctx . Repo . Repository . Name
2014-03-27 20:07:22 +04:00
2014-04-13 05:35:36 +04:00
brs , err := ctx . Repo . GitRepo . GetBranches ( )
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-13 05:35:36 +04:00
commitsCount , err := ctx . Repo . Commit . CommitsCount ( )
2014-04-12 04:23:34 +04:00
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
2014-04-13 05:35:36 +04:00
commits , err := ctx . Repo . Commit . CommitsByRange ( 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
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 {
2014-04-13 05:35:36 +04:00
blob , err := ctx . Repo . Commit . GetBlobByPath ( name )
2014-03-27 21:17:09 +04:00
if err != nil {
return false
}
2014-04-13 05:35:36 +04:00
data , err := blob . Data ( )
2014-03-27 21:17:09 +04:00
if err != nil {
return false
}
_ , isImage := base . IsImageFile ( data )
return isImage
}
2014-04-28 03:43:14 +04:00
parents := make ( [ ] string , commit . ParentCount ( ) )
for i := 0 ; i < commit . ParentCount ( ) ; i ++ {
sha , err := commit . ParentId ( i )
parents [ i ] = sha . String ( )
if err != nil {
ctx . Handle ( 404 , "repo.Diff" , err )
2014-04-29 05:53:40 +04:00
return
2014-04-28 03:43:14 +04:00
}
}
ctx . Data [ "Username" ] = userName
ctx . Data [ "Reponame" ] = repoName
2014-03-27 21:17:09 +04:00
ctx . Data [ "IsImageFile" ] = isImageFile
2014-04-27 10:46:03 +04:00
ctx . Data [ "Title" ] = commit . Summary ( ) + " · " + base . ShortSha ( commitId )
2014-03-26 07:53:01 +04:00
ctx . Data [ "Commit" ] = commit
ctx . Data [ "Diff" ] = diff
2014-04-28 03:43:14 +04:00
ctx . Data [ "Parents" ] = parents
2014-04-12 09:45:43 +04:00
ctx . Data [ "DiffNotAvailable" ] = diff . NumFiles ( ) == 0
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" ]
2014-04-13 05:35:36 +04:00
brs , err := ctx . Repo . GitRepo . GetBranches ( )
2014-04-12 03:44:13 +04:00
if err != nil {
ctx . Handle ( 500 , "repo.SearchCommits(GetBranches)" , err )
return
} else if len ( brs ) == 0 {
ctx . Handle ( 404 , "repo.SearchCommits(GetBranches)" , nil )
return
}
2014-04-13 05:35:36 +04:00
commits , err := ctx . Repo . Commit . SearchCommits ( keyword )
if err != nil {
2014-04-12 03:44:13 +04:00
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" )
}