use anyhow::{Context as _, Result};
pub(crate) async fn delete_release_asset_by_name(
octo: &octocrab::Octocrab,
owner: &str,
repo: &str,
release_id: u64,
asset_name: &str,
) -> Result<bool> {
const MAX_PAGES: u32 = 50; let mut page: u32 = 1;
loop {
let route = format!(
"/repos/{}/{}/releases/{}/assets?per_page=100&page={}",
owner, repo, release_id, page
);
let assets: Vec<octocrab::models::repos::Asset> =
octo.get(route, None::<&()>).await.with_context(|| {
format!(
"release: list assets for release {} on {}/{} (page {})",
release_id, owner, repo, page
)
})?;
for asset in &assets {
if asset.name == asset_name {
octo.repos(owner, repo)
.release_assets()
.delete(asset.id.into_inner())
.await
.with_context(|| {
format!(
"release: delete asset '{}' (id={}) from release {} on {}/{}",
asset_name, asset.id, release_id, owner, repo
)
})?;
return Ok(true);
}
}
if assets.len() < 100 {
break;
}
page += 1;
if page > MAX_PAGES {
break;
}
}
Ok(false)
}
pub(crate) async fn find_release_asset_size(
octo: &octocrab::Octocrab,
owner: &str,
repo: &str,
release_id: u64,
asset_name: &str,
) -> Result<Option<u64>> {
const MAX_PAGES: u32 = 50;
let mut page: u32 = 1;
loop {
let route = format!(
"/repos/{}/{}/releases/{}/assets?per_page=100&page={}",
owner, repo, release_id, page
);
let assets: Vec<octocrab::models::repos::Asset> =
octo.get(route, None::<&()>).await.with_context(|| {
format!(
"release: list assets for release {} on {}/{} (page {})",
release_id, owner, repo, page
)
})?;
for asset in &assets {
if asset.name == asset_name {
return Ok(Some(asset.size as u64));
}
}
if assets.len() < 100 {
break;
}
page += 1;
if page > MAX_PAGES {
break;
}
}
Ok(None)
}