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.

setting.go 10 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
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  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. }
  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, "setting.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, "setting.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, "setting.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, "setting.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.GetCollaboratorNames(repoLink)
  118. if err != nil {
  119. ctx.Handle(500, "setting.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, "setting.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, "setting.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, "setting.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, "setting.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, "setting.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. // Delete webhook.
  176. remove, _ := base.StrTo(ctx.Query("remove")).Int64()
  177. if remove > 0 {
  178. if err := models.DeleteWebhook(remove); err != nil {
  179. ctx.Handle(500, "setting.WebHooks(DeleteWebhook)", err)
  180. return
  181. }
  182. ctx.Flash.Success("Webhook has been removed.")
  183. ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks")
  184. return
  185. }
  186. ws, err := models.GetWebhooksByRepoId(ctx.Repo.Repository.Id)
  187. if err != nil {
  188. ctx.Handle(500, "setting.WebHooks(GetWebhooksByRepoId)", err)
  189. return
  190. }
  191. ctx.Data["Webhooks"] = ws
  192. ctx.HTML(200, "repo/hooks")
  193. }
  194. func WebHooksAdd(ctx *middleware.Context) {
  195. ctx.Data["IsRepoToolbarWebHooks"] = true
  196. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Add Webhook"
  197. ctx.HTML(200, "repo/hooks_add")
  198. }
  199. func WebHooksAddPost(ctx *middleware.Context, form auth.NewWebhookForm) {
  200. ctx.Data["IsRepoToolbarWebHooks"] = true
  201. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Add Webhook"
  202. if ctx.HasError() {
  203. ctx.HTML(200, "repo/hooks_add")
  204. return
  205. }
  206. ct := models.CT_JSON
  207. if form.ContentType == "2" {
  208. ct = models.CT_FORM
  209. }
  210. w := &models.Webhook{
  211. RepoId: ctx.Repo.Repository.Id,
  212. Url: form.Url,
  213. ContentType: ct,
  214. Secret: form.Secret,
  215. HookEvent: &models.HookEvent{
  216. PushOnly: form.PushOnly,
  217. },
  218. IsActive: form.Active,
  219. }
  220. if err := w.SaveEvent(); err != nil {
  221. ctx.Handle(500, "setting.WebHooksAddPost(SaveEvent)", err)
  222. return
  223. } else if err := models.CreateWebhook(w); err != nil {
  224. ctx.Handle(500, "setting.WebHooksAddPost(CreateWebhook)", err)
  225. return
  226. }
  227. ctx.Flash.Success("New webhook has been added.")
  228. ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks")
  229. }
  230. func WebHooksEdit(ctx *middleware.Context, params martini.Params) {
  231. ctx.Data["IsRepoToolbarWebHooks"] = true
  232. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Webhook"
  233. hookId, _ := base.StrTo(params["id"]).Int64()
  234. if hookId == 0 {
  235. ctx.Handle(404, "setting.WebHooksEdit", nil)
  236. return
  237. }
  238. w, err := models.GetWebhookById(hookId)
  239. if err != nil {
  240. if err == models.ErrWebhookNotExist {
  241. ctx.Handle(404, "setting.WebHooksEdit(GetWebhookById)", nil)
  242. } else {
  243. ctx.Handle(500, "setting.WebHooksEdit(GetWebhookById)", err)
  244. }
  245. return
  246. }
  247. w.GetEvent()
  248. ctx.Data["Webhook"] = w
  249. ctx.HTML(200, "repo/hooks_edit")
  250. }
  251. func WebHooksEditPost(ctx *middleware.Context, params martini.Params, form auth.NewWebhookForm) {
  252. ctx.Data["IsRepoToolbarWebHooks"] = true
  253. ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Webhook"
  254. if ctx.HasError() {
  255. ctx.HTML(200, "repo/hooks_add")
  256. return
  257. }
  258. hookId, _ := base.StrTo(params["id"]).Int64()
  259. if hookId == 0 {
  260. ctx.Handle(404, "setting.WebHooksEditPost", nil)
  261. return
  262. }
  263. ct := models.CT_JSON
  264. if form.ContentType == "2" {
  265. ct = models.CT_FORM
  266. }
  267. w := &models.Webhook{
  268. Id: hookId,
  269. RepoId: ctx.Repo.Repository.Id,
  270. Url: form.Url,
  271. ContentType: ct,
  272. Secret: form.Secret,
  273. HookEvent: &models.HookEvent{
  274. PushOnly: form.PushOnly,
  275. },
  276. IsActive: form.Active,
  277. }
  278. if err := w.SaveEvent(); err != nil {
  279. ctx.Handle(500, "setting.WebHooksEditPost(SaveEvent)", err)
  280. return
  281. } else if err := models.UpdateWebhook(w); err != nil {
  282. ctx.Handle(500, "setting.WebHooksEditPost(WebHooksEditPost)", err)
  283. return
  284. }
  285. ctx.Flash.Success("Webhook has been updated.")
  286. ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", ctx.Repo.RepoLink, hookId))
  287. }