You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

repo.go 4.4 kB

11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package middleware
  5. import (
  6. "errors"
  7. "fmt"
  8. "strings"
  9. "github.com/go-martini/martini"
  10. "github.com/gogits/git"
  11. "github.com/gogits/gogs/models"
  12. "github.com/gogits/gogs/modules/base"
  13. "github.com/gogits/gogs/modules/log"
  14. )
  15. func RepoAssignment(redirect bool, args ...bool) martini.Handler {
  16. return func(ctx *Context, params martini.Params) {
  17. // valid brachname
  18. var validBranch bool
  19. // display bare quick start if it is a bare repo
  20. var displayBare bool
  21. if len(args) >= 1 {
  22. validBranch = args[0]
  23. }
  24. if len(args) >= 2 {
  25. displayBare = args[1]
  26. }
  27. var (
  28. user *models.User
  29. err error
  30. )
  31. userName := params["username"]
  32. repoName := params["reponame"]
  33. branchName := params["branchname"]
  34. // get repository owner
  35. ctx.Repo.IsOwner = ctx.IsSigned && ctx.User.LowerName == strings.ToLower(userName)
  36. if !ctx.Repo.IsOwner {
  37. user, err = models.GetUserByName(params["username"])
  38. if err != nil {
  39. if redirect {
  40. ctx.Redirect("/")
  41. return
  42. }
  43. ctx.Handle(200, "RepoAssignment", err)
  44. return
  45. }
  46. } else {
  47. user = ctx.User
  48. }
  49. if user == nil {
  50. if redirect {
  51. ctx.Redirect("/")
  52. return
  53. }
  54. ctx.Handle(200, "RepoAssignment", errors.New("invliad user account for single repository"))
  55. return
  56. }
  57. // get repository
  58. repo, err := models.GetRepositoryByName(user.Id, repoName)
  59. if err != nil {
  60. if err == models.ErrRepoNotExist {
  61. ctx.Handle(404, "RepoAssignment", err)
  62. } else if redirect {
  63. ctx.Redirect("/")
  64. return
  65. }
  66. ctx.Handle(500, "RepoAssignment", err)
  67. return
  68. }
  69. repo.NumOpenIssues = repo.NumIssues - repo.NumClosedIssues
  70. ctx.Repo.Repository = repo
  71. ctx.Data["IsBareRepo"] = ctx.Repo.Repository.IsBare
  72. gitRepo, err := git.OpenRepository(models.RepoPath(userName, repoName))
  73. if err != nil {
  74. ctx.Handle(500, "RepoAssignment Invalid repo "+models.RepoPath(userName, repoName), err)
  75. return
  76. }
  77. ctx.Repo.GitRepo = gitRepo
  78. ctx.Repo.Owner = user
  79. ctx.Repo.RepoLink = "/" + user.Name + "/" + repo.Name
  80. ctx.Data["Title"] = user.Name + "/" + repo.Name
  81. ctx.Data["Repository"] = repo
  82. ctx.Data["Owner"] = user
  83. ctx.Data["RepoLink"] = ctx.Repo.RepoLink
  84. ctx.Data["IsRepositoryOwner"] = ctx.Repo.IsOwner
  85. ctx.Data["BranchName"] = ""
  86. ctx.Repo.CloneLink.SSH = fmt.Sprintf("%s@%s:%s/%s.git", base.RunUser, base.Domain, user.LowerName, repo.LowerName)
  87. ctx.Repo.CloneLink.HTTPS = fmt.Sprintf("%s%s/%s.git", base.AppUrl, user.LowerName, repo.LowerName)
  88. ctx.Data["CloneLink"] = ctx.Repo.CloneLink
  89. // when repo is bare, not valid branch
  90. if !ctx.Repo.Repository.IsBare && validBranch {
  91. detect:
  92. if len(branchName) > 0 {
  93. // TODO check tag
  94. if models.IsBranchExist(user.Name, repoName, branchName) {
  95. ctx.Repo.IsBranch = true
  96. ctx.Repo.BranchName = branchName
  97. ctx.Repo.Commit, err = gitRepo.GetCommitOfBranch(branchName)
  98. if err != nil {
  99. ctx.Handle(404, "RepoAssignment invalid branch", nil)
  100. return
  101. }
  102. ctx.Repo.CommitId = ctx.Repo.Commit.Oid.String()
  103. } else if len(branchName) == 40 {
  104. ctx.Repo.IsCommit = true
  105. ctx.Repo.CommitId = branchName
  106. ctx.Repo.BranchName = branchName
  107. ctx.Repo.Commit, err = gitRepo.GetCommit(branchName)
  108. if err != nil {
  109. ctx.Handle(404, "RepoAssignment invalid commit", nil)
  110. return
  111. }
  112. } else {
  113. ctx.Handle(404, "RepoAssignment invalid repo", nil)
  114. return
  115. }
  116. } else {
  117. branchName = ctx.Repo.Repository.DefaultBranch
  118. if len(branchName) == 0 {
  119. branchName = "master"
  120. }
  121. goto detect
  122. }
  123. ctx.Data["IsBranch"] = ctx.Repo.IsBranch
  124. ctx.Data["IsCommit"] = ctx.Repo.IsCommit
  125. }
  126. // repo is bare and display enable
  127. if displayBare && ctx.Repo.Repository.IsBare {
  128. ctx.HTML(200, "repo/single_bare")
  129. return
  130. }
  131. if ctx.IsSigned {
  132. ctx.Repo.IsWatching = models.IsWatching(ctx.User.Id, repo.Id)
  133. }
  134. ctx.Data["BranchName"] = ctx.Repo.BranchName
  135. brs, err := models.GetBranches(user.Name, repoName)
  136. if err != nil {
  137. log.Error("RepoAssignment(GetBranches): %v", err)
  138. }
  139. ctx.Data["Branches"] = brs
  140. ctx.Data["CommitId"] = ctx.Repo.CommitId
  141. ctx.Data["IsRepositoryWatching"] = ctx.Repo.IsWatching
  142. }
  143. }