The forge clamps page_size to 50. branches, pr reviews, the review bodies merged into `comments <pr>`, and view's comment list each sent one request, so anything past the first page was dropped silently. labels::repo_labels did loop, but asked for 100/page and stopped on `len < 100`, so a clamped full page of 50 ended the walk. Add verbs::all_pages: requests 50/page until a short page, capped at 50 pages with a stderr warning when the cap is hit. Use it in all of the above; repo-labels now calls labels::repo_labels instead of its own copy of the loop. list --json now prints the same "N of M shown" stderr trailer as the pretty output; its paging and stdout shape are unchanged. Closes #5051
36 lines
976 B
Rust
36 lines
976 B
Rust
//! `branches [pattern] [repo]` — list branches, optionally filtered.
|
|
|
|
use anyhow::Result;
|
|
use clap::Args as ClapArgs;
|
|
|
|
use crate::client::Client;
|
|
use crate::verbs::{all_pages, refuse_json};
|
|
|
|
#[derive(ClapArgs)]
|
|
pub struct Args {
|
|
/// Substring pattern to filter branch names.
|
|
pattern: Option<String>,
|
|
}
|
|
|
|
pub fn run(client: &Client, args: Args) -> Result<()> {
|
|
refuse_json(client.json_mode(), "branches", "only the plain name list")?;
|
|
let (owner, name) = client.owner_repo()?;
|
|
let branches = all_pages(|page, size| {
|
|
let (_, batch) = client
|
|
.api()
|
|
.repo_list_branches(owner, name)
|
|
.page(page)
|
|
.page_size(size)
|
|
.send()?;
|
|
Ok(batch)
|
|
})?;
|
|
for branch in &branches {
|
|
let Some(n) = branch.name.as_deref() else {
|
|
continue;
|
|
};
|
|
if args.pattern.as_deref().is_none_or(|p| n.contains(p)) {
|
|
println!("{n}");
|
|
}
|
|
}
|
|
Ok(())
|
|
}
|