From c08beba27b7a4a93753a60043aaf21bd87c6a33d Mon Sep 17 00:00:00 2001 From: Rahix Date: Sat, 24 May 2025 21:10:12 +0200 Subject: [PATCH] manager: Implement pagination for issue fetching Forgejo seems to limit requests to 50 issues server side, regardless of the limit we send in our request. This means we have to fetch each page separately regardless. --- techtree-manager/src/collect.rs | 45 ++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/techtree-manager/src/collect.rs b/techtree-manager/src/collect.rs index 8fa3654..c0034ed 100644 --- a/techtree-manager/src/collect.rs +++ b/techtree-manager/src/collect.rs @@ -2,23 +2,34 @@ use anyhow::Context as _; /// Read all issues to generate the full techtree pub async fn collect_tree(ctx: &crate::Context) -> anyhow::Result { - let issues = ctx - .forgejo - .issue_list_issues( - &ctx.owner, - &ctx.repo, - forgejo_api::structs::IssueListIssuesQuery { - // We also want the closed issues - state: Some(forgejo_api::structs::IssueListIssuesQueryState::All), - // No pagination - limit: Some(10000), - // Only issues - r#type: Some(forgejo_api::structs::IssueListIssuesQueryType::Issues), - ..Default::default() - }, - ) - .await - .context("Failed fetching issue list")?; + let mut issues = vec![]; + for page in 1.. { + let new = ctx + .forgejo + .issue_list_issues( + &ctx.owner, + &ctx.repo, + forgejo_api::structs::IssueListIssuesQuery { + // We also want the closed issues + state: Some(forgejo_api::structs::IssueListIssuesQueryState::All), + // We cannot turn off pagination entirely, but let's set the limit as high as + // Forgejo lets us. + limit: Some(10000), + page: Some(page), + // Only issues + r#type: Some(forgejo_api::structs::IssueListIssuesQueryType::Issues), + ..Default::default() + }, + ) + .await + .with_context(|| format!("Failed fetching page {page} of the issue list"))?; + + if new.len() == 0 { + break; + } + + issues.extend(new); + } let mut tree = crate::tree::Tree::new(); let mut issue_numbers = Vec::new();