use std::collections::HashMap;
use failure::err_msg;
use fapt::commands;
use fapt::rfc822::RfcMapExt;
use fapt::system::System;
fn main() -> Result<(), failure::Error> {
let mut fapt = System::cache_only()?;
commands::add_sources_entries_from_str(
&mut fapt,
"deb-src http://deb.debian.org/debian sid main contrib",
)
.expect("parsing static data");
commands::add_builtin_keys(&mut fapt);
fapt.update()?;
let mut package_version_files = HashMap::with_capacity(1024);
for list in fapt.listings()? {
for section in fapt.open_listing(&list)? {
let section = section?;
let map = section.as_map()?;
let files_section = map
.get("Files")
.ok_or_else(|| err_msg("no file in package"))?;
let pkg = map.get_value("Package").one_line_req()?;
let version = map.get_value("Version").one_line_req()?;
let dir = map.get_value("Directory").one_line_req()?;
let mut urls = Vec::with_capacity(4);
for line in files_section {
let file_name = line.split(' ').nth(2).unwrap();
if file_name.ends_with(".dsc") || file_name.ends_with(".asc") {
continue;
}
urls.push(format!("{}/{}", dir, file_name));
}
assert!(package_version_files
.entry(pkg.to_string())
.or_insert_with(HashMap::new)
.insert(version.to_string(), urls)
.is_none());
}
}
for (package, version_files) in package_version_files {
let best = version_files
.keys()
.into_iter()
.max_by(|left, right| deb_version::compare_versions(left, right))
.unwrap();
for file in &version_files[best] {
println!("{} {} {}", package, best, file);
}
}
Ok(())
}