add cli override support

This commit is contained in:
Lea Fairbanks 2021-10-31 13:46:25 -06:00
parent 8b4e77918c
commit 6c1887674a
4 changed files with 30 additions and 11 deletions

View file

@ -18,7 +18,7 @@ fn find_version<'a, V: Iterator<Item=&'a str>>(requirement: &str, version_iter:
// Filter for matching versions // Filter for matching versions
let mut filtered: Vec<_> = version_iter.filter(|v| { let mut filtered: Vec<_> = version_iter.filter(|v| {
// Remove leading `v` for git tags // Remove leading `v` for git tags
let ver_str = match v.strip_prefix("s") { let ver_str = match v.strip_prefix('s') {
Some(v) => v, Some(v) => v,
None => v, None => v,
}; };

View file

@ -57,7 +57,7 @@ pub fn extract<S: AsRef<Path>, P: AsRef<Path>>(source: S, fmt: PkgFmt, path: P)
tar.unpack(path)?; tar.unpack(path)?;
}, },
PkgFmt::Tgz => { PkgFmt::Tgz | PkgFmt::TarGz => {
// Extract to install dir // Extract to install dir
debug!("Decompressing from tgz archive '{:?}' to `{:?}`", source.as_ref(), path.as_ref()); debug!("Decompressing from tgz archive '{:?}' to `{:?}`", source.as_ref(), path.as_ref());
@ -129,7 +129,7 @@ pub fn get_install_path<P: AsRef<Path>>(install_path: Option<P>) -> Option<PathB
// Local executable dir if no cargo is found // Local executable dir if no cargo is found
if let Some(d) = dirs::executable_dir() { if let Some(d) = dirs::executable_dir() {
debug!("Fallback to {}", d.display()); debug!("Fallback to {}", d.display());
return Some(d.into()); return Some(d);
} }
None None

View file

@ -14,13 +14,13 @@ pub use drivers::*;
/// Compiled target triple, used as default for binary fetching /// Compiled target triple, used as default for binary fetching
pub const TARGET: &'static str = env!("TARGET"); pub const TARGET: &str = env!("TARGET");
/// Default package path template (may be overridden in package Cargo.toml) /// Default package path template (may be overridden in package Cargo.toml)
pub const DEFAULT_PKG_URL: &'static str = "{ repo }/releases/download/v{ version }/{ name }-{ target }-v{ version }.{ format }"; pub const DEFAULT_PKG_URL: &str = "{ repo }/releases/download/v{ version }/{ name }-{ target }-v{ version }.{ format }";
/// Default binary name template (may be overridden in package Cargo.toml) /// Default binary name template (may be overridden in package Cargo.toml)
pub const DEFAULT_BIN_PATH: &'static str = "{ name }-{ target }-v{ version }/{ bin }{ format }"; pub const DEFAULT_BIN_PATH: &str = "{ name }-{ target }-v{ version }/{ bin }{ format }";
/// Binary format enumeration /// Binary format enumeration
@ -33,6 +33,9 @@ pub enum PkgFmt {
Tar, Tar,
/// Download format is TGZ (TAR + GZip) /// Download format is TGZ (TAR + GZip)
Tgz, Tgz,
/// Download format is TAR.GZ (TAR + GZip)
#[strum(serialize = "tar.gz")]
TarGz,
/// Download format is TAR + XZ /// Download format is TAR + XZ
Txz, Txz,
/// Download format is Zip /// Download format is Zip
@ -159,7 +162,7 @@ impl Context {
let mut tt = TinyTemplate::new(); let mut tt = TinyTemplate::new();
// Add template to instance // Add template to instance
tt.add_template("path", &template)?; tt.add_template("path", template)?;
// Render output // Render output
let rendered = tt.render("path", self)?; let rendered = tt.render("path", self)?;

View file

@ -56,6 +56,18 @@ struct Options {
/// Utility log level /// Utility log level
#[structopt(long, default_value = "info")] #[structopt(long, default_value = "info")]
log_level: LevelFilter, log_level: LevelFilter,
/// Override Cargo.toml package manifest pkg-url.
#[structopt(long)]
pkg_url: Option<String>,
/// Override Cargo.toml package manifest pkg-fmt.
#[structopt(long)]
pkg_fmt: Option<PkgFmt>,
/// Override Cargo.toml package manifest bin-dir.
#[structopt(long)]
bin_dir: Option<String>,
} }
@ -72,6 +84,11 @@ async fn main() -> Result<(), anyhow::Error> {
// Load options // Load options
let opts = Options::from_iter(args.iter()); let opts = Options::from_iter(args.iter());
let cli_overrides = PkgOverride {
pkg_url: opts.pkg_url.clone(),
pkg_fmt: opts.pkg_fmt,
bin_dir: opts.bin_dir.clone(),
};
// Setup logging // Setup logging
let mut log_config = ConfigBuilder::new(); let mut log_config = ConfigBuilder::new();
@ -98,7 +115,7 @@ async fn main() -> Result<(), anyhow::Error> {
let package = manifest.package.unwrap(); let package = manifest.package.unwrap();
let (mut meta, binaries) = ( let (mut meta, binaries) = (
package.metadata.map(|m| m.binstall ).flatten().unwrap_or(PkgMeta::default()), package.metadata.map(|m| m.binstall ).flatten().unwrap_or_default(),
manifest.bin, manifest.bin,
); );
@ -106,8 +123,7 @@ async fn main() -> Result<(), anyhow::Error> {
if let Some(o) = meta.overrides.remove(&opts.target) { if let Some(o) = meta.overrides.remove(&opts.target) {
meta.merge(&o); meta.merge(&o);
} }
meta.merge(&cli_overrides);
debug!("Found metadata: {:?}", meta);
// Generate context for URL interpolation // Generate context for URL interpolation
let ctx = Context { let ctx = Context {
@ -175,7 +191,7 @@ async fn main() -> Result<(), anyhow::Error> {
let _ = temp_dir.into_path(); let _ = temp_dir.into_path();
} }
if binaries.len() == 0 { if binaries.is_empty() {
error!("No binaries specified (or inferred from file system)"); error!("No binaries specified (or inferred from file system)");
return Err(anyhow::anyhow!("No binaries specified (or inferred from file system)")); return Err(anyhow::anyhow!("No binaries specified (or inferred from file system)"));
} }