This commit is contained in:
@@ -173,11 +173,19 @@ impl GiteaClient {
|
|||||||
.map_err(|error| {
|
.map_err(|error| {
|
||||||
ApiError(format!("cannot reach Gitea while {operation}: {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)?;
|
let page_items: Vec<T> = self.decode(response, operation)?;
|
||||||
if page_items.is_empty() {
|
if page_items.is_empty() {
|
||||||
return Ok(items);
|
return Ok(items);
|
||||||
}
|
}
|
||||||
items.extend(page_items);
|
items.extend(page_items);
|
||||||
|
if total_count.is_some_and(|total| items.len() >= total) {
|
||||||
|
return Ok(items);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Err(ApiError(format!(
|
Err(ApiError(format!(
|
||||||
"Gitea returned too many pages while {operation}; narrow repository data or check server pagination"
|
"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"));
|
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]
|
#[test]
|
||||||
fn sends_global_issue_move_payload() {
|
fn sends_global_issue_move_payload() {
|
||||||
let (base_url, requests) = mock_server(vec![
|
let (base_url, requests) = mock_server(vec![
|
||||||
|
|||||||
Reference in New Issue
Block a user