From 953d28ef747ce5766209cc2dc5b049b42588ca05 Mon Sep 17 00:00:00 2001 From: Jonathan Turner Date: Mon, 19 Aug 2019 20:07:55 +1200 Subject: [PATCH] Fix push/pop for shell manager --- src/commands/classified.rs | 24 ++++++++++++++---------- src/shell/shell_manager.rs | 25 ++++++++++++++++++------- tests/command_enter_test.rs | 2 ++ 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/commands/classified.rs b/src/commands/classified.rs index 45262bfee..309af2441 100644 --- a/src/commands/classified.rs +++ b/src/commands/classified.rs @@ -140,19 +140,21 @@ impl InternalCommand { } CommandAction::Exit => std::process::exit(0), CommandAction::EnterValueShell(value) => { - context.shell_manager.push(Box::new(ValueShell::new(value))); + context + .shell_manager + .insert_at_current(Box::new(ValueShell::new(value))); } CommandAction::EnterShell(location) => { let path = std::path::Path::new(&location); if path.is_dir() { // If it's a directory, add a new filesystem shell - context - .shell_manager - .push(Box::new(FilesystemShell::with_location( + context.shell_manager.insert_at_current(Box::new( + FilesystemShell::with_location( location, context.registry().clone(), - )?)); + )?, + )); } else { // If it's a file, attempt to open the file as a value and enter it let cwd = context.shell_manager.path(); @@ -180,11 +182,13 @@ impl InternalCommand { Span::unknown(), )?; - context.shell_manager.push(Box::new(ValueShell::new(value))); + context + .shell_manager + .insert_at_current(Box::new(ValueShell::new(value))); } - value => context - .shell_manager - .push(Box::new(ValueShell::new(value.tagged(contents_tag)))), + value => context.shell_manager.insert_at_current(Box::new( + ValueShell::new(value.tagged(contents_tag)), + )), } } } @@ -195,7 +199,7 @@ impl InternalCommand { context.shell_manager.next(); } CommandAction::LeaveShell => { - context.shell_manager.pop(); + context.shell_manager.remove_at_current(); if context.shell_manager.is_empty() { std::process::exit(0); } diff --git a/src/shell/shell_manager.rs b/src/shell/shell_manager.rs index 18ccd94b9..d8f63ceb0 100644 --- a/src/shell/shell_manager.rs +++ b/src/shell/shell_manager.rs @@ -23,19 +23,30 @@ impl ShellManager { }) } - pub fn push(&mut self, shell: Box) { + pub fn insert_at_current(&mut self, shell: Box) { self.shells.lock().unwrap().push(shell); self.current_shell = self.shells.lock().unwrap().len() - 1; self.set_path(self.path()); } - pub fn pop(&mut self) { - self.shells.lock().unwrap().pop(); - let new_len = self.shells.lock().unwrap().len(); - if new_len > 0 { - self.current_shell = new_len - 1; - self.set_path(self.path()); + pub fn remove_at_current(&mut self) { + { + let mut shells = self.shells.lock().unwrap(); + if shells.len() > 0 { + if self.current_shell == shells.len() - 1 { + shells.pop(); + let new_len = shells.len(); + if new_len > 0 { + self.current_shell = new_len - 1; + } else { + return; + } + } else { + shells.remove(self.current_shell); + } + } } + self.set_path(self.path()); } pub fn is_empty(&self) -> bool { diff --git a/tests/command_enter_test.rs b/tests/command_enter_test.rs index 051d19467..fd11113e3 100644 --- a/tests/command_enter_test.rs +++ b/tests/command_enter_test.rs @@ -45,9 +45,11 @@ fn knows_the_filesystems_entered() { n mv andres.nu ../expected/andres.nu exit + n cd .. rm red_pill --recursive exit + n rm blue_pill --recursive exit "#