setting.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  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/go-martini/martini"
  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, "setting.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, "setting.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 ctx.Repo.GitRepo.IsBranchExist(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, "setting.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("setting.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. } else if ctx.Repo.Repository.IsMirror {
  74. ctx.Error(404)
  75. return
  76. }
  77. newOwner := ctx.Query("owner")
  78. // Check if new owner exists.
  79. isExist, err := models.IsUserExist(newOwner)
  80. if err != nil {
  81. ctx.Handle(500, "setting.SettingPost(transfer: check existence)", err)
  82. return
  83. } else if !isExist {
  84. ctx.RenderWithErr("Please make sure you entered owner name is correct.", "repo/setting", nil)
  85. return
  86. } else if err = models.TransferOwnership(ctx.User, newOwner, ctx.Repo.Repository); err != nil {
  87. ctx.Handle(500, "setting.SettingPost(transfer repository)", err)
  88. return
  89. }
  90. log.Trace("%s Repository transfered: %s/%s -> %s", ctx.Req.RequestURI, ctx.User.Name, ctx.Repo.Repository.Name, newOwner)
  91. ctx.Redirect("/")
  92. case "delete":
  93. if len(ctx.Repo.Repository.Name) == 0 || ctx.Repo.Repository.Name != ctx.Query("repository") {
  94. ctx.RenderWithErr("Please make sure you entered repository name is correct.", "repo/setting", nil)
  95. return
  96. }
  97. if err := models.DeleteRepository(ctx.User.Id, ctx.Repo.Repository.Id, ctx.User.LowerName); err != nil {
  98. ctx.Handle(500, "setting.Delete", err)
  99. return
  100. }
  101. log.Trace("%s Repository deleted: %s/%s", ctx.Req.RequestURI, ctx.User.LowerName, ctx.Repo.Repository.LowerName)
  102. ctx.Redirect("/")
  103. }
  104. }
  105. func Collaboration(ctx *middleware.Context) {
  106. repoLink := strings.TrimPrefix(ctx.Repo.RepoLink, "/")
  107. ctx.Data["IsRepoToolbarCollaboration"] = true
  108. ctx.Data["Title"] = repoLink + " - collaboration"
  109. // Delete collaborator.
  110. remove := strings.ToLower(ctx.Query("remove"))
  111. if len(remove) > 0 && remove != ctx.Repo.Owner.LowerName {
  112. if err := models.DeleteAccess(&models.Access{UserName: remove, RepoName: repoLink}); err != nil {
  113. ctx.Handle(500, "setting.Collaboration(DeleteAccess)", err)
  114. return
  115. }
  116. ctx.Flash.Success("Collaborator has been removed.")
  117. ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration")
  118. return
  119. }
  120. names, err := models.GetCollaboratorNames(repoLink)
  121. if err != nil {
  122. ctx.Handle(500, "setting.Collaboration(GetCollaborators)", err)
  123. return
  124. }
  125. us := make([]*models.User, len(names))
  126. for i, name := range names {
  127. us[i], err = models.GetUserByName(name)
  128. if err != nil {
  129. ctx.Handle(500, "setting.Collaboration(GetUserByName)", err)
  130. return
  131. }
  132. }
  133. ctx.Data["Collaborators"] = us
  134. ctx.HTML(200, "repo/collaboration")
  135. }
  136. func CollaborationPost(ctx *middleware.Context) {
  137. repoLink := strings.TrimPrefix(ctx.Repo.RepoLink, "/")
  138. name := strings.ToLower(ctx.Query("collaborator"))
  139. if len(name) == 0 || ctx.Repo.Owner.LowerName == name {
  140. ctx.Redirect(ctx.Req.RequestURI)
  141. return
  142. }
  143. has, err := models.HasAccess(name, repoLink, models.AU_WRITABLE)
  144. if err != nil {
  145. ctx.Handle(500, "setting.CollaborationPost(HasAccess)", err)
  146. return
  147. } else if has {
  148. ctx.Redirect(ctx.Req.RequestURI)
  149. return
  150. }
  151. u, err := models.GetUserByName(name)
  152. if err != nil {
  153. if err == models.ErrUserNotExist {
  154. ctx.Flash.Error("Given user does not exist.")
  155. ctx.Redirect(ctx.Req.RequestURI)
  156. } else {
  157. ctx.Handle(500, "setting.CollaborationPost(GetUserByName)", err)
  158. }
  159. return
  160. }
  161. if err = models.AddAccess(&models.Access{UserName: name, RepoName: repoLink,
  162. Mode: models.AU_WRITABLE}); err != nil {
  163. ctx.Handle(500, "setting.CollaborationPost(AddAccess)", err)
  164. return
  165. }
  166. if base.Service.NotifyMail {
  167. if err = mailer.SendCollaboratorMail(ctx.Render, u, ctx.User, ctx.Repo.Repository); err != nil {
  168. ctx.Handle(500, "setting.CollaborationPost(SendCollaboratorMail)", err)
  169. return
  170. }
  171. }
  172. ctx.Flash.Success("New collaborator has been added.")
  173. ctx.Redirect(ctx.Req.RequestURI)
  174. }
  175. func WebHooks(ctx *middleware.Context) {
  176. ctx.Data["IsRepoToolbarWebHooks"] = true
  177. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Webhooks"
  178. // Delete webhook.
  179. remove, _ := base.StrTo(ctx.Query("remove")).Int64()
  180. if remove > 0 {
  181. if err := models.DeleteWebhook(remove); err != nil {
  182. ctx.Handle(500, "setting.WebHooks(DeleteWebhook)", err)
  183. return
  184. }
  185. ctx.Flash.Success("Webhook has been removed.")
  186. ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks")
  187. return
  188. }
  189. ws, err := models.GetWebhooksByRepoId(ctx.Repo.Repository.Id)
  190. if err != nil {
  191. ctx.Handle(500, "setting.WebHooks(GetWebhooksByRepoId)", err)
  192. return
  193. }
  194. ctx.Data["Webhooks"] = ws
  195. ctx.HTML(200, "repo/hooks")
  196. }
  197. func WebHooksAdd(ctx *middleware.Context) {
  198. ctx.Data["IsRepoToolbarWebHooks"] = true
  199. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Add Webhook"
  200. ctx.HTML(200, "repo/hooks_add")
  201. }
  202. func WebHooksAddPost(ctx *middleware.Context, form auth.NewWebhookForm) {
  203. ctx.Data["IsRepoToolbarWebHooks"] = true
  204. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Add Webhook"
  205. if ctx.HasError() {
  206. ctx.HTML(200, "repo/hooks_add")
  207. return
  208. }
  209. ct := models.CT_JSON
  210. if form.ContentType == "2" {
  211. ct = models.CT_FORM
  212. }
  213. w := &models.Webhook{
  214. RepoId: ctx.Repo.Repository.Id,
  215. Url: form.Url,
  216. ContentType: ct,
  217. Secret: form.Secret,
  218. HookEvent: &models.HookEvent{
  219. PushOnly: form.PushOnly,
  220. },
  221. IsActive: form.Active,
  222. }
  223. if err := w.SaveEvent(); err != nil {
  224. ctx.Handle(500, "setting.WebHooksAddPost(SaveEvent)", err)
  225. return
  226. } else if err := models.CreateWebhook(w); err != nil {
  227. ctx.Handle(500, "setting.WebHooksAddPost(CreateWebhook)", err)
  228. return
  229. }
  230. ctx.Flash.Success("New webhook has been added.")
  231. ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks")
  232. }
  233. func WebHooksEdit(ctx *middleware.Context, params martini.Params) {
  234. ctx.Data["IsRepoToolbarWebHooks"] = true
  235. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Webhook"
  236. hookId, _ := base.StrTo(params["id"]).Int64()
  237. if hookId == 0 {
  238. ctx.Handle(404, "setting.WebHooksEdit", nil)
  239. return
  240. }
  241. w, err := models.GetWebhookById(hookId)
  242. if err != nil {
  243. if err == models.ErrWebhookNotExist {
  244. ctx.Handle(404, "setting.WebHooksEdit(GetWebhookById)", nil)
  245. } else {
  246. ctx.Handle(500, "setting.WebHooksEdit(GetWebhookById)", err)
  247. }
  248. return
  249. }
  250. w.GetEvent()
  251. ctx.Data["Webhook"] = w
  252. ctx.HTML(200, "repo/hooks_edit")
  253. }
  254. func WebHooksEditPost(ctx *middleware.Context, params martini.Params, form auth.NewWebhookForm) {
  255. ctx.Data["IsRepoToolbarWebHooks"] = true
  256. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Webhook"
  257. if ctx.HasError() {
  258. ctx.HTML(200, "repo/hooks_add")
  259. return
  260. }
  261. hookId, _ := base.StrTo(params["id"]).Int64()
  262. if hookId == 0 {
  263. ctx.Handle(404, "setting.WebHooksEditPost", nil)
  264. return
  265. }
  266. ct := models.CT_JSON
  267. if form.ContentType == "2" {
  268. ct = models.CT_FORM
  269. }
  270. w := &models.Webhook{
  271. Id: hookId,
  272. RepoId: ctx.Repo.Repository.Id,
  273. Url: form.Url,
  274. ContentType: ct,
  275. Secret: form.Secret,
  276. HookEvent: &models.HookEvent{
  277. PushOnly: form.PushOnly,
  278. },
  279. IsActive: form.Active,
  280. }
  281. if err := w.SaveEvent(); err != nil {
  282. ctx.Handle(500, "setting.WebHooksEditPost(SaveEvent)", err)
  283. return
  284. } else if err := models.UpdateWebhook(w); err != nil {
  285. ctx.Handle(500, "setting.WebHooksEditPost(WebHooksEditPost)", err)
  286. return
  287. }
  288. ctx.Flash.Success("Webhook has been updated.")
  289. ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", ctx.Repo.RepoLink, hookId))
  290. }