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 5.5 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
11 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. ctx.Repo.Owner = user
  58. // get repository
  59. repo, err := models.GetRepositoryByName(user.Id, repoName)
  60. if err != nil {
  61. if err == models.ErrRepoNotExist {
  62. ctx.Handle(404, "RepoAssignment", err)
  63. return
  64. } else if redirect {
  65. ctx.Redirect("/")
  66. return
  67. }
  68. ctx.Handle(500, "RepoAssignment", err)
  69. return
  70. }
  71. // Check access.
  72. if repo.IsPrivate {
  73. if ctx.User == nil {
  74. ctx.Handle(404, "RepoAssignment(HasAccess)", nil)
  75. return
  76. }
  77. hasAccess, err := models.HasAccess(ctx.User.Name, ctx.Repo.Owner.Name+"/"+repo.Name, models.AU_READABLE)
  78. if err != nil {
  79. ctx.Handle(500, "RepoAssignment(HasAccess)", err)
  80. return
  81. } else if !hasAccess {
  82. ctx.Handle(404, "RepoAssignment(HasAccess)", nil)
  83. return
  84. }
  85. }
  86. ctx.Repo.HasAccess = true
  87. ctx.Data["HasAccess"] = true
  88. repo.NumOpenIssues = repo.NumIssues - repo.NumClosedIssues
  89. ctx.Repo.Repository = repo
  90. ctx.Data["IsBareRepo"] = ctx.Repo.Repository.IsBare
  91. gitRepo, err := git.OpenRepository(models.RepoPath(userName, repoName))
  92. if err != nil {
  93. ctx.Handle(500, "RepoAssignment Invalid repo "+models.RepoPath(userName, repoName), err)
  94. return
  95. }
  96. ctx.Repo.GitRepo = gitRepo
  97. ctx.Repo.RepoLink = "/" + user.Name + "/" + repo.Name
  98. ctx.Data["Title"] = user.Name + "/" + repo.Name
  99. ctx.Data["Repository"] = repo
  100. ctx.Data["Owner"] = user
  101. ctx.Data["RepoLink"] = ctx.Repo.RepoLink
  102. ctx.Data["IsRepositoryOwner"] = ctx.Repo.IsOwner
  103. ctx.Data["BranchName"] = ""
  104. ctx.Repo.CloneLink.SSH = fmt.Sprintf("%s@%s:%s/%s.git", base.RunUser, base.Domain, user.LowerName, repo.LowerName)
  105. ctx.Repo.CloneLink.HTTPS = fmt.Sprintf("%s%s/%s.git", base.AppUrl, user.LowerName, repo.LowerName)
  106. ctx.Data["CloneLink"] = ctx.Repo.CloneLink
  107. // when repo is bare, not valid branch
  108. if !ctx.Repo.Repository.IsBare && validBranch {
  109. detect:
  110. if len(branchName) > 0 {
  111. // TODO check tag
  112. if models.IsBranchExist(user.Name, repoName, branchName) {
  113. ctx.Repo.IsBranch = true
  114. ctx.Repo.BranchName = branchName
  115. ctx.Repo.Commit, err = gitRepo.GetCommitOfBranch(branchName)
  116. if err != nil {
  117. ctx.Handle(404, "RepoAssignment invalid branch", nil)
  118. return
  119. }
  120. ctx.Repo.CommitId = ctx.Repo.Commit.Oid.String()
  121. } else if len(branchName) == 40 {
  122. ctx.Repo.IsCommit = true
  123. ctx.Repo.CommitId = branchName
  124. ctx.Repo.BranchName = branchName
  125. ctx.Repo.Commit, err = gitRepo.GetCommit(branchName)
  126. if err != nil {
  127. ctx.Handle(404, "RepoAssignment invalid commit", nil)
  128. return
  129. }
  130. } else {
  131. ctx.Handle(404, "RepoAssignment invalid repo", nil)
  132. return
  133. }
  134. } else {
  135. branchName = ctx.Repo.Repository.DefaultBranch
  136. if len(branchName) == 0 {
  137. branchName = "master"
  138. }
  139. goto detect
  140. }
  141. ctx.Data["IsBranch"] = ctx.Repo.IsBranch
  142. ctx.Data["IsCommit"] = ctx.Repo.IsCommit
  143. }
  144. // repo is bare and display enable
  145. if displayBare && ctx.Repo.Repository.IsBare {
  146. ctx.HTML(200, "repo/single_bare")
  147. return
  148. }
  149. if ctx.IsSigned {
  150. ctx.Repo.IsWatching = models.IsWatching(ctx.User.Id, repo.Id)
  151. }
  152. ctx.Data["BranchName"] = ctx.Repo.BranchName
  153. brs, err := models.GetBranches(user.Name, repoName)
  154. if err != nil {
  155. log.Error("RepoAssignment(GetBranches): %v", err)
  156. }
  157. ctx.Data["Branches"] = brs
  158. ctx.Data["CommitId"] = ctx.Repo.CommitId
  159. ctx.Data["IsRepositoryWatching"] = ctx.Repo.IsWatching
  160. }
  161. }
  162. func WriteAccess() martini.Handler {
  163. return func(ctx *Context) {
  164. if ctx.Repo.Repository.IsPrivate {
  165. ctx.Repo.HasAccess = false
  166. ctx.Data["HasAccess"] = false
  167. if ctx.User == nil {
  168. ctx.Handle(404, "WriteAccess", nil)
  169. return
  170. }
  171. hasAccess, err := models.HasAccess(ctx.User.Name, ctx.Repo.Owner.Name+"/"+ctx.Repo.Repository.Name, models.AU_WRITABLE)
  172. if err != nil {
  173. ctx.Handle(500, "WriteAccess(HasAccess)", err)
  174. return
  175. } else if !hasAccess {
  176. ctx.Handle(404, "WriteAccess(HasAccess)", nil)
  177. return
  178. }
  179. }
  180. ctx.Repo.HasAccess = true
  181. ctx.Data["HasAccess"] = true
  182. }
  183. }