mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-05-19 02:10:03 +00:00
Improve GhCrateMeta
: Detect cases where pkg-fmt is not specified (#757)
* Fix fmt of mod `<GhCrateMeta as Fetcher>::find` * Add new variant `BinstallError::InvalidPkgFmt` * Impl new fn `PkgFmt::guess_pkg_format` * Improve `GhCrateMeta`: Detect cases where `pkg-fmt` is not specified but `pkg-url` also does not contain format, archive-format or archive-suffix which is required for automatically deducing the pkg-fmt. In these cases, we would call `PkgFmt::guess_pkg_format` to try out best to figure out the pkg-fmt, otherwise we just return an error. Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
parent
5c02581569
commit
e510511487
3 changed files with 98 additions and 14 deletions
|
@ -12,7 +12,7 @@ use tracing::{debug, warn};
|
|||
use url::Url;
|
||||
|
||||
use crate::{
|
||||
errors::BinstallError,
|
||||
errors::{BinstallError, InvalidPkgFmtError},
|
||||
helpers::{
|
||||
download::Download,
|
||||
remote::{Client, Method},
|
||||
|
@ -99,7 +99,34 @@ impl super::Fetcher for GhCrateMeta {
|
|||
None
|
||||
};
|
||||
|
||||
let mut pkg_fmt = self.target_data.meta.pkg_fmt;
|
||||
|
||||
let pkg_urls = if let Some(pkg_url) = self.target_data.meta.pkg_url.as_deref() {
|
||||
if pkg_fmt.is_none()
|
||||
&& !(pkg_url.contains("format")
|
||||
|| pkg_url.contains("archive-format")
|
||||
|| pkg_url.contains("archive-suffix"))
|
||||
{
|
||||
// The crate does not specify the pkg-fmt, yet its pkg-url
|
||||
// template doesn't contains format, archive-format or
|
||||
// archive-suffix which is required for automatically
|
||||
// deducing the pkg-fmt.
|
||||
//
|
||||
// We will attempt to guess the pkg-fmt there, but this is
|
||||
// just a best-effort
|
||||
pkg_fmt = PkgFmt::guess_pkg_format(pkg_url);
|
||||
|
||||
if pkg_fmt.is_none() {
|
||||
return Err(InvalidPkgFmtError {
|
||||
crate_name: self.data.name.clone(),
|
||||
version: self.data.version.clone(),
|
||||
target: self.target_data.target.clone(),
|
||||
pkg_url: pkg_url.to_string(),
|
||||
reason: "pkg-fmt is not specified, yet pkg-url does not contain format, archive-format or archive-suffix which is required for automatically deducing pkg-fmt",
|
||||
}
|
||||
.into());
|
||||
}
|
||||
}
|
||||
Either::Left(iter::once(Cow::Borrowed(pkg_url)))
|
||||
} else if let Some(repo) = repo.as_ref() {
|
||||
if let Some(pkg_urls) =
|
||||
|
@ -108,23 +135,23 @@ impl super::Fetcher for GhCrateMeta {
|
|||
Either::Right(pkg_urls.map(Cow::Owned))
|
||||
} else {
|
||||
warn!(
|
||||
concat!(
|
||||
"Unknown repository {}, cargo-binstall cannot provide default pkg_url for it.\n",
|
||||
"Please ask the upstream to provide it for target {}."
|
||||
),
|
||||
repo, self.target_data.target
|
||||
);
|
||||
concat!(
|
||||
"Unknown repository {}, cargo-binstall cannot provide default pkg_url for it.\n",
|
||||
"Please ask the upstream to provide it for target {}."
|
||||
),
|
||||
repo, self.target_data.target
|
||||
);
|
||||
|
||||
return Ok(false);
|
||||
}
|
||||
} else {
|
||||
warn!(
|
||||
concat!(
|
||||
"Package does not specify repository, cargo-binstall cannot provide default pkg_url for it.\n",
|
||||
"Please ask the upstream to provide it for target {}."
|
||||
),
|
||||
self.target_data.target
|
||||
);
|
||||
concat!(
|
||||
"Package does not specify repository, cargo-binstall cannot provide default pkg_url for it.\n",
|
||||
"Please ask the upstream to provide it for target {}."
|
||||
),
|
||||
self.target_data.target
|
||||
);
|
||||
|
||||
return Ok(false);
|
||||
};
|
||||
|
@ -137,7 +164,7 @@ impl super::Fetcher for GhCrateMeta {
|
|||
// launch_baseline_find_tasks which moves `this`
|
||||
let this = &self;
|
||||
|
||||
let pkg_fmts = if let Some(pkg_fmt) = self.target_data.meta.pkg_fmt {
|
||||
let pkg_fmts = if let Some(pkg_fmt) = pkg_fmt {
|
||||
Either::Left(iter::once(pkg_fmt))
|
||||
} else {
|
||||
Either::Right(PkgFmt::iter())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue