From 9f35c2493407ae29ac250b9fc8eb46536ef62dbc Mon Sep 17 00:00:00 2001 From: lng2020 Date: Sun, 22 Oct 2023 17:35:50 +0800 Subject: [PATCH 1/4] Fix issue dependences --- routers/api/v1/repo/issue_dependency.go | 23 +++++-------- routers/web/repo/issue.go | 45 ++++++++++--------------- 2 files changed, 26 insertions(+), 42 deletions(-) diff --git a/routers/api/v1/repo/issue_dependency.go b/routers/api/v1/repo/issue_dependency.go index 0e3bcd93ef4f1..f2441eebd6114 100644 --- a/routers/api/v1/repo/issue_dependency.go +++ b/routers/api/v1/repo/issue_dependency.go @@ -102,23 +102,18 @@ func GetIssueDependencies(ctx *context.APIContext) { return } - var lastRepoID int64 - var lastPerm access_model.Permission for _, blocker := range blockersInfo { // Get the permissions for this repository - perm := lastPerm - if lastRepoID != blocker.Repository.ID { - if blocker.Repository.ID == ctx.Repo.Repository.ID { - perm = ctx.Repo.Permission - } else { - var err error - perm, err = access_model.GetUserRepoPermission(ctx, &blocker.Repository, ctx.Doer) - if err != nil { - ctx.ServerError("GetUserRepoPermission", err) - return - } + var perm access_model.Permission + if blocker.Repository.ID == ctx.Repo.Repository.ID { + perm = ctx.Repo.Permission + } else { + var err error + perm, err = access_model.GetUserRepoPermission(ctx, &blocker.Repository, ctx.Doer) + if err != nil { + ctx.ServerError("GetUserRepoPermission", err) + return } - lastRepoID = blocker.Repository.ID } // check permission diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 96fce48878219..ed716c978d8ad 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -1961,7 +1961,7 @@ func ViewIssue(ctx *context.Context) { return } - ctx.Data["BlockingDependencies"], ctx.Data["BlockingByDependenciesNotPermitted"] = checkBlockedByIssues(ctx, blocking) + ctx.Data["BlockingDependencies"], ctx.Data["BlockingDependenciesNotPermitted"] = checkBlockedByIssues(ctx, blocking) if ctx.Written() { return } @@ -2022,38 +2022,27 @@ func ViewIssue(ctx *context.Context) { // checkBlockedByIssues return canRead and notPermitted func checkBlockedByIssues(ctx *context.Context, blockers []*issues_model.DependencyInfo) (canRead, notPermitted []*issues_model.DependencyInfo) { - var ( - lastRepoID int64 - lastPerm access_model.Permission - ) - for i, blocker := range blockers { - // Get the permissions for this repository - perm := lastPerm - if lastRepoID != blocker.Repository.ID { - if blocker.Repository.ID == ctx.Repo.Repository.ID { - perm = ctx.Repo.Permission - } else { - var err error - perm, err = access_model.GetUserRepoPermission(ctx, &blocker.Repository, ctx.Doer) - if err != nil { - ctx.ServerError("GetUserRepoPermission", err) - return nil, nil - } + for _, blocker := range blockers { + var perm access_model.Permission + if blocker.Repository.ID == ctx.Repo.Repository.ID { + perm = ctx.Repo.Permission + } else { + var err error + perm, err = access_model.GetUserRepoPermission(ctx, &blocker.Repository, ctx.Doer) + if err != nil { + ctx.ServerError("GetUserRepoPermission", err) + return nil, nil } - lastRepoID = blocker.Repository.ID } - - // check permission - if !perm.CanReadIssuesOrPulls(blocker.Issue.IsPull) { - blockers[len(notPermitted)], blockers[i] = blocker, blockers[len(notPermitted)] - notPermitted = blockers[:len(notPermitted)+1] + if perm.CanReadIssuesOrPulls(blocker.Issue.IsPull) { + canRead = append(canRead, blocker) + } else { + notPermitted = append(notPermitted, blocker) } } - blockers = blockers[len(notPermitted):] - sortDependencyInfo(blockers) + sortDependencyInfo(canRead) sortDependencyInfo(notPermitted) - - return blockers, notPermitted + return canRead, notPermitted } func sortDependencyInfo(blockers []*issues_model.DependencyInfo) { From 0e91cc3bfb9c02d594f2f5cc96ec61f224354dbb Mon Sep 17 00:00:00 2001 From: lng2020 Date: Sun, 22 Oct 2023 17:40:33 +0800 Subject: [PATCH 2/4] fix --- routers/api/v1/repo/issue_dependency.go | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/routers/api/v1/repo/issue_dependency.go b/routers/api/v1/repo/issue_dependency.go index f2441eebd6114..9573ada87994a 100644 --- a/routers/api/v1/repo/issue_dependency.go +++ b/routers/api/v1/repo/issue_dependency.go @@ -340,29 +340,22 @@ func GetIssueBlocks(ctx *context.APIContext) { return } - var lastRepoID int64 - var lastPerm access_model.Permission - var issues []*issues_model.Issue for i, depMeta := range deps { if i < skip || i >= max { continue } - // Get the permissions for this repository - perm := lastPerm - if lastRepoID != depMeta.Repository.ID { - if depMeta.Repository.ID == ctx.Repo.Repository.ID { - perm = ctx.Repo.Permission - } else { - var err error - perm, err = access_model.GetUserRepoPermission(ctx, &depMeta.Repository, ctx.Doer) - if err != nil { - ctx.ServerError("GetUserRepoPermission", err) - return - } + var perm access_model.Permission + if depMeta.Repository.ID == ctx.Repo.Repository.ID { + perm = ctx.Repo.Permission + } else { + var err error + perm, err = access_model.GetUserRepoPermission(ctx, &depMeta.Repository, ctx.Doer) + if err != nil { + ctx.ServerError("GetUserRepoPermission", err) + return } - lastRepoID = depMeta.Repository.ID } if !perm.CanReadIssuesOrPulls(depMeta.Issue.IsPull) { From ddfcda793bcf293615375a9e919d1b19762422a2 Mon Sep 17 00:00:00 2001 From: lng2020 Date: Fri, 27 Oct 2023 15:55:14 +0800 Subject: [PATCH 3/4] use map --- routers/api/v1/repo/issue_dependency.go | 23 +++++++++++++++++++---- routers/web/repo/issue.go | 13 ++++++++++--- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/routers/api/v1/repo/issue_dependency.go b/routers/api/v1/repo/issue_dependency.go index 9573ada87994a..62d1057cdf946 100644 --- a/routers/api/v1/repo/issue_dependency.go +++ b/routers/api/v1/repo/issue_dependency.go @@ -102,11 +102,16 @@ func GetIssueDependencies(ctx *context.APIContext) { return } + repoPerms := make(map[int64]access_model.Permission) + repoPerms[ctx.Repo.Repository.ID] = ctx.Repo.Permission for _, blocker := range blockersInfo { // Get the permissions for this repository + // If the repo ID exists in the map, return the exist permissions + // else get the permission and add it to the map var perm access_model.Permission - if blocker.Repository.ID == ctx.Repo.Repository.ID { - perm = ctx.Repo.Permission + existPerm, ok := repoPerms[blocker.RepoID] + if ok { + perm = existPerm } else { var err error perm, err = access_model.GetUserRepoPermission(ctx, &blocker.Repository, ctx.Doer) @@ -114,6 +119,7 @@ func GetIssueDependencies(ctx *context.APIContext) { ctx.ServerError("GetUserRepoPermission", err) return } + repoPerms[blocker.RepoID] = perm } // check permission @@ -341,14 +347,22 @@ func GetIssueBlocks(ctx *context.APIContext) { } var issues []*issues_model.Issue + + repoPerms := make(map[int64]access_model.Permission) + repoPerms[ctx.Repo.Repository.ID] = ctx.Repo.Permission + for i, depMeta := range deps { if i < skip || i >= max { continue } + // Get the permissions for this repository + // If the repo ID exists in the map, return the exist permissions + // else get the permission and add it to the map var perm access_model.Permission - if depMeta.Repository.ID == ctx.Repo.Repository.ID { - perm = ctx.Repo.Permission + existPerm, ok := repoPerms[depMeta.RepoID] + if ok { + perm = existPerm } else { var err error perm, err = access_model.GetUserRepoPermission(ctx, &depMeta.Repository, ctx.Doer) @@ -356,6 +370,7 @@ func GetIssueBlocks(ctx *context.APIContext) { ctx.ServerError("GetUserRepoPermission", err) return } + repoPerms[depMeta.RepoID] = perm } if !perm.CanReadIssuesOrPulls(depMeta.Issue.IsPull) { diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index ed716c978d8ad..ef82b8ef07503 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -2022,17 +2022,24 @@ func ViewIssue(ctx *context.Context) { // checkBlockedByIssues return canRead and notPermitted func checkBlockedByIssues(ctx *context.Context, blockers []*issues_model.DependencyInfo) (canRead, notPermitted []*issues_model.DependencyInfo) { + repoPerms := make(map[int64]access_model.Permission) + repoPerms[ctx.Repo.Repository.ID] = ctx.Repo.Permission for _, blocker := range blockers { + // Get the permissions for this repository + // If the repo ID exists in the map, return the exist permissions + // else get the permission and add it to the map var perm access_model.Permission - if blocker.Repository.ID == ctx.Repo.Repository.ID { - perm = ctx.Repo.Permission + existPerm, ok := repoPerms[blocker.RepoID] + if ok { + perm = existPerm } else { var err error perm, err = access_model.GetUserRepoPermission(ctx, &blocker.Repository, ctx.Doer) if err != nil { ctx.ServerError("GetUserRepoPermission", err) - return nil, nil + return } + repoPerms[blocker.RepoID] = perm } if perm.CanReadIssuesOrPulls(blocker.Issue.IsPull) { canRead = append(canRead, blocker) From bf76eff3a46597b3f0b63b40b3999de706c45a83 Mon Sep 17 00:00:00 2001 From: lng2020 Date: Fri, 27 Oct 2023 16:24:20 +0800 Subject: [PATCH 4/4] fix lint --- routers/web/repo/issue.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index ef82b8ef07503..df28152d9dda5 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -2037,7 +2037,7 @@ func checkBlockedByIssues(ctx *context.Context, blockers []*issues_model.Depende perm, err = access_model.GetUserRepoPermission(ctx, &blocker.Repository, ctx.Doer) if err != nil { ctx.ServerError("GetUserRepoPermission", err) - return + return nil, nil } repoPerms[blocker.RepoID] = perm }