2014-03-15 20:03:23 +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 middleware
import (
2014-03-16 10:28:24 +04:00
"errors"
2014-03-20 08:12:33 +04:00
"fmt"
2014-03-17 12:47:42 +04:00
"strings"
2014-03-16 10:28:24 +04:00
2014-03-15 20:03:23 +04:00
"github.com/codegangsta/martini"
2014-03-30 06:09:59 +04:00
"github.com/gogits/git"
2014-03-15 20:03:23 +04:00
"github.com/gogits/gogs/models"
2014-03-20 08:12:33 +04:00
"github.com/gogits/gogs/modules/base"
2014-03-15 20:03:23 +04:00
)
func RepoAssignment ( redirect bool ) martini . Handler {
return func ( ctx * Context , params martini . Params ) {
// assign false first
ctx . Data [ "IsRepositoryValid" ] = false
var (
user * models . User
err error
)
2014-03-30 06:09:59 +04:00
userName := params [ "username" ]
repoName := params [ "reponame" ]
branchName := params [ "branchname" ]
2014-03-15 20:03:23 +04:00
// get repository owner
2014-03-30 06:09:59 +04:00
ctx . Repo . IsOwner = ctx . IsSigned && ctx . User . LowerName == strings . ToLower ( userName )
2014-03-15 20:03:23 +04:00
if ! ctx . Repo . IsOwner {
user , err = models . GetUserByName ( params [ "username" ] )
if err != nil {
if redirect {
2014-03-19 17:57:55 +04:00
ctx . Redirect ( "/" )
2014-03-15 20:03:23 +04:00
return
}
2014-03-16 10:28:24 +04:00
ctx . Handle ( 200 , "RepoAssignment" , err )
2014-03-15 20:03:23 +04:00
return
}
} else {
user = ctx . User
}
if user == nil {
if redirect {
2014-03-19 17:57:55 +04:00
ctx . Redirect ( "/" )
2014-03-15 20:03:23 +04:00
return
}
2014-03-16 10:28:24 +04:00
ctx . Handle ( 200 , "RepoAssignment" , errors . New ( "invliad user account for single repository" ) )
2014-03-15 20:03:23 +04:00
return
}
// get repository
2014-03-30 06:09:59 +04:00
repo , err := models . GetRepositoryByName ( user . Id , repoName )
2014-03-15 20:03:23 +04:00
if err != nil {
2014-03-28 05:15:53 +04:00
if err == models . ErrRepoNotExist {
ctx . Handle ( 404 , "RepoAssignment" , err )
} else if redirect {
2014-03-19 17:57:55 +04:00
ctx . Redirect ( "/" )
2014-03-15 20:03:23 +04:00
return
}
2014-03-30 06:09:59 +04:00
ctx . Handle ( 404 , "RepoAssignment" , err )
return
}
ctx . Repo . Repository = repo
gitRepo , err := git . OpenRepository ( models . RepoPath ( userName , repoName ) )
if err != nil {
ctx . Handle ( 404 , "RepoAssignment Invalid repo" , err )
2014-03-15 20:03:23 +04:00
return
}
2014-03-30 06:09:59 +04:00
ctx . Repo . GitRepo = gitRepo
detect :
if len ( branchName ) > 0 {
// TODO check tag
if models . IsBranchExist ( user . Name , repoName , branchName ) {
ctx . Repo . IsBranch = true
ctx . Repo . BranchName = branchName
ctx . Repo . Commit , err = gitRepo . GetCommitOfBranch ( branchName )
if err != nil {
ctx . Handle ( 404 , "RepoAssignment invalid branch" , nil )
return
}
ctx . Repo . CommitId = ctx . Repo . Commit . Oid . String ( )
} else if len ( branchName ) == 40 {
ctx . Repo . IsCommit = true
ctx . Repo . CommitId = branchName
ctx . Repo . BranchName = branchName
ctx . Repo . Commit , err = gitRepo . GetCommit ( branchName )
if err != nil {
ctx . Handle ( 404 , "RepoAssignment invalid commit" , nil )
return
}
} else {
ctx . Handle ( 404 , "RepoAssignment invalid repo" , nil )
return
}
} else {
branchName = "master"
goto detect
}
2014-03-15 20:03:23 +04:00
2014-03-30 06:09:59 +04:00
if ctx . IsSigned {
2014-03-20 10:25:21 +04:00
ctx . Repo . IsWatching = models . IsWatching ( ctx . User . Id , repo . Id )
}
2014-03-30 06:09:59 +04:00
ctx . Repo . Owner = user
2014-03-25 16:53:11 +04:00
ctx . Repo . CloneLink . SSH = fmt . Sprintf ( "%s@%s:%s/%s.git" , base . RunUser , base . Domain , user . LowerName , repo . LowerName )
2014-03-28 16:39:35 +04:00
ctx . Repo . CloneLink . HTTPS = fmt . Sprintf ( "%s%s/%s.git" , base . AppUrl , user . LowerName , repo . LowerName )
2014-03-30 06:09:59 +04:00
ctx . Repo . RepoLink = "/" + user . Name + "/" + repo . Name
2014-03-15 20:03:23 +04:00
2014-03-30 06:09:59 +04:00
ctx . Data [ "BranchName" ] = ctx . Repo . BranchName
ctx . Data [ "CommitId" ] = ctx . Repo . CommitId
2014-03-15 20:03:23 +04:00
ctx . Data [ "Repository" ] = repo
ctx . Data [ "Owner" ] = user
ctx . Data [ "Title" ] = user . Name + "/" + repo . Name
2014-03-20 08:12:33 +04:00
ctx . Data [ "CloneLink" ] = ctx . Repo . CloneLink
2014-03-30 06:09:59 +04:00
ctx . Data [ "RepoLink" ] = ctx . Repo . RepoLink
2014-03-17 09:12:28 +04:00
ctx . Data [ "IsRepositoryOwner" ] = ctx . Repo . IsOwner
2014-03-20 17:28:12 +04:00
ctx . Data [ "IsRepositoryWatching" ] = ctx . Repo . IsWatching
2014-03-15 20:03:23 +04:00
}
}