forked from tangled.org/core
Monorepo for Tangled

appview: use less `RepoInfo` for `ResolvedRepo`

`RepoInfo` is mostly designed for rendering, don't use it for service
logic.

Signed-off-by: Seongmin Lee <git@boltless.me>

authored by boltless.me and committed by Tangled 5ff1be1b 02ff0c9e

Changed files
+36 -57
appview
+2 -3
appview/issues/issues.go
··· 226 l := rp.logger.With("handler", "DeleteIssue") 227 noticeId := "issue-actions-error" 228 229 - user := rp.oauth.GetUser(r) 230 - 231 f, err := rp.repoResolver.Resolve(r) 232 if err != nil { 233 l.Error("failed to get repo and knot", "err", err) ··· 271 rp.notifier.DeleteIssue(r.Context(), issue) 272 273 // return to all issues page 274 - rp.pages.HxRedirect(w, "/"+f.RepoInfo(user).FullName()+"/issues") 275 } 276 277 func (rp *Issues) CloseIssue(w http.ResponseWriter, r *http.Request) {
··· 226 l := rp.logger.With("handler", "DeleteIssue") 227 noticeId := "issue-actions-error" 228 229 f, err := rp.repoResolver.Resolve(r) 230 if err != nil { 231 l.Error("failed to get repo and knot", "err", err) ··· 269 rp.notifier.DeleteIssue(r.Context(), issue) 270 271 // return to all issues page 272 + ownerSlashRepo := reporesolver.GetBaseRepoPath(r, &f.Repo) 273 + rp.pages.HxRedirect(w, "/"+ownerSlashRepo+"/issues") 274 } 275 276 func (rp *Issues) CloseIssue(w http.ResponseWriter, r *http.Request) {
+13 -20
appview/pipelines/pipelines.go
··· 78 return 79 } 80 81 - repoInfo := f.RepoInfo(user) 82 - 83 ps, err := db.GetPipelineStatuses( 84 p.db, 85 30, 86 - db.FilterEq("repo_owner", repoInfo.OwnerDid), 87 - db.FilterEq("repo_name", repoInfo.Name), 88 - db.FilterEq("knot", repoInfo.Knot), 89 ) 90 if err != nil { 91 l.Error("failed to query db", "err", err) ··· 94 95 p.pages.Pipelines(w, pages.PipelinesParams{ 96 LoggedInUser: user, 97 - RepoInfo: repoInfo, 98 Pipelines: ps, 99 }) 100 } ··· 109 return 110 } 111 112 - repoInfo := f.RepoInfo(user) 113 - 114 pipelineId := chi.URLParam(r, "pipeline") 115 if pipelineId == "" { 116 l.Error("empty pipeline ID") ··· 126 ps, err := db.GetPipelineStatuses( 127 p.db, 128 1, 129 - db.FilterEq("repo_owner", repoInfo.OwnerDid), 130 - db.FilterEq("repo_name", repoInfo.Name), 131 - db.FilterEq("knot", repoInfo.Knot), 132 db.FilterEq("id", pipelineId), 133 ) 134 if err != nil { ··· 145 146 p.pages.Workflow(w, pages.WorkflowParams{ 147 LoggedInUser: user, 148 - RepoInfo: repoInfo, 149 Pipeline: singlePipeline, 150 Workflow: workflow, 151 }) ··· 176 ctx, cancel := context.WithCancel(r.Context()) 177 defer cancel() 178 179 - user := p.oauth.GetUser(r) 180 f, err := p.repoResolver.Resolve(r) 181 if err != nil { 182 l.Error("failed to get repo and knot", "err", err) ··· 184 return 185 } 186 187 - repoInfo := f.RepoInfo(user) 188 - 189 pipelineId := chi.URLParam(r, "pipeline") 190 workflow := chi.URLParam(r, "workflow") 191 if pipelineId == "" || workflow == "" { ··· 196 ps, err := db.GetPipelineStatuses( 197 p.db, 198 1, 199 - db.FilterEq("repo_owner", repoInfo.OwnerDid), 200 - db.FilterEq("repo_name", repoInfo.Name), 201 - db.FilterEq("knot", repoInfo.Knot), 202 db.FilterEq("id", pipelineId), 203 ) 204 if err != nil || len(ps) != 1 { ··· 208 } 209 210 singlePipeline := ps[0] 211 - spindle := repoInfo.Spindle 212 - knot := repoInfo.Knot 213 rkey := singlePipeline.Rkey 214 215 if spindle == "" || knot == "" || rkey == "" {
··· 78 return 79 } 80 81 ps, err := db.GetPipelineStatuses( 82 p.db, 83 30, 84 + db.FilterEq("repo_owner", f.Did), 85 + db.FilterEq("repo_name", f.Name), 86 + db.FilterEq("knot", f.Knot), 87 ) 88 if err != nil { 89 l.Error("failed to query db", "err", err) ··· 92 93 p.pages.Pipelines(w, pages.PipelinesParams{ 94 LoggedInUser: user, 95 + RepoInfo: f.RepoInfo(user), 96 Pipelines: ps, 97 }) 98 } ··· 107 return 108 } 109 110 pipelineId := chi.URLParam(r, "pipeline") 111 if pipelineId == "" { 112 l.Error("empty pipeline ID") ··· 122 ps, err := db.GetPipelineStatuses( 123 p.db, 124 1, 125 + db.FilterEq("repo_owner", f.Did), 126 + db.FilterEq("repo_name", f.Name), 127 + db.FilterEq("knot", f.Knot), 128 db.FilterEq("id", pipelineId), 129 ) 130 if err != nil { ··· 141 142 p.pages.Workflow(w, pages.WorkflowParams{ 143 LoggedInUser: user, 144 + RepoInfo: f.RepoInfo(user), 145 Pipeline: singlePipeline, 146 Workflow: workflow, 147 }) ··· 172 ctx, cancel := context.WithCancel(r.Context()) 173 defer cancel() 174 175 f, err := p.repoResolver.Resolve(r) 176 if err != nil { 177 l.Error("failed to get repo and knot", "err", err) ··· 179 return 180 } 181 182 pipelineId := chi.URLParam(r, "pipeline") 183 workflow := chi.URLParam(r, "workflow") 184 if pipelineId == "" || workflow == "" { ··· 189 ps, err := db.GetPipelineStatuses( 190 p.db, 191 1, 192 + db.FilterEq("repo_owner", f.Did), 193 + db.FilterEq("repo_name", f.Name), 194 + db.FilterEq("knot", f.Knot), 195 db.FilterEq("id", pipelineId), 196 ) 197 if err != nil || len(ps) != 1 { ··· 201 } 202 203 singlePipeline := ps[0] 204 + spindle := f.Spindle 205 + knot := f.Knot 206 rkey := singlePipeline.Rkey 207 208 if spindle == "" || knot == "" || rkey == "" {
+7 -10
appview/pulls/pulls.go
··· 162 resubmitResult = s.resubmitCheck(r, f, pull, stack) 163 } 164 165 - repoInfo := f.RepoInfo(user) 166 - 167 m := make(map[string]models.Pipeline) 168 169 var shas []string ··· 180 ps, err := db.GetPipelineStatuses( 181 s.db, 182 len(shas), 183 - db.FilterEq("repo_owner", repoInfo.OwnerDid), 184 - db.FilterEq("repo_name", repoInfo.Name), 185 - db.FilterEq("knot", repoInfo.Knot), 186 db.FilterIn("sha", shas), 187 ) 188 if err != nil { ··· 223 224 s.pages.RepoSinglePull(w, pages.RepoSinglePullParams{ 225 LoggedInUser: user, 226 - RepoInfo: repoInfo, 227 Pull: pull, 228 Stack: stack, 229 AbandonedPulls: abandonedPulls, ··· 647 } 648 pulls = pulls[:n] 649 650 - repoInfo := f.RepoInfo(user) 651 ps, err := db.GetPipelineStatuses( 652 s.db, 653 len(shas), 654 - db.FilterEq("repo_owner", repoInfo.OwnerDid), 655 - db.FilterEq("repo_name", repoInfo.Name), 656 - db.FilterEq("knot", repoInfo.Knot), 657 db.FilterIn("sha", shas), 658 ) 659 if err != nil {
··· 162 resubmitResult = s.resubmitCheck(r, f, pull, stack) 163 } 164 165 m := make(map[string]models.Pipeline) 166 167 var shas []string ··· 178 ps, err := db.GetPipelineStatuses( 179 s.db, 180 len(shas), 181 + db.FilterEq("repo_owner", f.Did), 182 + db.FilterEq("repo_name", f.Name), 183 + db.FilterEq("knot", f.Knot), 184 db.FilterIn("sha", shas), 185 ) 186 if err != nil { ··· 221 222 s.pages.RepoSinglePull(w, pages.RepoSinglePullParams{ 223 LoggedInUser: user, 224 + RepoInfo: f.RepoInfo(user), 225 Pull: pull, 226 Stack: stack, 227 AbandonedPulls: abandonedPulls, ··· 645 } 646 pulls = pulls[:n] 647 648 ps, err := db.GetPipelineStatuses( 649 s.db, 650 len(shas), 651 + db.FilterEq("repo_owner", f.Did), 652 + db.FilterEq("repo_name", f.Name), 653 + db.FilterEq("knot", f.Knot), 654 db.FilterIn("sha", shas), 655 ) 656 if err != nil {
+2 -6
appview/repo/compare.go
··· 88 return 89 } 90 91 - repoinfo := f.RepoInfo(user) 92 - 93 rp.pages.RepoCompareNew(w, pages.RepoCompareNewParams{ 94 LoggedInUser: user, 95 - RepoInfo: repoinfo, 96 Branches: branches, 97 Tags: tags.Tags, 98 Base: base, ··· 202 diff = patchutil.AsNiceDiff(formatPatch.FormatPatchRaw, base) 203 } 204 205 - repoinfo := f.RepoInfo(user) 206 - 207 rp.pages.RepoCompare(w, pages.RepoCompareParams{ 208 LoggedInUser: user, 209 - RepoInfo: repoinfo, 210 Branches: branches.Branches, 211 Tags: tags.Tags, 212 Base: base,
··· 88 return 89 } 90 91 rp.pages.RepoCompareNew(w, pages.RepoCompareNewParams{ 92 LoggedInUser: user, 93 + RepoInfo: f.RepoInfo(user), 94 Branches: branches, 95 Tags: tags.Tags, 96 Base: base, ··· 200 diff = patchutil.AsNiceDiff(formatPatch.FormatPatchRaw, base) 201 } 202 203 rp.pages.RepoCompare(w, pages.RepoCompareParams{ 204 LoggedInUser: user, 205 + RepoInfo: f.RepoInfo(user), 206 Branches: branches.Branches, 207 Tags: tags.Tags, 208 Base: base,
+3 -4
appview/repo/index.go
··· 52 } 53 54 user := rp.oauth.GetUser(r) 55 - repoInfo := f.RepoInfo(user) 56 57 // Build index response from multiple XRPC calls 58 result, err := rp.buildIndexResponse(r.Context(), xrpcc, f, ref) ··· 62 rp.pages.RepoIndexPage(w, pages.RepoIndexParams{ 63 LoggedInUser: user, 64 NeedsKnotUpgrade: true, 65 - RepoInfo: repoInfo, 66 }) 67 return 68 } ··· 140 for _, c := range commitsTrunc { 141 shas = append(shas, c.Hash.String()) 142 } 143 - pipelines, err := getPipelineStatuses(rp.db, repoInfo, shas) 144 if err != nil { 145 l.Error("failed to fetch pipeline statuses", "err", err) 146 // non-fatal ··· 148 149 rp.pages.RepoIndexPage(w, pages.RepoIndexParams{ 150 LoggedInUser: user, 151 - RepoInfo: repoInfo, 152 TagMap: tagMap, 153 RepoIndexResponse: *result, 154 CommitsTrunc: commitsTrunc,
··· 52 } 53 54 user := rp.oauth.GetUser(r) 55 56 // Build index response from multiple XRPC calls 57 result, err := rp.buildIndexResponse(r.Context(), xrpcc, f, ref) ··· 61 rp.pages.RepoIndexPage(w, pages.RepoIndexParams{ 62 LoggedInUser: user, 63 NeedsKnotUpgrade: true, 64 + RepoInfo: f.RepoInfo(user), 65 }) 66 return 67 } ··· 139 for _, c := range commitsTrunc { 140 shas = append(shas, c.Hash.String()) 141 } 142 + pipelines, err := getPipelineStatuses(rp.db, &f.Repo, shas) 143 if err != nil { 144 l.Error("failed to fetch pipeline statuses", "err", err) 145 // non-fatal ··· 147 148 rp.pages.RepoIndexPage(w, pages.RepoIndexParams{ 149 LoggedInUser: user, 150 + RepoInfo: f.RepoInfo(user), 151 TagMap: tagMap, 152 RepoIndexResponse: *result, 153 CommitsTrunc: commitsTrunc,
+3 -6
appview/repo/log.go
··· 121 l.Error("failed to GetVerifiedObjectCommits", "err", err) 122 } 123 124 - repoInfo := f.RepoInfo(user) 125 - 126 var shas []string 127 for _, c := range xrpcResp.Commits { 128 shas = append(shas, c.Hash.String()) 129 } 130 - pipelines, err := getPipelineStatuses(rp.db, repoInfo, shas) 131 if err != nil { 132 l.Error("failed to getPipelineStatuses", "err", err) 133 // non-fatal ··· 136 rp.pages.RepoLog(w, pages.RepoLogParams{ 137 LoggedInUser: user, 138 TagMap: tagMap, 139 - RepoInfo: repoInfo, 140 RepoLogResponse: xrpcResp, 141 EmailToDid: emailToDidMap, 142 VerifiedCommits: vc, ··· 200 } 201 202 user := rp.oauth.GetUser(r) 203 - repoInfo := f.RepoInfo(user) 204 - pipelines, err := getPipelineStatuses(rp.db, repoInfo, []string{result.Diff.Commit.This}) 205 if err != nil { 206 l.Error("failed to getPipelineStatuses", "err", err) 207 // non-fatal
··· 121 l.Error("failed to GetVerifiedObjectCommits", "err", err) 122 } 123 124 var shas []string 125 for _, c := range xrpcResp.Commits { 126 shas = append(shas, c.Hash.String()) 127 } 128 + pipelines, err := getPipelineStatuses(rp.db, &f.Repo, shas) 129 if err != nil { 130 l.Error("failed to getPipelineStatuses", "err", err) 131 // non-fatal ··· 134 rp.pages.RepoLog(w, pages.RepoLogParams{ 135 LoggedInUser: user, 136 TagMap: tagMap, 137 + RepoInfo: f.RepoInfo(user), 138 RepoLogResponse: xrpcResp, 139 EmailToDid: emailToDidMap, 140 VerifiedCommits: vc, ··· 198 } 199 200 user := rp.oauth.GetUser(r) 201 + pipelines, err := getPipelineStatuses(rp.db, &f.Repo, []string{result.Diff.Commit.This}) 202 if err != nil { 203 l.Error("failed to getPipelineStatuses", "err", err) 204 // non-fatal
+2 -3
appview/repo/repo.go
··· 959 return 960 } 961 962 - repoInfo := f.RepoInfo(user) 963 - if repoInfo.Source == nil { 964 rp.pages.Notice(w, "repo", "This repository is not a fork.") 965 return 966 } ··· 971 &tangled.RepoForkSync_Input{ 972 Did: user.Did, 973 Name: f.Name, 974 - Source: repoInfo.Source.RepoAt().String(), 975 Branch: ref, 976 }, 977 )
··· 959 return 960 } 961 962 + if f.Source == "" { 963 rp.pages.Notice(w, "repo", "This repository is not a fork.") 964 return 965 } ··· 970 &tangled.RepoForkSync_Input{ 971 Did: user.Did, 972 Name: f.Name, 973 + Source: f.Source, 974 Branch: ref, 975 }, 976 )
+4 -5
appview/repo/repo_util.go
··· 7 8 "tangled.org/core/appview/db" 9 "tangled.org/core/appview/models" 10 - "tangled.org/core/appview/pages/repoinfo" 11 "tangled.org/core/types" 12 13 "github.com/go-git/go-git/v5/plumbing/object" ··· 93 // golang is so blessed that it requires 35 lines of imperative code for this 94 func getPipelineStatuses( 95 d *db.DB, 96 - repoInfo repoinfo.RepoInfo, 97 shas []string, 98 ) (map[string]models.Pipeline, error) { 99 m := make(map[string]models.Pipeline) ··· 105 ps, err := db.GetPipelineStatuses( 106 d, 107 len(shas), 108 - db.FilterEq("repo_owner", repoInfo.OwnerDid), 109 - db.FilterEq("repo_name", repoInfo.Name), 110 - db.FilterEq("knot", repoInfo.Knot), 111 db.FilterIn("sha", shas), 112 ) 113 if err != nil {
··· 7 8 "tangled.org/core/appview/db" 9 "tangled.org/core/appview/models" 10 "tangled.org/core/types" 11 12 "github.com/go-git/go-git/v5/plumbing/object" ··· 92 // golang is so blessed that it requires 35 lines of imperative code for this 93 func getPipelineStatuses( 94 d *db.DB, 95 + repo *models.Repo, 96 shas []string, 97 ) (map[string]models.Pipeline, error) { 98 m := make(map[string]models.Pipeline) ··· 104 ps, err := db.GetPipelineStatuses( 105 d, 106 len(shas), 107 + db.FilterEq("repo_owner", repo.Did), 108 + db.FilterEq("repo_name", repo.Name), 109 + db.FilterEq("knot", repo.Knot), 110 db.FilterIn("sha", shas), 111 ) 112 if err != nil {