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