setting.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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 repo
  5. import (
  6. "fmt"
  7. "strings"
  8. "github.com/gogits/git"
  9. "github.com/gogits/gogs/models"
  10. "github.com/gogits/gogs/modules/auth"
  11. "github.com/gogits/gogs/modules/base"
  12. "github.com/gogits/gogs/modules/log"
  13. "github.com/gogits/gogs/modules/mailer"
  14. "github.com/gogits/gogs/modules/middleware"
  15. )
  16. func Setting(ctx *middleware.Context) {
  17. ctx.Data["IsRepoToolbarSetting"] = true
  18. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - settings"
  19. ctx.HTML(200, "repo/setting")
  20. }
  21. func SettingPost(ctx *middleware.Context, form auth.RepoSettingForm) {
  22. ctx.Data["IsRepoToolbarSetting"] = true
  23. switch ctx.Query("action") {
  24. case "update":
  25. if ctx.HasError() {
  26. ctx.HTML(200, "repo/setting")
  27. return
  28. }
  29. newRepoName := form.RepoName
  30. // Check if repository name has been changed.
  31. if ctx.Repo.Repository.Name != newRepoName {
  32. isExist, err := models.IsRepositoryExist(ctx.Repo.Owner, newRepoName)
  33. if err != nil {
  34. ctx.Handle(500, "repo.SettingPost(update: check existence)", err)
  35. return
  36. } else if isExist {
  37. ctx.RenderWithErr("Repository name has been taken in your repositories.", "repo/setting", nil)
  38. return
  39. } else if err = models.ChangeRepositoryName(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name, newRepoName); err != nil {
  40. ctx.Handle(500, "repo.SettingPost(change repository name)", err)
  41. return
  42. }
  43. log.Trace("%s Repository name changed: %s/%s -> %s", ctx.Req.RequestURI, ctx.User.Name, ctx.Repo.Repository.Name, newRepoName)
  44. ctx.Repo.Repository.Name = newRepoName
  45. }
  46. br := form.Branch
  47. if git.IsBranchExist(models.RepoPath(ctx.User.Name, ctx.Repo.Repository.Name), br) {
  48. ctx.Repo.Repository.DefaultBranch = br
  49. }
  50. ctx.Repo.Repository.Description = form.Description
  51. ctx.Repo.Repository.Website = form.Website
  52. ctx.Repo.Repository.IsPrivate = form.Private
  53. ctx.Repo.Repository.IsGoget = form.GoGet
  54. if err := models.UpdateRepository(ctx.Repo.Repository); err != nil {
  55. ctx.Handle(404, "repo.SettingPost(update)", err)
  56. return
  57. }
  58. log.Trace("%s Repository updated: %s/%s", ctx.Req.RequestURI, ctx.Repo.Owner.Name, ctx.Repo.Repository.Name)
  59. if ctx.Repo.Repository.IsMirror {
  60. if form.Interval > 0 {
  61. ctx.Repo.Mirror.Interval = form.Interval
  62. if err := models.UpdateMirror(ctx.Repo.Mirror); err != nil {
  63. log.Error("repo.SettingPost(UpdateMirror): %v", err)
  64. }
  65. }
  66. }
  67. ctx.Flash.Success("Repository options has been successfully updated.")
  68. ctx.Redirect(fmt.Sprintf("/%s/%s/settings", ctx.Repo.Owner.Name, ctx.Repo.Repository.Name))
  69. case "transfer":
  70. if len(ctx.Repo.Repository.Name) == 0 || ctx.Repo.Repository.Name != ctx.Query("repository") {
  71. ctx.RenderWithErr("Please make sure you entered repository name is correct.", "repo/setting", nil)
  72. return
  73. }
  74. newOwner := ctx.Query("owner")
  75. // Check if new owner exists.
  76. isExist, err := models.IsUserExist(newOwner)
  77. if err != nil {
  78. ctx.Handle(500, "repo.SettingPost(transfer: check existence)", err)
  79. return
  80. } else if !isExist {
  81. ctx.RenderWithErr("Please make sure you entered owner name is correct.", "repo/setting", nil)
  82. return
  83. } else if err = models.TransferOwnership(ctx.User, newOwner, ctx.Repo.Repository); err != nil {
  84. ctx.Handle(500, "repo.SettingPost(transfer repository)", err)
  85. return
  86. }
  87. log.Trace("%s Repository transfered: %s/%s -> %s", ctx.Req.RequestURI, ctx.User.Name, ctx.Repo.Repository.Name, newOwner)
  88. ctx.Redirect("/")
  89. case "delete":
  90. if len(ctx.Repo.Repository.Name) == 0 || ctx.Repo.Repository.Name != ctx.Query("repository") {
  91. ctx.RenderWithErr("Please make sure you entered repository name is correct.", "repo/setting", nil)
  92. return
  93. }
  94. if err := models.DeleteRepository(ctx.User.Id, ctx.Repo.Repository.Id, ctx.User.LowerName); err != nil {
  95. ctx.Handle(500, "repo.Delete", err)
  96. return
  97. }
  98. log.Trace("%s Repository deleted: %s/%s", ctx.Req.RequestURI, ctx.User.LowerName, ctx.Repo.Repository.LowerName)
  99. ctx.Redirect("/")
  100. }
  101. }
  102. func Collaboration(ctx *middleware.Context) {
  103. repoLink := strings.TrimPrefix(ctx.Repo.RepoLink, "/")
  104. ctx.Data["IsRepoToolbarCollaboration"] = true
  105. ctx.Data["Title"] = repoLink + " - collaboration"
  106. // Delete collaborator.
  107. remove := strings.ToLower(ctx.Query("remove"))
  108. if len(remove) > 0 && remove != ctx.Repo.Owner.LowerName {
  109. if err := models.DeleteAccess(&models.Access{UserName: remove, RepoName: repoLink}); err != nil {
  110. ctx.Handle(500, "repo.Collaboration(DeleteAccess)", err)
  111. return
  112. }
  113. ctx.Flash.Success("Collaborator has been removed.")
  114. ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration")
  115. return
  116. }
  117. names, err := models.GetCollaborators(repoLink)
  118. if err != nil {
  119. ctx.Handle(500, "repo.Collaboration(GetCollaborators)", err)
  120. return
  121. }
  122. us := make([]*models.User, len(names))
  123. for i, name := range names {
  124. us[i], err = models.GetUserByName(name)
  125. if err != nil {
  126. ctx.Handle(500, "repo.Collaboration(GetUserByName)", err)
  127. return
  128. }
  129. }
  130. ctx.Data["Collaborators"] = us
  131. ctx.HTML(200, "repo/collaboration")
  132. }
  133. func CollaborationPost(ctx *middleware.Context) {
  134. repoLink := strings.TrimPrefix(ctx.Repo.RepoLink, "/")
  135. name := strings.ToLower(ctx.Query("collaborator"))
  136. if len(name) == 0 || ctx.Repo.Owner.LowerName == name {
  137. ctx.Redirect(ctx.Req.RequestURI)
  138. return
  139. }
  140. has, err := models.HasAccess(name, repoLink, models.AU_WRITABLE)
  141. if err != nil {
  142. ctx.Handle(500, "repo.CollaborationPost(HasAccess)", err)
  143. return
  144. } else if has {
  145. ctx.Redirect(ctx.Req.RequestURI)
  146. return
  147. }
  148. u, err := models.GetUserByName(name)
  149. if err != nil {
  150. if err == models.ErrUserNotExist {
  151. ctx.Flash.Error("Given user does not exist.")
  152. ctx.Redirect(ctx.Req.RequestURI)
  153. } else {
  154. ctx.Handle(500, "repo.CollaborationPost(GetUserByName)", err)
  155. }
  156. return
  157. }
  158. if err = models.AddAccess(&models.Access{UserName: name, RepoName: repoLink,
  159. Mode: models.AU_WRITABLE}); err != nil {
  160. ctx.Handle(500, "repo.CollaborationPost(AddAccess)", err)
  161. return
  162. }
  163. if base.Service.NotifyMail {
  164. if err = mailer.SendCollaboratorMail(ctx.Render, u, ctx.User, ctx.Repo.Repository); err != nil {
  165. ctx.Handle(500, "repo.CollaborationPost(SendCollaboratorMail)", err)
  166. return
  167. }
  168. }
  169. ctx.Flash.Success("New collaborator has been added.")
  170. ctx.Redirect(ctx.Req.RequestURI)
  171. }
  172. func WebHooks(ctx *middleware.Context) {
  173. ctx.Data["IsRepoToolbarWebHooks"] = true
  174. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Webhooks"
  175. ws, err := models.GetWebhooksByRepoId(ctx.Repo.Repository.Id)
  176. if err != nil {
  177. ctx.Handle(500, "repo.WebHooks(GetWebhooksByRepoId)", err)
  178. return
  179. }
  180. ctx.Data["Webhooks"] = ws
  181. ctx.HTML(200, "repo/hooks")
  182. }
  183. func WebHooksAdd(ctx *middleware.Context) {
  184. ctx.Data["IsRepoToolbarWebHooks"] = true
  185. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Add Webhook"
  186. ctx.HTML(200, "repo/hooks_add")
  187. }
  188. func WebHooksAddPost(ctx *middleware.Context, form auth.NewWebhookForm) {
  189. ctx.Data["IsRepoToolbarWebHooks"] = true
  190. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Add Webhook"
  191. if ctx.HasError() {
  192. ctx.HTML(200, "repo/hooks_add")
  193. return
  194. }
  195. ct := models.CT_JSON
  196. if form.ContentType == "form" {
  197. ct = models.CT_FORM
  198. }
  199. w := &models.Webhook{
  200. RepoId: ctx.Repo.Repository.Id,
  201. Payload: form.Url,
  202. ContentType: ct,
  203. Secret: form.Secret,
  204. IsActive: form.Active,
  205. }
  206. h := &models.HookEvent{
  207. PushOnly: form.PushOnly,
  208. }
  209. if err := w.SaveEvent(h); err != nil {
  210. ctx.Handle(500, "repo.WebHooksAddPost(SaveEvent)", err)
  211. return
  212. } else if err := models.CreateWebhook(w); err != nil {
  213. ctx.Handle(500, "repo.WebHooksAddPost(CreateWebhook)", err)
  214. return
  215. }
  216. ctx.Flash.Success("New webhook has been added.")
  217. ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks")
  218. }
  219. func WebHooksEdit(ctx *middleware.Context) {
  220. ctx.Data["IsRepoToolbarWebHooks"] = true
  221. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Webhook"
  222. ctx.HTML(200, "repo/hooks_edit")
  223. }