From e215c11b0b9522fc5401672b08520b6f294ee560 Mon Sep 17 00:00:00 2001 From: yukkop Date: Thu, 1 Oct 2026 23:07:54 +0000 Subject: [PATCH] fix: kanban tui --- package/gitea-kanban-tui/src/api.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/package/gitea-kanban-tui/src/api.rs b/package/gitea-kanban-tui/src/api.rs index 2adf14b8..472eb090 100644 --- a/package/gitea-kanban-tui/src/api.rs +++ b/package/gitea-kanban-tui/src/api.rs @@ -173,11 +173,19 @@ impl GiteaClient { .map_err(|error| { ApiError(format!("cannot reach Gitea while {operation}: {error}")) })?; + let total_count = response + .headers() + .get("x-total-count") + .and_then(|value| value.to_str().ok()) + .and_then(|value| value.parse::().ok()); let page_items: Vec = self.decode(response, operation)?; if page_items.is_empty() { return Ok(items); } items.extend(page_items); + if total_count.is_some_and(|total| items.len() >= total) { + return Ok(items); + } } Err(ApiError(format!( "Gitea returned too many pages while {operation}; narrow repository data or check server pagination" @@ -520,6 +528,19 @@ mod tests { assert!(!error.to_string().contains("secret")); } + #[test] + fn stops_pagination_at_reported_total_count() { + let (base_url, requests) = mock_server(vec![ + "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nX-Total-Count: 1\r\nConnection: close\r\n\r\n[{\"id\":4,\"title\":\"Kanban\",\"is_closed\":false}]", + ]); + let client = GiteaClient::new(&config(&base_url)).expect("client"); + let projects = client.list_projects().expect("projects"); + + assert_eq!(projects.len(), 1); + assert!(requests.recv().expect("page one").contains("page=1")); + assert!(requests.try_recv().is_err()); + } + #[test] fn sends_global_issue_move_payload() { let (base_url, requests) = mock_server(vec![