pull,package_info,ui,cli: report the pull flow via BuildView
Retire the ProgressCallback option-of-closure, the one pre-port reporting idiom left in the tree: pull and package_info::lookup now take &dyn BuildView like every other core flow, and the announcements map onto message (unsized work), progress (item counts: series probes, git objects, extraction) and progress again for byte downloads, which the old callback carried in the same 4-argument shape. The terminal side swaps the (ProgressBar, closure) pair for PullView, a BuildView implementation owning one bar of the shared MultiProgress with the same spinner/transfer style switching; it releases the line on drop, which the CLI triggers explicitly on both outcomes since exit(1) skips destructors. Headless callers (tests, internal lookups) pass &report::Quiet. git clone sideband parsing is skipped entirely when the view is not enabled, matching the old None-callback shortcut.
This commit is contained in:
+43
-59
@@ -4,8 +4,8 @@ use std::error::Error;
|
||||
use std::io::Read;
|
||||
use xz2::read::XzDecoder;
|
||||
|
||||
use crate::ProgressCallback;
|
||||
use crate::apt::release::{self, VerifiedRelease};
|
||||
use crate::report::BuildView;
|
||||
use crossterm::style::Stylize;
|
||||
use log::{debug, warn};
|
||||
|
||||
@@ -490,7 +490,7 @@ async fn find_package(
|
||||
version: Option<&str>,
|
||||
base_url: Option<&str>,
|
||||
launchpad_vcs: Option<String>,
|
||||
progress: ProgressCallback<'_>,
|
||||
view: &dyn BuildView,
|
||||
) -> Result<PackageInfo, Box<dyn Error>> {
|
||||
let series_list = crate::distro_info::get_ordered_series_name(dist).await?;
|
||||
|
||||
@@ -500,9 +500,7 @@ async fn find_package(
|
||||
let mut attempt_errors: Vec<String> = Vec::new();
|
||||
|
||||
for (i, series) in series_list.iter().enumerate() {
|
||||
if let Some(cb) = progress {
|
||||
cb("", &format!("Checking {}...", series), i, series_list.len());
|
||||
}
|
||||
view.progress(&format!("Checking {series}..."), i, series_list.len());
|
||||
|
||||
let pockets = if pocket.is_empty() {
|
||||
crate::distro_info::get_dist_pockets(dist)?
|
||||
@@ -770,16 +768,9 @@ pub async fn lookup_repository(
|
||||
version: Option<&str>,
|
||||
repo_url: &str,
|
||||
series: Option<&str>,
|
||||
progress: ProgressCallback<'_>,
|
||||
view: &dyn BuildView,
|
||||
) -> Result<PackageInfo, Box<dyn Error>> {
|
||||
if let Some(cb) = progress {
|
||||
cb(
|
||||
&format!("Fetching repository info from {}...", repo_url),
|
||||
"",
|
||||
0,
|
||||
0,
|
||||
);
|
||||
}
|
||||
view.message(&format!("Fetching repository info from {repo_url}..."));
|
||||
|
||||
// Attempt to authenticate the repository. In non-strict mode only the
|
||||
// absence of a Release file (or of a way to verify it) is tolerated:
|
||||
@@ -814,14 +805,7 @@ pub async fn lookup_repository(
|
||||
get_flat_repo_series(repo_url).await?
|
||||
};
|
||||
|
||||
if let Some(cb) = progress {
|
||||
cb(
|
||||
&format!("Resolving package info for {}...", package),
|
||||
"",
|
||||
0,
|
||||
0,
|
||||
);
|
||||
}
|
||||
view.message(&format!("Resolving package info for {package}..."));
|
||||
|
||||
let sources = get_flat_repo_sources(repo_url, verified.as_ref()).await?;
|
||||
let stanza = parse_sources(&sources, package, version)?
|
||||
@@ -855,7 +839,7 @@ pub async fn lookup_repository(
|
||||
/// * `dist` - Optional distribution name (e.g., "ubuntu", "debian")
|
||||
/// * `base_url` - Optional base URL for the package archive (e.g., "https://ppa.launchpadcontent.net/user/ppa/ubuntu/")
|
||||
/// * `repository` - Optional URL of an external flat repository suite (e.g., "https://pkg.noctalia.dev/deb/resolute/")
|
||||
/// * `progress` - Optional progress callback
|
||||
/// * `view` - Build view receiving the lookup progress
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub async fn lookup(
|
||||
package: &str,
|
||||
@@ -865,12 +849,12 @@ pub async fn lookup(
|
||||
dist: Option<&str>,
|
||||
base_url: Option<&str>,
|
||||
repository: Option<&str>,
|
||||
progress: ProgressCallback<'_>,
|
||||
view: &dyn BuildView,
|
||||
) -> Result<PackageInfo, Box<dyn Error>> {
|
||||
// External flat repository: the URL is the suite root, distribution
|
||||
// resolution and pocket logic do not apply
|
||||
if let Some(repo_url) = repository {
|
||||
return lookup_repository(package, version, repo_url, series, progress).await;
|
||||
return lookup_repository(package, version, repo_url, series, view).await;
|
||||
}
|
||||
|
||||
// Resolve the distribution early so we can check Launchpad once
|
||||
@@ -887,9 +871,7 @@ pub async fn lookup(
|
||||
// Check Launchpad repository once for Ubuntu packages, rather than
|
||||
// once per series/pocket combination inside get().
|
||||
let launchpad_vcs = if resolved_dist == "ubuntu" && base_url.is_none() {
|
||||
if let Some(cb) = progress {
|
||||
cb("", &format!("Checking Launchpad for {}...", package), 0, 0);
|
||||
}
|
||||
view.message(&format!("Checking Launchpad for {package}..."));
|
||||
match check_launchpad_repo(package).await {
|
||||
Ok(Some(lp_url)) => {
|
||||
debug!("Found Launchpad URL: {}", lp_url);
|
||||
@@ -910,34 +892,20 @@ pub async fn lookup(
|
||||
|
||||
// Obtain the package information, either directly in a series or with a search in all series
|
||||
let package_info = if let Some(s) = series {
|
||||
if let Some(cb) = progress {
|
||||
cb(
|
||||
&format!("Resolving package info for {}...", package),
|
||||
"",
|
||||
0,
|
||||
0,
|
||||
);
|
||||
}
|
||||
view.message(&format!("Resolving package info for {package}..."));
|
||||
|
||||
// Get the package information from that series and pocket
|
||||
get(package, s, pocket, version, base_url, launchpad_vcs).await?
|
||||
} else {
|
||||
if let Some(cb) = progress {
|
||||
cb(
|
||||
&format!(
|
||||
"Searching for package {} in {}...",
|
||||
package,
|
||||
if base_url.is_none() {
|
||||
resolved_dist
|
||||
} else {
|
||||
"ppa"
|
||||
}
|
||||
),
|
||||
"",
|
||||
0,
|
||||
0,
|
||||
);
|
||||
}
|
||||
view.message(&format!(
|
||||
"Searching for package {} in {}...",
|
||||
package,
|
||||
if base_url.is_none() {
|
||||
resolved_dist
|
||||
} else {
|
||||
"ppa"
|
||||
}
|
||||
));
|
||||
|
||||
// Try to find the package in all series from that dist
|
||||
find_package(
|
||||
@@ -947,7 +915,7 @@ pub async fn lookup(
|
||||
version,
|
||||
base_url,
|
||||
launchpad_vcs,
|
||||
progress,
|
||||
view,
|
||||
)
|
||||
.await?
|
||||
};
|
||||
@@ -1142,9 +1110,17 @@ Directory: pool/main/h/hello
|
||||
#[tokio::test]
|
||||
async fn test_find_package_fallback() {
|
||||
// python2.7 is in bullseye but not above
|
||||
let info = find_package("python2.7", "debian", "", None, None, None, None)
|
||||
.await
|
||||
.unwrap();
|
||||
let info = find_package(
|
||||
"python2.7",
|
||||
"debian",
|
||||
"",
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
&crate::report::Quiet,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
assert_eq!(info.stanza.package, "python2.7");
|
||||
assert_eq!(info.series, "bullseye")
|
||||
}
|
||||
@@ -1152,9 +1128,17 @@ Directory: pool/main/h/hello
|
||||
#[tokio::test]
|
||||
async fn test_find_package_devel() {
|
||||
// hello is in sid
|
||||
let info = find_package("hello", "debian", "", None, None, None, None)
|
||||
.await
|
||||
.unwrap();
|
||||
let info = find_package(
|
||||
"hello",
|
||||
"debian",
|
||||
"",
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
&crate::report::Quiet,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
assert_eq!(info.stanza.package, "hello");
|
||||
assert_eq!(info.series, "sid")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user