diff --git a/docs/commands.md b/docs/commands.md index 27060a6..e6d7fa5 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -40,6 +40,7 @@ SUBCOMMANDS: install Install a new Node.js version list List all locally installed Node.js versions [aliases: ls] list-remote List all remote Node.js versions [aliases: ls-remote] + unalias Remove an alias definiton uninstall Uninstall a Node.js version use Change Node.js version ``` @@ -333,6 +334,33 @@ OPTIONS: ``` +# `fnm unalias` + +``` +fnm-unalias 1.26.0 +Remove an alias definiton + +USAGE: + fnm unalias [OPTIONS] + +FLAGS: + -h, --help Prints help information + -V, --version Prints version information + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary [env: FNM_ARCH] + [default: x64] + --fnm-dir The root directory of fnm installations [env: FNM_DIR] + --log-level The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] + --node-dist-mirror + https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + + +ARGS: + +``` + # `fnm uninstall` ``` diff --git a/src/cli.rs b/src/cli.rs index 5095942..1e893d7 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -40,6 +40,10 @@ pub enum SubCommand { #[structopt(name = "alias")] Alias(commands::alias::Alias), + /// Remove an alias definiton + #[structopt(name = "unalias")] + Unalias(commands::unalias::Unalias), + /// Set a version as the default version /// /// This is a shorthand for `fnm alias VERSION default` @@ -81,6 +85,7 @@ impl SubCommand { Self::Current(cmd) => cmd.call(config), Self::Exec(cmd) => cmd.call(config), Self::Uninstall(cmd) => cmd.call(config), + Self::Unalias(cmd) => cmd.call(config), } } } diff --git a/src/commands/mod.rs b/src/commands/mod.rs index f680045..4a13f34 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -8,5 +8,6 @@ pub mod exec; pub mod install; pub mod ls_local; pub mod ls_remote; +pub mod unalias; pub mod uninstall; pub mod r#use; diff --git a/src/commands/unalias.rs b/src/commands/unalias.rs new file mode 100644 index 0000000..d7dedd0 --- /dev/null +++ b/src/commands/unalias.rs @@ -0,0 +1,36 @@ +use super::command::Command; +use crate::config::FnmConfig; +use crate::fs::remove_symlink_dir; +use snafu::{ensure, ResultExt, Snafu}; +use structopt::StructOpt; + +#[derive(StructOpt, Debug)] +pub struct Unalias { + pub(crate) requested_alias: String, +} + +impl Command for Unalias { + type Error = Error; + + fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { + let alias_path = config.aliases_dir().join(&self.requested_alias); + ensure!( + alias_path.exists(), + AliasNotFound { + requested_alias: self.requested_alias + } + ); + + remove_symlink_dir(&alias_path).context(CantDeleteSymlink)?; + + Ok(()) + } +} + +#[derive(Debug, Snafu)] +pub enum Error { + #[snafu(display("Can't delete symlink: {}", source))] + CantDeleteSymlink { source: std::io::Error }, + #[snafu(display("Requested alias {} not found", requested_alias))] + AliasNotFound { requested_alias: String }, +} diff --git a/tests/feature_tests/mod.rs b/tests/feature_tests/mod.rs index a34f46f..daa43ec 100644 --- a/tests/feature_tests/mod.rs +++ b/tests/feature_tests/mod.rs @@ -213,8 +213,28 @@ mod use_alias_install_if_missing { mod use_alias_not_installed { test_shell!(Bash, Zsh, Fish, PowerShell; { EvalFnmEnv::default() - .log_level(Some("error")) - .then(WriteFile::new(".node-version", "lts/*")) - .then(OutputContains::new(IgnoreErrors::new(GetStderr::new(Call::new("fnm", vec!["use"]))), "Requested version lts-latest is not currently installed")) + .log_level(Some("error")) + .then(WriteFile::new(".node-version", "lts/*")) + .then(OutputContains::new(IgnoreErrors::new(GetStderr::new(Call::new("fnm", vec!["use"]))),"Requested version lts-latest is not currently installed")) + }); +} + +mod unalias { + test_shell!(Bash, Zsh, Fish, PowerShell; { + EvalFnmEnv::default() + .then(Call::new("fnm", vec!["install", "11.10.0"])) + .then(Call::new("fnm", vec!["install", "8.11.3"])) + .then(Call::new("fnm", vec!["alias", "8.11.3", "version8"])) + .then(OutputContains::new(Call::new("fnm", vec!["ls"]), "version8")) + .then(Call::new("fnm", vec!["unalias", "version8"])) + .then(OutputContains::new(IgnoreErrors::new(GetStderr::new(Call::new("fnm", vec!["use", "version8"]))), "Requested version version8 is not currently installed")) + }); +} + +mod unalias_error { + test_shell!(Bash, Zsh, Fish, PowerShell; { + EvalFnmEnv::default() + .log_level(Some("error")) + .then(OutputContains::new(IgnoreErrors::new(GetStderr::new(Call::new("fnm", vec!["unalias", "lts"]))), "Requested alias lts not found")) }); } diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Bash.snap new file mode 100644 index 0000000..6a7724a --- /dev/null +++ b/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Bash.snap @@ -0,0 +1,14 @@ +--- +source: tests/feature_tests/mod.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +fnm install 11.10.0 +fnm install 8.11.3 +fnm alias 8.11.3 version8 +fnm ls | grep version8 +fnm unalias version8 +fnm use version8 2>&1 | grep 'Requested version version8 is not currently installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Fish.snap new file mode 100644 index 0000000..d9e72f1 --- /dev/null +++ b/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Fish.snap @@ -0,0 +1,11 @@ +--- +source: tests/feature_tests/mod.rs +expression: "&source.trim()" +--- +fnm env | source +fnm install 11.10.0 +fnm install 8.11.3 +fnm alias 8.11.3 version8 +fnm ls | grep version8 +fnm unalias version8 +fnm use version8 2>&1 | grep 'Requested version version8 is not currently installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias__PowerShell.snap new file mode 100644 index 0000000..d2e2788 --- /dev/null +++ b/tests/feature_tests/snapshots/e2e__feature_tests__unalias__PowerShell.snap @@ -0,0 +1,12 @@ +--- +source: tests/feature_tests/mod.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install 11.10.0 +fnm install 8.11.3 +fnm alias 8.11.3 version8 +$($__out__ = $(fnm ls | Select-String 'version8'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) +fnm unalias version8 +$($__out__ = $($($_tmp_err_action = $ErrorActionPreference;$ErrorActionPreference = "Continue";fnm use version8 2>&1;$ErrorActionPreference = $_tmp_err_action) | Select-String 'Requested version version8 is not currently installed'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Zsh.snap new file mode 100644 index 0000000..6dab76a --- /dev/null +++ b/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Zsh.snap @@ -0,0 +1,12 @@ +--- +source: tests/feature_tests/mod.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +fnm install 11.10.0 +fnm install 8.11.3 +fnm alias 8.11.3 version8 +fnm ls | grep version8 +fnm unalias version8 +fnm use version8 2>&1 | grep 'Requested version version8 is not currently installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Bash.snap new file mode 100644 index 0000000..3e7a132 --- /dev/null +++ b/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Bash.snap @@ -0,0 +1,9 @@ +--- +source: tests/feature_tests/mod.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm --log-level='error' env)" +fnm unalias lts 2>&1 | grep 'Requested alias lts not found' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Fish.snap new file mode 100644 index 0000000..5eb06ec --- /dev/null +++ b/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Fish.snap @@ -0,0 +1,6 @@ +--- +source: tests/feature_tests/mod.rs +expression: "&source.trim()" +--- +fnm --log-level='error' env | source +fnm unalias lts 2>&1 | grep 'Requested alias lts not found' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__PowerShell.snap new file mode 100644 index 0000000..4141c73 --- /dev/null +++ b/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__PowerShell.snap @@ -0,0 +1,7 @@ +--- +source: tests/feature_tests/mod.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm --log-level='error' env | Out-String | Invoke-Expression +$($__out__ = $($($_tmp_err_action = $ErrorActionPreference;$ErrorActionPreference = "Continue";fnm unalias lts 2>&1;$ErrorActionPreference = $_tmp_err_action) | Select-String 'Requested alias lts not found'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Zsh.snap new file mode 100644 index 0000000..53576ba --- /dev/null +++ b/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Zsh.snap @@ -0,0 +1,7 @@ +--- +source: tests/feature_tests/mod.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm --log-level='error' env)" +fnm unalias lts 2>&1 | grep 'Requested alias lts not found'