You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

issue_dependency.go 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // Copyright 2018 The Gitea 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. "net/http"
  8. "code.gitea.io/gitea/models"
  9. "code.gitea.io/gitea/modules/context"
  10. "code.gitea.io/gitea/modules/setting"
  11. )
  12. // AddDependency adds new dependencies
  13. func AddDependency(ctx *context.Context) {
  14. // Check if the Repo is allowed to have dependencies
  15. if !ctx.Repo.CanCreateIssueDependencies(ctx.User) {
  16. ctx.Error(http.StatusForbidden, "CanCreateIssueDependencies")
  17. return
  18. }
  19. depID := ctx.QueryInt64("newDependency")
  20. issueIndex := ctx.ParamsInt64("index")
  21. issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, issueIndex)
  22. if err != nil {
  23. ctx.ServerError("GetIssueByIndex", err)
  24. return
  25. }
  26. // Redirect
  27. defer ctx.Redirect(fmt.Sprintf("%s/issues/%d", ctx.Repo.RepoLink, issueIndex), http.StatusSeeOther)
  28. // Dependency
  29. dep, err := models.GetIssueByID(depID)
  30. if err != nil {
  31. ctx.Flash.Error(ctx.Tr("repo.issues.dependency.add_error_dep_issue_not_exist"))
  32. return
  33. }
  34. // Check if both issues are in the same repo if cross repository dependencies is not enabled
  35. if issue.RepoID != dep.RepoID && !setting.Service.AllowCrossRepositoryDependencies {
  36. ctx.Flash.Error(ctx.Tr("repo.issues.dependency.add_error_dep_not_same_repo"))
  37. return
  38. }
  39. // Check if issue and dependency is the same
  40. if dep.ID == issue.ID {
  41. ctx.Flash.Error(ctx.Tr("repo.issues.dependency.add_error_same_issue"))
  42. return
  43. }
  44. err = models.CreateIssueDependency(ctx.User, issue, dep)
  45. if err != nil {
  46. if models.IsErrDependencyExists(err) {
  47. ctx.Flash.Error(ctx.Tr("repo.issues.dependency.add_error_dep_exists"))
  48. return
  49. } else if models.IsErrCircularDependency(err) {
  50. ctx.Flash.Error(ctx.Tr("repo.issues.dependency.add_error_cannot_create_circular"))
  51. return
  52. } else {
  53. ctx.ServerError("CreateOrUpdateIssueDependency", err)
  54. return
  55. }
  56. }
  57. }
  58. // RemoveDependency removes the dependency
  59. func RemoveDependency(ctx *context.Context) {
  60. // Check if the Repo is allowed to have dependencies
  61. if !ctx.Repo.CanCreateIssueDependencies(ctx.User) {
  62. ctx.Error(http.StatusForbidden, "CanCreateIssueDependencies")
  63. return
  64. }
  65. depID := ctx.QueryInt64("removeDependencyID")
  66. issueIndex := ctx.ParamsInt64("index")
  67. issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, issueIndex)
  68. if err != nil {
  69. ctx.ServerError("GetIssueByIndex", err)
  70. return
  71. }
  72. // Redirect
  73. ctx.Redirect(fmt.Sprintf("%s/issues/%d", ctx.Repo.RepoLink, issueIndex), http.StatusSeeOther)
  74. // Dependency Type
  75. depTypeStr := ctx.Req.PostForm.Get("dependencyType")
  76. var depType models.DependencyType
  77. switch depTypeStr {
  78. case "blockedBy":
  79. depType = models.DependencyTypeBlockedBy
  80. case "blocking":
  81. depType = models.DependencyTypeBlocking
  82. default:
  83. ctx.Error(http.StatusBadRequest, "GetDependecyType")
  84. return
  85. }
  86. // Dependency
  87. dep, err := models.GetIssueByID(depID)
  88. if err != nil {
  89. ctx.ServerError("GetIssueByID", err)
  90. return
  91. }
  92. if err = models.RemoveIssueDependency(ctx.User, issue, dep, depType); err != nil {
  93. if models.IsErrDependencyNotExists(err) {
  94. ctx.Flash.Error(ctx.Tr("repo.issues.dependency.add_error_dep_not_exist"))
  95. return
  96. }
  97. ctx.ServerError("RemoveIssueDependency", err)
  98. return
  99. }
  100. }