123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- // Copyright 2018 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package repo
-
- import (
- "net/http"
-
- issues_model "code.gitea.io/gitea/models/issues"
- access_model "code.gitea.io/gitea/models/perm/access"
- "code.gitea.io/gitea/modules/context"
- "code.gitea.io/gitea/modules/setting"
- )
-
- // AddDependency adds new dependencies
- func AddDependency(ctx *context.Context) {
- issueIndex := ctx.ParamsInt64("index")
- issue, err := issues_model.GetIssueByIndex(ctx, ctx.Repo.Repository.ID, issueIndex)
- if err != nil {
- ctx.ServerError("GetIssueByIndex", err)
- return
- }
-
- // Check if the Repo is allowed to have dependencies
- if !ctx.Repo.CanCreateIssueDependencies(ctx.Doer, issue.IsPull) {
- ctx.Error(http.StatusForbidden, "CanCreateIssueDependencies")
- return
- }
-
- depID := ctx.FormInt64("newDependency")
-
- if err = issue.LoadRepo(ctx); err != nil {
- ctx.ServerError("LoadRepo", err)
- return
- }
-
- // Redirect
- defer ctx.Redirect(issue.Link())
-
- // Dependency
- dep, err := issues_model.GetIssueByID(ctx, depID)
- if err != nil {
- ctx.Flash.Error(ctx.Tr("repo.issues.dependency.add_error_dep_issue_not_exist"))
- return
- }
-
- // Check if both issues are in the same repo if cross repository dependencies is not enabled
- if issue.RepoID != dep.RepoID {
- if !setting.Service.AllowCrossRepositoryDependencies {
- ctx.Flash.Error(ctx.Tr("repo.issues.dependency.add_error_dep_not_same_repo"))
- return
- }
- if err := dep.LoadRepo(ctx); err != nil {
- ctx.ServerError("loadRepo", err)
- return
- }
- // Can ctx.Doer read issues in the dep repo?
- depRepoPerm, err := access_model.GetUserRepoPermission(ctx, dep.Repo, ctx.Doer)
- if err != nil {
- ctx.ServerError("GetUserRepoPermission", err)
- return
- }
- if !depRepoPerm.CanReadIssuesOrPulls(dep.IsPull) {
- // you can't see this dependency
- return
- }
- }
-
- // Check if issue and dependency is the same
- if dep.ID == issue.ID {
- ctx.Flash.Error(ctx.Tr("repo.issues.dependency.add_error_same_issue"))
- return
- }
-
- err = issues_model.CreateIssueDependency(ctx.Doer, issue, dep)
- if err != nil {
- if issues_model.IsErrDependencyExists(err) {
- ctx.Flash.Error(ctx.Tr("repo.issues.dependency.add_error_dep_exists"))
- return
- } else if issues_model.IsErrCircularDependency(err) {
- ctx.Flash.Error(ctx.Tr("repo.issues.dependency.add_error_cannot_create_circular"))
- return
- } else {
- ctx.ServerError("CreateOrUpdateIssueDependency", err)
- return
- }
- }
- }
-
- // RemoveDependency removes the dependency
- func RemoveDependency(ctx *context.Context) {
- issueIndex := ctx.ParamsInt64("index")
- issue, err := issues_model.GetIssueByIndex(ctx, ctx.Repo.Repository.ID, issueIndex)
- if err != nil {
- ctx.ServerError("GetIssueByIndex", err)
- return
- }
-
- // Check if the Repo is allowed to have dependencies
- if !ctx.Repo.CanCreateIssueDependencies(ctx.Doer, issue.IsPull) {
- ctx.Error(http.StatusForbidden, "CanCreateIssueDependencies")
- return
- }
-
- depID := ctx.FormInt64("removeDependencyID")
-
- if err = issue.LoadRepo(ctx); err != nil {
- ctx.ServerError("LoadRepo", err)
- return
- }
-
- // Dependency Type
- depTypeStr := ctx.Req.PostForm.Get("dependencyType")
-
- var depType issues_model.DependencyType
-
- switch depTypeStr {
- case "blockedBy":
- depType = issues_model.DependencyTypeBlockedBy
- case "blocking":
- depType = issues_model.DependencyTypeBlocking
- default:
- ctx.Error(http.StatusBadRequest, "GetDependecyType")
- return
- }
-
- // Dependency
- dep, err := issues_model.GetIssueByID(ctx, depID)
- if err != nil {
- ctx.ServerError("GetIssueByID", err)
- return
- }
-
- if err = issues_model.RemoveIssueDependency(ctx.Doer, issue, dep, depType); err != nil {
- if issues_model.IsErrDependencyNotExists(err) {
- ctx.Flash.Error(ctx.Tr("repo.issues.dependency.add_error_dep_not_exist"))
- return
- }
- ctx.ServerError("RemoveIssueDependency", err)
- return
- }
-
- // Redirect
- ctx.Redirect(issue.Link())
- }
|