Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

10 лет назад
9 лет назад
10 лет назад
10 лет назад
10 лет назад
9 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
9 лет назад
10 лет назад
10 лет назад
9 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
9 лет назад
10 лет назад
9 лет назад
10 лет назад
9 лет назад
9 лет назад
9 лет назад
9 лет назад
10 лет назад
10 лет назад
9 лет назад
9 лет назад
10 лет назад
9 лет назад
10 лет назад
9 лет назад
10 лет назад
10 лет назад
9 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
9 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
9 лет назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  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. "encoding/json"
  7. "errors"
  8. "fmt"
  9. "strings"
  10. "time"
  11. "github.com/Unknwon/com"
  12. "github.com/gogits/gogs/models"
  13. "github.com/gogits/gogs/modules/auth"
  14. "github.com/gogits/gogs/modules/base"
  15. "github.com/gogits/gogs/modules/git"
  16. "github.com/gogits/gogs/modules/log"
  17. "github.com/gogits/gogs/modules/mailer"
  18. "github.com/gogits/gogs/modules/middleware"
  19. "github.com/gogits/gogs/modules/setting"
  20. )
  21. const (
  22. SETTINGS_OPTIONS base.TplName = "repo/settings/options"
  23. COLLABORATION base.TplName = "repo/settings/collaboration"
  24. HOOKS base.TplName = "repo/settings/hooks"
  25. GITHOOKS base.TplName = "repo/settings/githooks"
  26. GITHOOK_EDIT base.TplName = "repo/settings/githook_edit"
  27. HOOK_NEW base.TplName = "repo/settings/hook_new"
  28. ORG_HOOK_NEW base.TplName = "org/settings/hook_new"
  29. )
  30. func Settings(ctx *middleware.Context) {
  31. ctx.Data["Title"] = ctx.Tr("repo.settings")
  32. ctx.Data["PageIsSettingsOptions"] = true
  33. ctx.HTML(200, SETTINGS_OPTIONS)
  34. }
  35. func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
  36. ctx.Data["Title"] = ctx.Tr("repo.settings")
  37. ctx.Data["PageIsSettingsOptions"] = true
  38. switch ctx.Query("action") {
  39. case "update":
  40. if ctx.HasError() {
  41. ctx.HTML(200, SETTINGS_OPTIONS)
  42. return
  43. }
  44. newRepoName := form.RepoName
  45. // Check if repository name has been changed.
  46. if ctx.Repo.Repository.Name != newRepoName {
  47. if err := models.ChangeRepositoryName(ctx.Repo.Owner, ctx.Repo.Repository.Name, newRepoName); err != nil {
  48. switch {
  49. case err == models.ErrRepoAlreadyExist:
  50. ctx.Data["Err_RepoName"] = true
  51. ctx.RenderWithErr(ctx.Tr("form.repo_name_been_taken"), SETTINGS_OPTIONS, &form)
  52. case models.IsErrNameReserved(err):
  53. ctx.Data["Err_RepoName"] = true
  54. ctx.RenderWithErr(ctx.Tr("repo.form.name_reserved", err.(models.ErrNameReserved).Name), SETTINGS_OPTIONS, &form)
  55. case models.IsErrNamePatternNotAllowed(err):
  56. ctx.Data["Err_RepoName"] = true
  57. ctx.RenderWithErr(ctx.Tr("repo.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), SETTINGS_OPTIONS, &form)
  58. default:
  59. ctx.Handle(500, "ChangeRepositoryName", err)
  60. }
  61. return
  62. }
  63. log.Trace("Repository name changed: %s/%s -> %s", ctx.Repo.Owner.Name, ctx.Repo.Repository.Name, newRepoName)
  64. ctx.Repo.Repository.Name = newRepoName
  65. ctx.Repo.Repository.LowerName = strings.ToLower(newRepoName)
  66. }
  67. br := form.Branch
  68. if ctx.Repo.GitRepo.IsBranchExist(br) {
  69. ctx.Repo.Repository.DefaultBranch = br
  70. }
  71. ctx.Repo.Repository.Description = form.Description
  72. ctx.Repo.Repository.Website = form.Website
  73. visibilityChanged := ctx.Repo.Repository.IsPrivate != form.Private
  74. ctx.Repo.Repository.IsPrivate = form.Private
  75. if err := models.UpdateRepository(ctx.Repo.Repository, visibilityChanged); err != nil {
  76. ctx.Handle(404, "UpdateRepository", err)
  77. return
  78. }
  79. log.Trace("Repository updated: %s/%s", ctx.Repo.Owner.Name, ctx.Repo.Repository.Name)
  80. if ctx.Repo.Repository.IsMirror {
  81. if form.Interval > 0 {
  82. ctx.Repo.Mirror.Interval = form.Interval
  83. ctx.Repo.Mirror.NextUpdate = time.Now().Add(time.Duration(form.Interval) * time.Hour)
  84. if err := models.UpdateMirror(ctx.Repo.Mirror); err != nil {
  85. log.Error(4, "UpdateMirror: %v", err)
  86. }
  87. }
  88. }
  89. ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success"))
  90. ctx.Redirect(fmt.Sprintf("%s/%s/%s/settings", setting.AppSubUrl, ctx.Repo.Owner.Name, ctx.Repo.Repository.Name))
  91. case "transfer":
  92. if ctx.Repo.Repository.Name != form.RepoName {
  93. ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), SETTINGS_OPTIONS, nil)
  94. return
  95. }
  96. newOwner := ctx.Query("new_owner_name")
  97. isExist, err := models.IsUserExist(0, newOwner)
  98. if err != nil {
  99. ctx.Handle(500, "IsUserExist", err)
  100. return
  101. } else if !isExist {
  102. ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_owner_name"), SETTINGS_OPTIONS, nil)
  103. return
  104. }
  105. if _, err = models.UserSignIn(ctx.User.Name, ctx.Query("password")); err != nil {
  106. if err == models.ErrUserNotExist {
  107. ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_password"), SETTINGS_OPTIONS, nil)
  108. } else {
  109. ctx.Handle(500, "UserSignIn", err)
  110. }
  111. return
  112. }
  113. if err = models.TransferOwnership(ctx.User, newOwner, ctx.Repo.Repository); err != nil {
  114. if err == models.ErrRepoAlreadyExist {
  115. ctx.RenderWithErr(ctx.Tr("repo.settings.new_owner_has_same_repo"), SETTINGS_OPTIONS, nil)
  116. } else {
  117. ctx.Handle(500, "TransferOwnership", err)
  118. }
  119. return
  120. }
  121. log.Trace("Repository transfered: %s/%s -> %s", ctx.Repo.Owner.Name, ctx.Repo.Repository.Name, newOwner)
  122. ctx.Flash.Success(ctx.Tr("repo.settings.transfer_succeed"))
  123. ctx.Redirect(setting.AppSubUrl + "/")
  124. case "delete":
  125. if ctx.Repo.Repository.Name != form.RepoName {
  126. ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), SETTINGS_OPTIONS, nil)
  127. return
  128. }
  129. if ctx.Repo.Owner.IsOrganization() {
  130. if !ctx.Repo.Owner.IsOwnedBy(ctx.User.Id) {
  131. ctx.Error(404)
  132. return
  133. }
  134. }
  135. if _, err := models.UserSignIn(ctx.User.Name, ctx.Query("password")); err != nil {
  136. if err == models.ErrUserNotExist {
  137. ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_password"), SETTINGS_OPTIONS, nil)
  138. } else {
  139. ctx.Handle(500, "UserSignIn", err)
  140. }
  141. return
  142. }
  143. if err := models.DeleteRepository(ctx.Repo.Owner.Id, ctx.Repo.Repository.Id, ctx.Repo.Owner.Name); err != nil {
  144. ctx.Handle(500, "DeleteRepository", err)
  145. return
  146. }
  147. log.Trace("Repository deleted: %s/%s", ctx.Repo.Owner.Name, ctx.Repo.Repository.Name)
  148. if ctx.Repo.Owner.IsOrganization() {
  149. ctx.Redirect(setting.AppSubUrl + "/org/" + ctx.Repo.Owner.Name + "/dashboard")
  150. } else {
  151. ctx.Redirect(setting.AppSubUrl + "/")
  152. }
  153. }
  154. }
  155. func SettingsCollaboration(ctx *middleware.Context) {
  156. ctx.Data["Title"] = ctx.Tr("repo.settings")
  157. ctx.Data["PageIsSettingsCollaboration"] = true
  158. if ctx.Req.Method == "POST" {
  159. name := strings.ToLower(ctx.Query("collaborator"))
  160. if len(name) == 0 || ctx.Repo.Owner.LowerName == name {
  161. ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path)
  162. return
  163. }
  164. u, err := models.GetUserByName(name)
  165. if err != nil {
  166. if err == models.ErrUserNotExist {
  167. ctx.Flash.Error(ctx.Tr("form.user_not_exist"))
  168. ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path)
  169. } else {
  170. ctx.Handle(500, "GetUserByName", err)
  171. }
  172. return
  173. }
  174. // Check if user is organization member.
  175. if ctx.Repo.Owner.IsOrganization() && ctx.Repo.Owner.IsOrgMember(u.Id) {
  176. ctx.Flash.Info(ctx.Tr("repo.settings.user_is_org_member"))
  177. ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration")
  178. return
  179. }
  180. if err = ctx.Repo.Repository.AddCollaborator(u); err != nil {
  181. ctx.Handle(500, "AddCollaborator", err)
  182. return
  183. }
  184. if setting.Service.EnableNotifyMail {
  185. if err = mailer.SendCollaboratorMail(ctx.Render, u, ctx.User, ctx.Repo.Repository); err != nil {
  186. ctx.Handle(500, "SendCollaboratorMail", err)
  187. return
  188. }
  189. }
  190. ctx.Flash.Success(ctx.Tr("repo.settings.add_collaborator_success"))
  191. ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path)
  192. return
  193. }
  194. // Delete collaborator.
  195. remove := strings.ToLower(ctx.Query("remove"))
  196. if len(remove) > 0 && remove != ctx.Repo.Owner.LowerName {
  197. u, err := models.GetUserByName(remove)
  198. if err != nil {
  199. ctx.Handle(500, "GetUserByName", err)
  200. return
  201. }
  202. if err := ctx.Repo.Repository.DeleteCollaborator(u); err != nil {
  203. ctx.Handle(500, "DeleteCollaborator", err)
  204. return
  205. }
  206. ctx.Flash.Success(ctx.Tr("repo.settings.remove_collaborator_success"))
  207. ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration")
  208. return
  209. }
  210. users, err := ctx.Repo.Repository.GetCollaborators()
  211. if err != nil {
  212. ctx.Handle(500, "GetCollaborators", err)
  213. return
  214. }
  215. ctx.Data["Collaborators"] = users
  216. ctx.HTML(200, COLLABORATION)
  217. }
  218. func Webhooks(ctx *middleware.Context) {
  219. ctx.Data["Title"] = ctx.Tr("repo.settings")
  220. ctx.Data["PageIsSettingsHooks"] = true
  221. // Delete web hook.
  222. remove := com.StrTo(ctx.Query("remove")).MustInt64()
  223. if remove > 0 {
  224. if err := models.DeleteWebhook(remove); err != nil {
  225. ctx.Handle(500, "DeleteWebhook", err)
  226. return
  227. }
  228. ctx.Flash.Success(ctx.Tr("repo.settings.remove_hook_success"))
  229. ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks")
  230. return
  231. }
  232. ws, err := models.GetWebhooksByRepoId(ctx.Repo.Repository.Id)
  233. if err != nil {
  234. ctx.Handle(500, "GetWebhooksByRepoId", err)
  235. return
  236. }
  237. ctx.Data["Webhooks"] = ws
  238. ctx.HTML(200, HOOKS)
  239. }
  240. func renderHookTypes(ctx *middleware.Context) {
  241. ctx.Data["HookTypes"] = []string{"Gogs", "Slack"}
  242. ctx.Data["HookType"] = "Gogs"
  243. }
  244. func WebHooksNew(ctx *middleware.Context) {
  245. ctx.Data["Title"] = ctx.Tr("repo.settings")
  246. ctx.Data["PageIsSettingsHooks"] = true
  247. ctx.Data["PageIsSettingsHooksNew"] = true
  248. ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}}
  249. renderHookTypes(ctx)
  250. orCtx, err := getOrgRepoCtx(ctx)
  251. if err != nil {
  252. ctx.Handle(500, "WebHooksNew(getOrgRepoCtx)", err)
  253. return
  254. }
  255. ctx.HTML(200, orCtx.NewTemplate)
  256. }
  257. func WebHooksNewPost(ctx *middleware.Context, form auth.NewWebhookForm) {
  258. ctx.Data["Title"] = ctx.Tr("repo.settings")
  259. ctx.Data["PageIsSettingsHooks"] = true
  260. ctx.Data["PageIsSettingsHooksNew"] = true
  261. ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}}
  262. orCtx, err := getOrgRepoCtx(ctx)
  263. if err != nil {
  264. ctx.Handle(500, "WebHooksNewPost(getOrgRepoCtx)", err)
  265. return
  266. }
  267. if ctx.HasError() {
  268. ctx.HTML(200, orCtx.NewTemplate)
  269. return
  270. }
  271. // FIXME: code too old here, sync with APIs
  272. ct := models.JSON
  273. if form.ContentType == "2" {
  274. ct = models.FORM
  275. }
  276. w := &models.Webhook{
  277. RepoId: orCtx.RepoId,
  278. Url: form.PayloadUrl,
  279. ContentType: ct,
  280. Secret: form.Secret,
  281. HookEvent: &models.HookEvent{
  282. PushOnly: form.PushOnly,
  283. },
  284. IsActive: form.Active,
  285. HookTaskType: models.GOGS,
  286. Meta: "",
  287. OrgId: orCtx.OrgId,
  288. }
  289. if err := w.UpdateEvent(); err != nil {
  290. ctx.Handle(500, "UpdateEvent", err)
  291. return
  292. } else if err := models.CreateWebhook(w); err != nil {
  293. ctx.Handle(500, "CreateWebhook", err)
  294. return
  295. }
  296. ctx.Flash.Success(ctx.Tr("repo.settings.add_hook_success"))
  297. ctx.Redirect(orCtx.Link + "/settings/hooks")
  298. }
  299. func WebHooksEdit(ctx *middleware.Context) {
  300. ctx.Data["Title"] = ctx.Tr("repo.settings")
  301. ctx.Data["PageIsSettingsHooks"] = true
  302. ctx.Data["PageIsSettingsHooksEdit"] = true
  303. hookId := com.StrTo(ctx.Params(":id")).MustInt64()
  304. if hookId == 0 {
  305. ctx.Handle(404, "setting.WebHooksEdit", nil)
  306. return
  307. }
  308. w, err := models.GetWebhookById(hookId)
  309. if err != nil {
  310. if err == models.ErrWebhookNotExist {
  311. ctx.Handle(404, "GetWebhookById", nil)
  312. } else {
  313. ctx.Handle(500, "GetWebhookById", err)
  314. }
  315. return
  316. }
  317. // set data per HookTaskType
  318. switch w.HookTaskType {
  319. case models.SLACK:
  320. {
  321. ctx.Data["SlackHook"] = w.GetSlackHook()
  322. ctx.Data["HookType"] = "Slack"
  323. }
  324. default:
  325. {
  326. ctx.Data["HookType"] = "Gogs"
  327. }
  328. }
  329. w.GetEvent()
  330. ctx.Data["Webhook"] = w
  331. orCtx, err := getOrgRepoCtx(ctx)
  332. if err != nil {
  333. ctx.Handle(500, "WebHooksEdit(getOrgRepoCtx)", err)
  334. return
  335. }
  336. ctx.HTML(200, orCtx.NewTemplate)
  337. }
  338. func WebHooksEditPost(ctx *middleware.Context, form auth.NewWebhookForm) {
  339. ctx.Data["Title"] = ctx.Tr("repo.settings")
  340. ctx.Data["PageIsSettingsHooks"] = true
  341. ctx.Data["PageIsSettingsHooksEdit"] = true
  342. hookId := com.StrTo(ctx.Params(":id")).MustInt64()
  343. if hookId == 0 {
  344. ctx.Handle(404, "setting.WebHooksEditPost", nil)
  345. return
  346. }
  347. w, err := models.GetWebhookById(hookId)
  348. if err != nil {
  349. if err == models.ErrWebhookNotExist {
  350. ctx.Handle(404, "GetWebhookById", nil)
  351. } else {
  352. ctx.Handle(500, "GetWebhookById", err)
  353. }
  354. return
  355. }
  356. w.GetEvent()
  357. ctx.Data["Webhook"] = w
  358. orCtx, err := getOrgRepoCtx(ctx)
  359. if err != nil {
  360. ctx.Handle(500, "WebHooksEditPost(getOrgRepoCtx)", err)
  361. return
  362. }
  363. if ctx.HasError() {
  364. ctx.HTML(200, orCtx.NewTemplate)
  365. return
  366. }
  367. ct := models.JSON
  368. if form.ContentType == "2" {
  369. ct = models.FORM
  370. }
  371. w.Url = form.PayloadUrl
  372. w.ContentType = ct
  373. w.Secret = form.Secret
  374. w.HookEvent = &models.HookEvent{
  375. PushOnly: form.PushOnly,
  376. }
  377. w.IsActive = form.Active
  378. if err := w.UpdateEvent(); err != nil {
  379. ctx.Handle(500, "UpdateEvent", err)
  380. return
  381. } else if err := models.UpdateWebhook(w); err != nil {
  382. ctx.Handle(500, "WebHooksEditPost", err)
  383. return
  384. }
  385. ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success"))
  386. ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", orCtx.Link, hookId))
  387. }
  388. func SlackHooksNewPost(ctx *middleware.Context, form auth.NewSlackHookForm) {
  389. ctx.Data["Title"] = ctx.Tr("repo.settings")
  390. ctx.Data["PageIsSettingsHooks"] = true
  391. ctx.Data["PageIsSettingsHooksNew"] = true
  392. ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}}
  393. orCtx, err := getOrgRepoCtx(ctx)
  394. if err != nil {
  395. ctx.Handle(500, "SlackHooksNewPost(getOrgRepoCtx)", err)
  396. return
  397. }
  398. if ctx.HasError() {
  399. ctx.HTML(200, orCtx.NewTemplate)
  400. return
  401. }
  402. meta, err := json.Marshal(&models.Slack{
  403. Channel: form.Channel,
  404. })
  405. if err != nil {
  406. ctx.Handle(500, "SlackHooksNewPost: JSON marshal failed: ", err)
  407. return
  408. }
  409. w := &models.Webhook{
  410. RepoId: orCtx.RepoId,
  411. Url: form.PayloadUrl,
  412. ContentType: models.JSON,
  413. Secret: "",
  414. HookEvent: &models.HookEvent{
  415. PushOnly: form.PushOnly,
  416. },
  417. IsActive: form.Active,
  418. HookTaskType: models.SLACK,
  419. Meta: string(meta),
  420. OrgId: orCtx.OrgId,
  421. }
  422. if err := w.UpdateEvent(); err != nil {
  423. ctx.Handle(500, "UpdateEvent", err)
  424. return
  425. } else if err := models.CreateWebhook(w); err != nil {
  426. ctx.Handle(500, "CreateWebhook", err)
  427. return
  428. }
  429. ctx.Flash.Success(ctx.Tr("repo.settings.add_hook_success"))
  430. ctx.Redirect(orCtx.Link + "/settings/hooks")
  431. }
  432. func SlackHooksEditPost(ctx *middleware.Context, form auth.NewSlackHookForm) {
  433. ctx.Data["Title"] = ctx.Tr("repo.settings")
  434. ctx.Data["PageIsSettingsHooks"] = true
  435. ctx.Data["PageIsSettingsHooksEdit"] = true
  436. hookId := com.StrTo(ctx.Params(":id")).MustInt64()
  437. if hookId == 0 {
  438. ctx.Handle(404, "SlackHooksEditPost(hookId)", nil)
  439. return
  440. }
  441. orCtx, err := getOrgRepoCtx(ctx)
  442. if err != nil {
  443. ctx.Handle(500, "SlackHooksEditPost(getOrgRepoCtx)", err)
  444. return
  445. }
  446. w, err := models.GetWebhookById(hookId)
  447. if err != nil {
  448. if err == models.ErrWebhookNotExist {
  449. ctx.Handle(404, "GetWebhookById", nil)
  450. } else {
  451. ctx.Handle(500, "GetWebhookById", err)
  452. }
  453. return
  454. }
  455. w.GetEvent()
  456. ctx.Data["Webhook"] = w
  457. if ctx.HasError() {
  458. ctx.HTML(200, orCtx.NewTemplate)
  459. return
  460. }
  461. meta, err := json.Marshal(&models.Slack{
  462. Channel: form.Channel,
  463. })
  464. if err != nil {
  465. ctx.Handle(500, "SlackHooksNewPost: JSON marshal failed: ", err)
  466. return
  467. }
  468. w.Url = form.PayloadUrl
  469. w.Meta = string(meta)
  470. w.HookEvent = &models.HookEvent{
  471. PushOnly: form.PushOnly,
  472. }
  473. w.IsActive = form.Active
  474. if err := w.UpdateEvent(); err != nil {
  475. ctx.Handle(500, "UpdateEvent", err)
  476. return
  477. } else if err := models.UpdateWebhook(w); err != nil {
  478. ctx.Handle(500, "SlackHooksEditPost", err)
  479. return
  480. }
  481. ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success"))
  482. ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", orCtx.Link, hookId))
  483. }
  484. type OrgRepoCtx struct {
  485. OrgId int64
  486. RepoId int64
  487. Link string
  488. NewTemplate base.TplName
  489. }
  490. // determines whether this is a repo context or organization context
  491. func getOrgRepoCtx(ctx *middleware.Context) (*OrgRepoCtx, error) {
  492. if _, ok := ctx.Data["RepoLink"]; ok {
  493. return &OrgRepoCtx{
  494. OrgId: int64(0),
  495. RepoId: ctx.Repo.Repository.Id,
  496. Link: ctx.Repo.RepoLink,
  497. NewTemplate: HOOK_NEW,
  498. }, nil
  499. } else if _, ok := ctx.Data["OrgLink"]; ok {
  500. return &OrgRepoCtx{
  501. OrgId: ctx.Org.Organization.Id,
  502. RepoId: int64(0),
  503. Link: ctx.Org.OrgLink,
  504. NewTemplate: ORG_HOOK_NEW,
  505. }, nil
  506. } else {
  507. return &OrgRepoCtx{}, errors.New("Unable to set OrgRepo context")
  508. }
  509. }
  510. func GitHooks(ctx *middleware.Context) {
  511. ctx.Data["Title"] = ctx.Tr("repo.settings")
  512. ctx.Data["PageIsSettingsGitHooks"] = true
  513. hooks, err := ctx.Repo.GitRepo.Hooks()
  514. if err != nil {
  515. ctx.Handle(500, "Hooks", err)
  516. return
  517. }
  518. ctx.Data["Hooks"] = hooks
  519. ctx.HTML(200, GITHOOKS)
  520. }
  521. func GitHooksEdit(ctx *middleware.Context) {
  522. ctx.Data["Title"] = ctx.Tr("repo.settings")
  523. ctx.Data["PageIsSettingsGitHooks"] = true
  524. name := ctx.Params(":name")
  525. hook, err := ctx.Repo.GitRepo.GetHook(name)
  526. if err != nil {
  527. if err == git.ErrNotValidHook {
  528. ctx.Handle(404, "GetHook", err)
  529. } else {
  530. ctx.Handle(500, "GetHook", err)
  531. }
  532. return
  533. }
  534. ctx.Data["Hook"] = hook
  535. ctx.HTML(200, GITHOOK_EDIT)
  536. }
  537. func GitHooksEditPost(ctx *middleware.Context) {
  538. name := ctx.Params(":name")
  539. hook, err := ctx.Repo.GitRepo.GetHook(name)
  540. if err != nil {
  541. if err == git.ErrNotValidHook {
  542. ctx.Handle(404, "GetHook", err)
  543. } else {
  544. ctx.Handle(500, "GetHook", err)
  545. }
  546. return
  547. }
  548. hook.Content = ctx.Query("content")
  549. if err = hook.Update(); err != nil {
  550. ctx.Handle(500, "hook.Update", err)
  551. return
  552. }
  553. ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks/git")
  554. }