![gal@spitfire.co.il](/assets/img/avatar_default.png)
4 changed files with 61 additions and 8 deletions
@ -0,0 +1,47 @@ |
|||||||
|
use std::{fs::create_dir_all, path::PathBuf}; |
||||||
|
|
||||||
|
use log::info; |
||||||
|
use sysinfo::{get_current_pid, ProcessExt, System, SystemExt}; |
||||||
|
|
||||||
|
use crate::config::FnmConfig; |
||||||
|
|
||||||
|
pub fn generate_symlink_token_based_on_pid() -> Result<String, &'static str> { |
||||||
|
let mut system = System::new(); |
||||||
|
let current_pid = get_current_pid()?; |
||||||
|
|
||||||
|
system.refresh_process(current_pid); |
||||||
|
let current_process = system |
||||||
|
.process(current_pid) |
||||||
|
.ok_or("Couldn't find the current process in the tree")?; |
||||||
|
|
||||||
|
let parent_pid = current_process |
||||||
|
.parent() |
||||||
|
.ok_or("Couldn't find the parent pid in the process tree")?; |
||||||
|
|
||||||
|
Ok(format!("pid_{}", parent_pid)) |
||||||
|
} |
||||||
|
|
||||||
|
pub(crate) trait DefaultMultishellPathExt { |
||||||
|
fn multishell_path_or_default(&self) -> Result<PathBuf, Box<dyn std::error::Error>>; |
||||||
|
} |
||||||
|
|
||||||
|
impl DefaultMultishellPathExt for FnmConfig { |
||||||
|
fn multishell_path_or_default(&self) -> Result<PathBuf, Box<dyn std::error::Error>> { |
||||||
|
if let Some(given_path) = self.multishell_path() { |
||||||
|
return Ok(given_path.to_path_buf()); |
||||||
|
} |
||||||
|
|
||||||
|
let symlink_token = generate_symlink_token_based_on_pid()?; |
||||||
|
let multishells_path = std::env::temp_dir().join("fnm_multishells"); |
||||||
|
let new_path = multishells_path.join(symlink_token); |
||||||
|
|
||||||
|
info!( |
||||||
|
"No multishell path given, generating a new one at {}", |
||||||
|
new_path.display() |
||||||
|
); |
||||||
|
|
||||||
|
create_dir_all(&multishells_path)?; |
||||||
|
|
||||||
|
Ok(new_path) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue