From 62bfbfcd31fc750fffcf5c9cc80f9e8285e814aa Mon Sep 17 00:00:00 2001 From: Will Date: Sat, 9 May 2026 14:30:28 +0100 Subject: [PATCH] appview/db/repos: calculate the fork count of a repo Signed-off-by: Will --- appview/db/repos.go | 39 +++++++++++++++++++++++++++++++++++++++ appview/models/repo.go | 1 + 2 files changed, 40 insertions(+) diff --git a/appview/db/repos.go b/appview/db/repos.go index 7b0f3ce4..00ba2db7 100644 --- a/appview/db/repos.go +++ b/appview/db/repos.go @@ -301,6 +301,45 @@ func GetReposPaginated(e Execer, page pagination.Page, filters ...orm.Filter) ([ return nil, fmt.Errorf("failed to execute pulls-count query: %w", err) } + // get forks + forksInClause := strings.TrimSuffix(strings.Repeat("?, ", len(repoMap)), ", ") + forkArgs := make([]any, len(repoMap)) + i = 0 + for _, r := range repoMap { + forkArgs[i] = r.RepoDid + i++ + } + + forksCountQuery := fmt.Sprintf( + `select source, count(1) from repos where source in (%s) group by source`, + forksInClause, + ) + + rows, err = e.Query(forksCountQuery, forkArgs...) + if err != nil { + return nil, fmt.Errorf("failed to execute fork-count query: %w", err) + } + defer rows.Close() + + for rows.Next() { + var repodid string + var count int + if err := rows.Scan(&repodid, &count); err != nil { + log.Println("err", "err", err) + continue + } + + for _, r := range repoMap { + if r.RepoDid == repodid { + r.RepoStats.ForkCount = count + break + } + } + } + if err = rows.Err(); err != nil { + return nil, fmt.Errorf("failed to execute fork-count query: %w", err) + } + var repos []models.Repo for _, r := range repoMap { repos = append(repos, *r) diff --git a/appview/models/repo.go b/appview/models/repo.go index 232128fb..7256ab99 100644 --- a/appview/models/repo.go +++ b/appview/models/repo.go @@ -97,6 +97,7 @@ type RepoStats struct { StarCount int IssueCount IssueCount PullCount PullCount + ForkCount int } type IssueCount struct { -- 2.51.2