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