Skip to content

Commit

Permalink
refactor(cli): Rename "container unpack" command to "package unpack"
Browse files Browse the repository at this point in the history
More sensible naming.
The old command is kept for now , returning an error message that it was
renamed.
  • Loading branch information
theduke committed Aug 8, 2024
1 parent dc8d5f7 commit eb91270
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 112 deletions.
115 changes: 3 additions & 112 deletions lib/cli/src/commands/container/unpack.rs
Original file line number Diff line number Diff line change
@@ -1,118 +1,9 @@
use std::path::PathBuf;

use anyhow::Context;
use dialoguer::console::{style, Emoji};
use indicatif::ProgressBar;

/// Extract contents of a container to a directory.
/// RENAMED: the 'container unpack' command has been renamed to 'package unpack'!
#[derive(clap::Parser, Debug)]
pub struct PackageUnpack {
/// The output directory.
#[clap(short = 'o', long)]
out_dir: PathBuf,

/// Overwrite existing directories/files.
#[clap(long)]
overwrite: bool,

/// Run the unpack command without any output
#[clap(long)]
pub quiet: bool,

/// Path to the package.
package_path: PathBuf,
}

static PACKAGE_EMOJI: Emoji<'_, '_> = Emoji("📦 ", "");
static EXTRACTED_TO_EMOJI: Emoji<'_, '_> = Emoji("📂 ", "");
pub struct PackageUnpack {}

impl PackageUnpack {
pub(crate) fn execute(&self) -> Result<(), anyhow::Error> {
// Setup the progress bar
let pb = if self.quiet {
ProgressBar::hidden()
} else {
ProgressBar::new_spinner()
};

pb.println(format!(
"{} {}Unpacking...",
style("[1/2]").bold().dim(),
PACKAGE_EMOJI
));

let pkg = webc::compat::Container::from_disk(&self.package_path).with_context(|| {
format!(
"could not open package at '{}'",
self.package_path.display()
)
})?;

let outdir = &self.out_dir;
std::fs::create_dir_all(outdir)
.with_context(|| format!("could not create output directory '{}'", outdir.display()))?;

pkg.unpack(outdir, self.overwrite)
.with_context(|| "could not extract package".to_string())?;

pb.println(format!(
"{} {}Extracted package contents to '{}'",
style("[2/2]").bold().dim(),
EXTRACTED_TO_EMOJI,
self.out_dir.display()
));

pb.finish();

Ok(())
}
}

#[cfg(test)]
mod tests {
use super::*;

/// Download a package from the dev registry.
#[test]
fn test_cmd_package_extract() {
let dir = tempfile::tempdir().unwrap();

let package_path = std::env::var("CARGO_MANIFEST_DIR").map(PathBuf::from).unwrap()
.parent().unwrap()
.parent().unwrap()
.join("tests/integration/cli/tests/webc/hello-0.1.0-665d2ddc-80e6-4845-85d3-4587b1693bb7.webc");

assert!(package_path.is_file());

let cmd = PackageUnpack {
out_dir: dir.path().to_owned(),
overwrite: false,
package_path,
quiet: true,
};

cmd.execute().unwrap();

let mut items = std::fs::read_dir(dir.path())
.unwrap()
.map(|x| {
x.unwrap()
.path()
.file_name()
.unwrap()
.to_str()
.unwrap()
.to_string()
})
.collect::<Vec<_>>();
items.sort();
assert_eq!(
items,
vec![
"atom".to_string(),
"manifest.json".to_string(),
"metadata".to_string(),
]
);
anyhow::bail!("This command was renamed: use 'wasmer package unpack instead'");
}
}
1 change: 1 addition & 0 deletions lib/cli/src/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ impl WasmerCmd {
Package::Tag(cmd) => cmd.run(),
Package::Push(cmd) => cmd.run(),
Package::Publish(cmd) => cmd.run().map(|_| ()),
Package::Unpack(cmd) => cmd.execute(),
},
Some(Cmd::Container(cmd)) => match cmd {
crate::commands::Container::Unpack(cmd) => cmd.execute(),
Expand Down
2 changes: 2 additions & 0 deletions lib/cli/src/commands/package/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ mod download;
pub mod publish;
mod push;
mod tag;
mod unpack;

pub use build::PackageBuild;
pub use common::wait::PublishWait;
Expand All @@ -20,4 +21,5 @@ pub enum Package {
Tag(tag::PackageTag),
Push(push::PackagePush),
Publish(publish::PackagePublish),
Unpack(unpack::PackageUnpack),
}
118 changes: 118 additions & 0 deletions lib/cli/src/commands/package/unpack.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
use std::path::PathBuf;

use anyhow::Context;
use dialoguer::console::{style, Emoji};
use indicatif::ProgressBar;

/// Extract contents of a webc image to a directory.
#[derive(clap::Parser, Debug)]
pub struct PackageUnpack {
/// The output directory.
#[clap(short = 'o', long)]
out_dir: PathBuf,

/// Overwrite existing directories/files.
#[clap(long)]
overwrite: bool,

/// Run the unpack command without any output
#[clap(long)]
pub quiet: bool,

/// Path to the package.
package_path: PathBuf,
}

static PACKAGE_EMOJI: Emoji<'_, '_> = Emoji("📦 ", "");
static EXTRACTED_TO_EMOJI: Emoji<'_, '_> = Emoji("📂 ", "");

impl PackageUnpack {
pub(crate) fn execute(&self) -> Result<(), anyhow::Error> {
// Setup the progress bar
let pb = if self.quiet {
ProgressBar::hidden()
} else {
ProgressBar::new_spinner()
};

pb.println(format!(
"{} {}Unpacking...",
style("[1/2]").bold().dim(),
PACKAGE_EMOJI
));

let pkg = webc::compat::Container::from_disk(&self.package_path).with_context(|| {
format!(
"could not open package at '{}'",
self.package_path.display()
)
})?;

let outdir = &self.out_dir;
std::fs::create_dir_all(outdir)
.with_context(|| format!("could not create output directory '{}'", outdir.display()))?;

pkg.unpack(outdir, self.overwrite)
.with_context(|| "could not extract package".to_string())?;

pb.println(format!(
"{} {}Extracted package contents to '{}'",
style("[2/2]").bold().dim(),
EXTRACTED_TO_EMOJI,
self.out_dir.display()
));

pb.finish();

Ok(())
}
}

#[cfg(test)]
mod tests {
use super::*;

/// Download a package from the dev registry.
#[test]
fn test_cmd_package_extract() {
let dir = tempfile::tempdir().unwrap();

let package_path = std::env::var("CARGO_MANIFEST_DIR").map(PathBuf::from).unwrap()
.parent().unwrap()
.parent().unwrap()
.join("tests/integration/cli/tests/webc/hello-0.1.0-665d2ddc-80e6-4845-85d3-4587b1693bb7.webc");

assert!(package_path.is_file());

let cmd = PackageUnpack {
out_dir: dir.path().to_owned(),
overwrite: false,
package_path,
quiet: true,
};

cmd.execute().unwrap();

let mut items = std::fs::read_dir(dir.path())
.unwrap()
.map(|x| {
x.unwrap()
.path()
.file_name()
.unwrap()
.to_str()
.unwrap()
.to_string()
})
.collect::<Vec<_>>();
items.sort();
assert_eq!(
items,
vec![
"atom".to_string(),
"manifest.json".to_string(),
"metadata".to_string(),
]
);
}
}

0 comments on commit eb91270

Please sign in to comment.