|
@@ -18,17 +18,110 @@ import (
|
|
|
"github.com/gogits/gogs/modules/setting"
|
|
|
)
|
|
|
|
|
|
+// RepoRef handles repository reference name including those contain `/`.
|
|
|
+func RepoRef() macaron.Handler {
|
|
|
+ return func(ctx *Context) {
|
|
|
+ var (
|
|
|
+ refName string
|
|
|
+ err error
|
|
|
+ )
|
|
|
+
|
|
|
+ // Get default branch.
|
|
|
+ if len(ctx.Params("*")) == 0 {
|
|
|
+ refName = ctx.Repo.Repository.DefaultBranch
|
|
|
+ if !ctx.Repo.GitRepo.IsBranchExist(refName) {
|
|
|
+ brs, err := ctx.Repo.GitRepo.GetBranches()
|
|
|
+ if err != nil {
|
|
|
+ ctx.Handle(500, "GetBranches", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ refName = brs[0]
|
|
|
+ }
|
|
|
+ ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfBranch(refName)
|
|
|
+ if err != nil {
|
|
|
+ ctx.Handle(500, "GetCommitOfBranch", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
|
|
|
+ ctx.Repo.IsBranch = true
|
|
|
+ ctx.Repo.BranchName = refName
|
|
|
+
|
|
|
+ } else {
|
|
|
+ hasMatched := false
|
|
|
+ parts := strings.Split(ctx.Params("*"), "/")
|
|
|
+ for i, part := range parts {
|
|
|
+ refName = strings.TrimPrefix(refName+"/"+part, "/")
|
|
|
+
|
|
|
+ if ctx.Repo.GitRepo.IsBranchExist(refName) ||
|
|
|
+ ctx.Repo.GitRepo.IsTagExist(refName) {
|
|
|
+ if i < len(parts)-1 {
|
|
|
+ ctx.Repo.TreeName = strings.Join(parts[i+1:], "/")
|
|
|
+ }
|
|
|
+ hasMatched = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !hasMatched && len(parts[0]) == 40 {
|
|
|
+ refName = parts[0]
|
|
|
+ ctx.Repo.TreeName = strings.Join(parts[1:], "/")
|
|
|
+ }
|
|
|
+
|
|
|
+ if ctx.Repo.GitRepo.IsBranchExist(refName) {
|
|
|
+ ctx.Repo.IsBranch = true
|
|
|
+
|
|
|
+ ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfBranch(refName)
|
|
|
+ if err != nil {
|
|
|
+ ctx.Handle(500, "GetCommitOfBranch", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
|
|
|
+
|
|
|
+ } else if ctx.Repo.GitRepo.IsTagExist(refName) {
|
|
|
+ ctx.Repo.IsTag = true
|
|
|
+ ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfTag(refName)
|
|
|
+ if err != nil {
|
|
|
+ ctx.Handle(500, "GetCommitOfTag", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
|
|
|
+ } else if len(refName) == 40 {
|
|
|
+ ctx.Repo.IsCommit = true
|
|
|
+ ctx.Repo.CommitId = refName
|
|
|
+
|
|
|
+ ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(refName)
|
|
|
+ if err != nil {
|
|
|
+ ctx.Handle(404, "GetCommit", nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ ctx.Handle(404, "RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ctx.Repo.BranchName = refName
|
|
|
+ ctx.Data["BranchName"] = ctx.Repo.BranchName
|
|
|
+ ctx.Data["CommitId"] = ctx.Repo.CommitId
|
|
|
+ ctx.Data["IsBranch"] = ctx.Repo.IsBranch
|
|
|
+ ctx.Data["IsTag"] = ctx.Repo.IsTag
|
|
|
+ ctx.Data["IsCommit"] = ctx.Repo.IsCommit
|
|
|
+
|
|
|
+ ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount()
|
|
|
+ if err != nil {
|
|
|
+ ctx.Handle(500, "CommitsCount", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
|
|
|
return func(ctx *Context) {
|
|
|
var (
|
|
|
- validBranch bool // To valid brach name.
|
|
|
displayBare bool // To display bare page if it is a bare repo.
|
|
|
)
|
|
|
if len(args) >= 1 {
|
|
|
- validBranch = args[0]
|
|
|
- }
|
|
|
- if len(args) >= 2 {
|
|
|
- displayBare = args[1]
|
|
|
+ displayBare = args[0]
|
|
|
}
|
|
|
|
|
|
var (
|
|
@@ -201,71 +294,71 @@ func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
|
|
|
}
|
|
|
|
|
|
// when repo is bare, not valid branch
|
|
|
- if !ctx.Repo.Repository.IsBare && validBranch {
|
|
|
- detect:
|
|
|
- if len(refName) > 0 {
|
|
|
- if gitRepo.IsBranchExist(refName) {
|
|
|
- ctx.Repo.IsBranch = true
|
|
|
- ctx.Repo.BranchName = refName
|
|
|
-
|
|
|
- ctx.Repo.Commit, err = gitRepo.GetCommitOfBranch(refName)
|
|
|
- if err != nil {
|
|
|
- ctx.Handle(500, "RepoAssignment invalid branch", err)
|
|
|
- return
|
|
|
- }
|
|
|
- ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
|
|
|
-
|
|
|
- } else if gitRepo.IsTagExist(refName) {
|
|
|
- ctx.Repo.IsTag = true
|
|
|
- ctx.Repo.BranchName = refName
|
|
|
- ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfTag(refName)
|
|
|
- if err != nil {
|
|
|
- ctx.Handle(500, "Fail to get tag commit", err)
|
|
|
- return
|
|
|
- }
|
|
|
- ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
|
|
|
- } else if len(refName) == 40 {
|
|
|
- ctx.Repo.IsCommit = true
|
|
|
- ctx.Repo.CommitId = refName
|
|
|
- ctx.Repo.BranchName = refName
|
|
|
-
|
|
|
- ctx.Repo.Commit, err = gitRepo.GetCommit(refName)
|
|
|
- if err != nil {
|
|
|
- ctx.Handle(404, "RepoAssignment invalid commit", nil)
|
|
|
- return
|
|
|
- }
|
|
|
- } else {
|
|
|
- ctx.Handle(404, "RepoAssignment invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- } else {
|
|
|
- if len(refName) == 0 {
|
|
|
- if gitRepo.IsBranchExist(ctx.Repo.Repository.DefaultBranch) {
|
|
|
- refName = ctx.Repo.Repository.DefaultBranch
|
|
|
- } else {
|
|
|
- brs, err := gitRepo.GetBranches()
|
|
|
- if err != nil {
|
|
|
- ctx.Handle(500, "GetBranches", err)
|
|
|
- return
|
|
|
- }
|
|
|
- refName = brs[0]
|
|
|
- }
|
|
|
- }
|
|
|
- goto detect
|
|
|
- }
|
|
|
-
|
|
|
- ctx.Data["IsBranch"] = ctx.Repo.IsBranch
|
|
|
- ctx.Data["IsTag"] = ctx.Repo.IsTag
|
|
|
- ctx.Data["IsCommit"] = ctx.Repo.IsCommit
|
|
|
-
|
|
|
- ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount()
|
|
|
- if err != nil {
|
|
|
- ctx.Handle(500, "CommitsCount", err)
|
|
|
- return
|
|
|
- }
|
|
|
- ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount
|
|
|
- }
|
|
|
+ // if !ctx.Repo.Repository.IsBare && validBranch {
|
|
|
+ // detect:
|
|
|
+ // if len(refName) > 0 {
|
|
|
+ // if gitRepo.IsBranchExist(refName) {
|
|
|
+ // ctx.Repo.IsBranch = true
|
|
|
+ // ctx.Repo.BranchName = refName
|
|
|
+
|
|
|
+ // ctx.Repo.Commit, err = gitRepo.GetCommitOfBranch(refName)
|
|
|
+ // if err != nil {
|
|
|
+ // ctx.Handle(500, "RepoAssignment invalid branch", err)
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ // ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
|
|
|
+
|
|
|
+ // } else if gitRepo.IsTagExist(refName) {
|
|
|
+ // ctx.Repo.IsTag = true
|
|
|
+ // ctx.Repo.BranchName = refName
|
|
|
+ // ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfTag(refName)
|
|
|
+ // if err != nil {
|
|
|
+ // ctx.Handle(500, "Fail to get tag commit", err)
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ // ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
|
|
|
+ // } else if len(refName) == 40 {
|
|
|
+ // ctx.Repo.IsCommit = true
|
|
|
+ // ctx.Repo.CommitId = refName
|
|
|
+ // ctx.Repo.BranchName = refName
|
|
|
+
|
|
|
+ // ctx.Repo.Commit, err = gitRepo.GetCommit(refName)
|
|
|
+ // if err != nil {
|
|
|
+ // ctx.Handle(404, "RepoAssignment invalid commit", nil)
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ // } else {
|
|
|
+ // ctx.Handle(404, "RepoAssignment invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+
|
|
|
+ // } else {
|
|
|
+ // if len(refName) == 0 {
|
|
|
+ // if gitRepo.IsBranchExist(ctx.Repo.Repository.DefaultBranch) {
|
|
|
+ // refName = ctx.Repo.Repository.DefaultBranch
|
|
|
+ // } else {
|
|
|
+ // brs, err := gitRepo.GetBranches()
|
|
|
+ // if err != nil {
|
|
|
+ // ctx.Handle(500, "GetBranches", err)
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ // refName = brs[0]
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // goto detect
|
|
|
+ // }
|
|
|
+
|
|
|
+ // ctx.Data["IsBranch"] = ctx.Repo.IsBranch
|
|
|
+ // ctx.Data["IsTag"] = ctx.Repo.IsTag
|
|
|
+ // ctx.Data["IsCommit"] = ctx.Repo.IsCommit
|
|
|
+
|
|
|
+ // ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount()
|
|
|
+ // if err != nil {
|
|
|
+ // ctx.Handle(500, "CommitsCount", err)
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ // ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount
|
|
|
+ // }
|
|
|
|
|
|
// repo is bare and display enable
|
|
|
if ctx.Repo.Repository.IsBare {
|