This commit is contained in:
@@ -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::<usize>().ok());
|
||||
let page_items: Vec<T> = 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![
|
||||
|
||||
Reference in New Issue
Block a user