diff --git a/src/commands.rs b/src/commands.rs index 5f93295a..93ea21fd 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -238,7 +238,8 @@ pub(crate) fn convert_old_theme_file(old_theme_file: PathBuf) { fn attach_with_cli_client(cli_action: zellij_utils::cli::CliAction, session_name: &str) { let os_input = get_os_input(zellij_client::os_input_output::get_cli_client_os_input); - match Action::actions_from_cli(cli_action) { + let get_current_dir = || std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")); + match Action::actions_from_cli(cli_action, Box::new(get_current_dir)) { Ok(actions) => { zellij_client::cli_client::start_cli_client(Box::new(os_input), session_name, actions); std::process::exit(0); diff --git a/zellij-server/src/unit/screen_tests.rs b/zellij-server/src/unit/screen_tests.rs index f0c625dc..0ab4f0fa 100644 --- a/zellij-server/src/unit/screen_tests.rs +++ b/zellij-server/src/unit/screen_tests.rs @@ -107,7 +107,8 @@ fn send_cli_action_to_server( ) { let os_input = Box::new(mock_screen.os_input.clone()); let to_server = mock_screen.to_server.clone(); - let actions = Action::actions_from_cli(cli_action).unwrap(); + let get_current_dir = || PathBuf::from("."); + let actions = Action::actions_from_cli(cli_action, Box::new(get_current_dir)).unwrap(); for action in actions { route_action( action, diff --git a/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_new_tab_action_with_name_and_layout.snap b/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_new_tab_action_with_name_and_layout.snap index 5f676ab7..aac07353 100644 --- a/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_new_tab_action_with_name_and_layout.snap +++ b/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_new_tab_action_with_name_and_layout.snap @@ -1,6 +1,6 @@ --- source: zellij-server/src/./unit/screen_tests.rs -assertion_line: 1989 +assertion_line: 2287 expression: "format!(\"{:#?}\", new_tab_instruction)" --- NewTab( @@ -15,7 +15,11 @@ NewTab( name: None, children: [], split_size: None, - run: None, + run: Some( + Cwd( + ".", + ), + ), borderless: false, focus: None, external_children_index: None, @@ -25,7 +29,11 @@ NewTab( name: None, children: [], split_size: None, - run: None, + run: Some( + Cwd( + ".", + ), + ), borderless: false, focus: None, external_children_index: None, @@ -35,7 +43,11 @@ NewTab( name: None, children: [], split_size: None, - run: None, + run: Some( + Cwd( + ".", + ), + ), borderless: false, focus: None, external_children_index: None, diff --git a/zellij-utils/src/input/actions.rs b/zellij-utils/src/input/actions.rs index e0337da0..e62a6ec6 100644 --- a/zellij-utils/src/input/actions.rs +++ b/zellij-utils/src/input/actions.rs @@ -228,7 +228,10 @@ pub enum Action { } impl Action { - pub fn actions_from_cli(cli_action: CliAction) -> Result, String> { + pub fn actions_from_cli( + cli_action: CliAction, + get_current_dir: Box PathBuf>, + ) -> Result, String> { match cli_action { CliAction::Write { bytes } => Ok(vec![Action::Write(bytes)]), CliAction::WriteChars { chars } => Ok(vec![Action::WriteChars(chars)]), @@ -265,7 +268,10 @@ impl Action { if !command.is_empty() { let mut command = command.clone(); let (command, args) = (PathBuf::from(command.remove(0)), command); - let cwd = cwd.or_else(|| std::env::current_dir().ok()); + let current_dir = get_current_dir(); + let cwd = cwd + .map(|cwd| current_dir.join(cwd)) + .or_else(|| Some(current_dir)); let hold_on_start = start_suspended; let hold_on_close = !close_on_exit; let run_command_action = RunCommandAction { @@ -304,7 +310,10 @@ impl Action { cwd, } => { let mut file = file; - let cwd = cwd.or_else(|| std::env::current_dir().ok()); + let current_dir = get_current_dir(); + let cwd = cwd + .map(|cwd| current_dir.join(cwd)) + .or_else(|| Some(current_dir)); if file.is_relative() { if let Some(cwd) = cwd { file = cwd.join(file); @@ -338,6 +347,10 @@ impl Action { ]), CliAction::UndoRenameTab => Ok(vec![Action::UndoRenameTab]), CliAction::NewTab { name, layout, cwd } => { + let current_dir = get_current_dir(); + let cwd = cwd + .map(|cwd| current_dir.join(cwd)) + .or_else(|| Some(current_dir)); if let Some(layout_path) = layout { let (path_to_raw_layout, raw_layout) = Layout::stringified_from_path_or_default(Some(&layout_path), None)