diff --git a/shelltests/installs.test b/shelltests/installs.test index 2943634..5f6bf5e 100644 --- a/shelltests/installs.test +++ b/shelltests/installs.test @@ -34,3 +34,7 @@ target/debug/beamup install -f gleam v1.4.1 target/debug/beamup install elixir latest >>>2 /Error: No default Erlang installation found. Install an Erlang version, like `beamup install erlang latest` or set a default with `beamup default erlang ` first./ >>>=1 + +# found a bug in update-links and that it wasn't run in tests so adding +target/debug/beamup update-links +>>>=0 \ No newline at end of file diff --git a/src/cmd/component_install.rs b/src/cmd/component_install.rs index c357407..7ce00fb 100644 --- a/src/cmd/component_install.rs +++ b/src/cmd/component_install.rs @@ -12,7 +12,6 @@ use zip; pub fn run( c: &components::Component, release: &String, - _id: &str, force: bool, ) -> Result { utils::check_release_dir(&c.release_dir, force)?; diff --git a/src/cmd/install.rs b/src/cmd/install.rs index df93cad..462331b 100644 --- a/src/cmd/install.rs +++ b/src/cmd/install.rs @@ -1,4 +1,3 @@ -//use crate::config; use crate::github; use crate::languages; use crate::utils; @@ -16,8 +15,6 @@ use std::process::ExitStatus; pub fn run( language: &languages::LanguageStruct, release: &str, - _id: &str, - _repo: &Option, force: bool, ) -> Result { let release_dir = &language.release_dir; diff --git a/src/cmd/update_links.rs b/src/cmd/update_links.rs index f4a74db..405d376 100644 --- a/src/cmd/update_links.rs +++ b/src/cmd/update_links.rs @@ -1,20 +1,25 @@ use crate::config; use crate::languages; use crate::links; +use crate::components; use color_eyre::eyre::Result; -pub fn run(maybe_language: Option<&languages::Language>) -> Result<()> { +pub fn run(maybe_language: Option<&languages::Language>, config: &config::Config) -> Result<()> { let bin_dir = config::bin_dir(); let _ = std::fs::create_dir_all(&bin_dir); + let b = languages::bins(config); - let bins: Vec<_> = if let Some(language) = maybe_language { - languages::BIN_MAP + if let Some(language) = maybe_language { + let bins = b .iter() - .filter_map(|(a, b)| if *b == *language { Some(a) } else { None }) - .collect() + .filter_map(|(a, b)| if *b == *language { Some(a) } else { None }); + links::update(bins, &bin_dir) } else { - languages::BIN_MAP.iter().map(|(a, _)| a).collect() - }; + let bins = b.iter().map(|(a, _)| a); + links::update(bins, &bin_dir)?; - links::update(bins.into_iter(), &bin_dir) + // also update component links + let bins = components::bins().into_iter().map(|(a, _)| a); + links::update(bins, &bin_dir) + } } diff --git a/src/config.rs b/src/config.rs index 49af6f0..6465a0e 100644 --- a/src/config.rs +++ b/src/config.rs @@ -118,7 +118,7 @@ fn get_local_id(language_str: String, local_config: &Option) -> Opt } pub fn get_otp_major_vsn() -> Result { - let dir = match install_to_use("erl") { + let dir = match install_to_use_by_language(languages::Language::Erlang) { Ok(dir) => Ok(dir), Err(_) => Err(eyre!("No default Erlang installation found. Install an Erlang version, like `beamup install erlang latest` or set a default with `beamup default erlang ` first.")), }?; @@ -169,10 +169,16 @@ pub fn component_install_to_use(kind: &components::Kind) -> Result { lookup_component_install_by_id(id, Some(component_config)) } -pub fn install_to_use(bin: &str) -> Result { - let language = languages::bin_to_language(bin)?; + +pub fn install_to_use_by_bin(bin: &str) -> Result { let (_, config) = home_config()?; - let language_config = get_language_config(language, &config); + let language = languages::bin_to_language(bin.to_string(), &config)?; + install_to_use_by_language(language) +} + +fn install_to_use_by_language(language: languages::Language) -> Result { + let (_, config) = home_config()?; + let language_config = get_language_config(&language, &config); let local_config = local_config(); let language_str = language.to_string(); diff --git a/src/languages.rs b/src/languages.rs index 6514aa4..9d0e3c6 100644 --- a/src/languages.rs +++ b/src/languages.rs @@ -9,65 +9,6 @@ pub mod elixir; pub mod erlang; pub mod gleam; -#[cfg(unix)] -pub const BIN_MAP: &[(&str, languages::Language)] = &[ - // Gleam - ("gleam", languages::Language::Gleam), - // Erlang - ("ct_run", languages::Language::Erlang), - ("dialyzer", languages::Language::Erlang), - ("epmd", languages::Language::Erlang), - ("erl", languages::Language::Erlang), - ("erlc", languages::Language::Erlang), - ("erl_call", languages::Language::Erlang), - ("escript", languages::Language::Erlang), - ("run_erl", languages::Language::Erlang), - ("run_test", languages::Language::Erlang), - ("to_erl", languages::Language::Erlang), - ("typer", languages::Language::Erlang), - // Elixir - ("elixir", languages::Language::Elixir), - ("elixirc", languages::Language::Elixir), - ("iex", languages::Language::Elixir), - ("mix", languages::Language::Elixir), - ("mix", languages::Language::Elixir), -]; - -#[cfg(windows)] -pub const BIN_MAP: &[(&str, languages::Language)] = &[ - // Gleam - ("gleam.exe", languages::Language::Gleam), - // Erlang - ("ct_run.exe", languages::Language::Erlang), - ("dialyzer.exe", languages::Language::Erlang), - ("epmd.exe", languages::Language::Erlang), - ("erl.exe", languages::Language::Erlang), - ("erlc.exe", languages::Language::Erlang), - ("erl_call.exe", languages::Language::Erlang), - ("escript.exe", languages::Language::Erlang), - ("run_erl.exe", languages::Language::Erlang), - ("run_test.exe", languages::Language::Erlang), - ("to_erl.exe", languages::Language::Erlang), - ("typer.exe", languages::Language::Erlang), - ("ct_run", languages::Language::Erlang), - ("dialyzer", languages::Language::Erlang), - ("epmd", languages::Language::Erlang), - ("erl", languages::Language::Erlang), - ("erlc", languages::Language::Erlang), - ("erl_call", languages::Language::Erlang), - ("escript", languages::Language::Erlang), - ("run_erl", languages::Language::Erlang), - ("run_test", languages::Language::Erlang), - ("to_erl", languages::Language::Erlang), - ("typer", languages::Language::Erlang), - // Elixir - ("elixir.bat", languages::Language::Elixir), - ("elixirc.bat", languages::Language::Elixir), - ("iex.bat", languages::Language::Elixir), - ("mix.bat", languages::Language::Elixir), - ("mix.ps1", languages::Language::Elixir), -]; - #[derive(ValueEnum, Debug, Clone, PartialEq, EnumIter)] pub enum Language { Elixir, @@ -91,6 +32,20 @@ impl std::fmt::Display for Language { } } +pub fn bins(_config: &config::Config) -> Vec<(String, Language)> { + let mut bins = vec![]; + let mut elixir_bins = elixir::bins(); + let mut erlang_bins = erlang::bins(); + let mut gleam_bins = gleam::bins(); + + bins.append(&mut elixir_bins); + bins.append(&mut erlang_bins); + bins.append(&mut gleam_bins); + + bins +} + +#[allow(dead_code)] pub struct LanguageStruct { pub language: Language, pub release_dir: PathBuf, @@ -116,9 +71,9 @@ impl LanguageStruct { } } -pub fn bin_to_language(bin: &str) -> Result<&languages::Language> { - match languages::BIN_MAP.iter().find(|&(k, _)| *k == bin) { - Some((_, language)) => Ok(language), +pub fn bin_to_language(bin: String, config: &config::Config) -> Result { + match bins(config).iter().find(|&(k, _)| *k == bin) { + Some((_, language)) => Ok(language.clone()), _ => Err(eyre!("No language to run command {bin} for found")), } } diff --git a/src/languages/elixir.rs b/src/languages/elixir.rs index 0cc25fb..01ab42e 100644 --- a/src/languages/elixir.rs +++ b/src/languages/elixir.rs @@ -11,6 +11,7 @@ pub fn new(release: &str, id: &str, config: &config::Config) -> Result Result Vec<(String, languages::Language)> { +pub fn bins() -> Vec<(String, languages::Language)> { vec![ ("elixir".to_string(), languages::Language::Elixir), ("elixirc".to_string(), languages::Language::Elixir), @@ -29,7 +30,7 @@ fn bins() -> Vec<(String, languages::Language)> { } #[cfg(windows)] -fn bins() -> Vec<(String, languages::Language)> { +pub fn bins() -> Vec<(String, languages::Language)> { vec![ ("elixir.bat".to_string(), languages::Language::Elixir), ("elixirc.bat".to_string(), languages::Language::Elixir), diff --git a/src/languages/erlang.rs b/src/languages/erlang.rs index 0d0f880..302eadb 100644 --- a/src/languages/erlang.rs +++ b/src/languages/erlang.rs @@ -19,7 +19,7 @@ pub fn new(release: &str, id: &str, config: &config::Config) -> Result Vec<(String, languages::Language)> { +pub fn bins() -> Vec<(String, languages::Language)> { vec![ ("ct_run".to_string(), languages::Language::Erlang), ("dialyzer".to_string(), languages::Language::Erlang), @@ -36,7 +36,7 @@ fn bins() -> Vec<(String, languages::Language)> { } #[cfg(windows)] -fn bins() -> Vec<(String, languages::Language)> { +pub fn bins() -> Vec<(String, languages::Language)> { vec![ ("ct_run.exe".to_string(), languages::Language::Erlang), ("dialyzer.exe".to_string(), languages::Language::Erlang), diff --git a/src/languages/gleam.rs b/src/languages/gleam.rs index 8239421..e19808c 100644 --- a/src/languages/gleam.rs +++ b/src/languages/gleam.rs @@ -19,14 +19,14 @@ pub fn new(release: &str, id: &str, config: &config::Config) -> Result Vec<(String, languages::Language)> { +pub fn bins() -> Vec<(String, languages::Language)> { vec![ ("gleam".to_string(), languages::Language::Gleam), ] } #[cfg(windows)] -fn bins() -> Vec<(String, languages::Language)> { +pub fn bins() -> Vec<(String, languages::Language)> { vec![ ("gleam.exe".to_string(), languages::Language::Gleam), ("gleam".to_string(), languages::Language::Gleam), diff --git a/src/main.rs b/src/main.rs index ec4595f..25fc161 100644 --- a/src/main.rs +++ b/src/main.rs @@ -283,6 +283,7 @@ fn print_completions(gen: G, cmd: &mut Command) { } fn handle_command(_bin_path: PathBuf) -> Result<(), Report> { + let cli = Cli::parse(); let (config_file, config) = match &cli.config { @@ -347,8 +348,8 @@ fn handle_command(_bin_path: PathBuf) -> Result<(), Report> { let language_struct = languages::LanguageStruct::new(language, release, id, &config)?; - let dir = cmd::install::run(&language_struct, release, id, repo, *force)?; - cmd::update_links::run(Some(language))?; + let dir = cmd::install::run(&language_struct, release, *force)?; + cmd::update_links::run(Some(language), &config)?; config::add_install(language, id, release, dir, config_file, config)?; @@ -362,7 +363,7 @@ fn handle_command(_bin_path: PathBuf) -> Result<(), Report> { SubCommands::UpdateLinks => { debug!("running update-links"); - cmd::update_links::run(None)?; + cmd::update_links::run(None, &config)?; info!("Updated links of language binaries to current beamup install"); @@ -427,7 +428,7 @@ fn handle_command(_bin_path: PathBuf) -> Result<(), Report> { info!("Building {:?} for ref={} id={}", language, git_ref, id); let dir = cmd::build::run(&language_struct, &git_ref, &id, repo, *force, &config)?; - cmd::update_links::run(Some(language))?; + cmd::update_links::run(Some(language), &config)?; config::add_install( language, @@ -465,7 +466,7 @@ fn handle_command(_bin_path: PathBuf) -> Result<(), Report> { let c = components::Component::new(component.clone(), release)?; - let release_dir = cmd::component_install::run(&c, release, id, *force)?; + let release_dir = cmd::component_install::run(&c, release, *force)?; let bin_dir = config::bin_dir(); let _ = std::fs::create_dir_all(&bin_dir); @@ -566,7 +567,8 @@ fn main() -> Result<(), Report> { } } } else { - match languages::BIN_MAP.iter().find(|&(k, _)| *k == f) { + let (_, config) = config::home_config()?; + match languages::bins(&config).iter().find(|&(k, _)| *k == f.to_str().unwrap()) { Some((c, _)) => { let bin = Path::new(c).file_name().unwrap(); run::run(bin.to_str().unwrap(), args) diff --git a/src/run.rs b/src/run.rs index 4e1ed3a..f270d92 100644 --- a/src/run.rs +++ b/src/run.rs @@ -28,7 +28,7 @@ pub fn run_component(bin: &str, kind: &components::Kind, args: Args) -> Result<( pub fn run(bin: &str, args: Args) -> Result<()> { // no -c argument available in this case - let dir = config::install_to_use(bin)?; + let dir = config::install_to_use_by_bin(bin)?; let cmd = Path::new(bin); debug!("running language command {:?}", cmd);