fix: handle path to shell in starship init (#106)

Add support for paths to init function

This adds support for qualified paths (e.g. using
`/usr/local/bin/zsh` instead of `zsh`) to init.rs.

The function now converts the shell name into an
OsStr, then to a Path, then gets the file stem,
and unwraps back into a str. While this process can
fail (yielding a None), it's highly unlikely to unless
the user has messed with their shells or there's an
issue in Starship--therefore, the failure message in
this case simply asks the user to file a bug report.
This commit is contained in:
Kevin Song 2019-07-20 10:45:41 -07:00 committed by Matan Kushner
parent 0f76d46d95
commit aceda0052f
1 changed files with 23 additions and 5 deletions

View File

@ -1,25 +1,43 @@
use std::ffi::OsStr;
use std::path::Path;
pub fn init(shell_name: &str) {
log::debug!("Shell name: {}", shell_name);
let setup_script = match shell_name {
"bash" => {
let shell_basename = Path::new(shell_name).file_stem().and_then(OsStr::to_str);
let setup_script = match shell_basename {
Some("bash") => {
let script = "PS1=\"$(starship prompt --status=$?)\"";
Some(script)
}
"zsh" => {
Some("zsh") => {
let script = "PROMPT=\"$(starship prompt --status=$?)\"";
Some(script)
}
"fish" => {
Some("fish") => {
let script = "function fish_prompt; starship prompt --status=$status; end";
Some(script)
}
None => {
println!(
"Invalid shell name provided: {}\\n\
If this issue persists, please open an \
issue in the starship repo: \\n\
https://github.com/starship/starship/issues/new\\n\"",
shell_name
);
None
}
_ => {
/* Calling unwrap() here is fine because the None case will have
already matched on the previous arm */
println!(
"printf \"\\n{0} is not yet supported by starship.\\n\
For the time being, we support bash, zsh, and fish.\\n\
Please open an issue in the starship repo if you would like to \
see support for {0}:\\nhttps://github.com/starship/starship/issues/new\"\\n\\n",
shell_name
shell_basename.unwrap()
);
None
}