From fef447a659cb069f178ac4fce2ffec9175ae8223 Mon Sep 17 00:00:00 2001 From: Jonathan Turner Date: Mon, 19 Aug 2019 19:29:27 +1200 Subject: [PATCH] Fix shell-ring to rotate as expected --- src/commands/shells.rs | 4 +-- src/parser/deserializer.rs | 2 -- src/prelude.rs | 2 +- src/shell/shell_manager.rs | 53 +++++++++++++++++++------------------- 4 files changed, 28 insertions(+), 33 deletions(-) diff --git a/src/commands/shells.rs b/src/commands/shells.rs index 0c59822965..6caf53a240 100644 --- a/src/commands/shells.rs +++ b/src/commands/shells.rs @@ -6,12 +6,10 @@ pub fn shells(args: CommandArgs, _registry: &CommandRegistry) -> Result>>>, } impl ShellManager { pub fn basic(commands: CommandRegistry) -> Result> { Ok(ShellManager { + current_shell: 0, shells: Arc::new(Mutex::new(vec![Box::new(FilesystemShell::basic( commands, )?)])), @@ -23,11 +25,17 @@ impl ShellManager { pub fn push(&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 is_empty(&self) -> bool { @@ -35,16 +43,11 @@ impl ShellManager { } pub fn path(&self) -> String { - self.shells.lock().unwrap().last().unwrap().path() + self.shells.lock().unwrap()[self.current_shell].path() } pub fn set_path(&mut self, path: String) { - self.shells - .lock() - .unwrap() - .last_mut() - .unwrap() - .set_path(path) + self.shells.lock().unwrap()[self.current_shell].set_path(path) } pub fn complete( @@ -53,37 +56,33 @@ impl ShellManager { pos: usize, ctx: &rustyline::Context<'_>, ) -> Result<(usize, Vec), rustyline::error::ReadlineError> { - self.shells - .lock() - .unwrap() - .last() - .unwrap() - .complete(line, pos, ctx) + self.shells.lock().unwrap()[self.current_shell].complete(line, pos, ctx) } pub fn hint(&self, line: &str, pos: usize, ctx: &rustyline::Context<'_>) -> Option { - self.shells - .lock() - .unwrap() - .last() - .unwrap() - .hint(line, pos, ctx) + self.shells.lock().unwrap()[self.current_shell].hint(line, pos, ctx) } pub fn next(&mut self) { { - let mut x = self.shells.lock().unwrap(); - let shell = x.remove(0); - x.push(shell); + let shell_len = self.shells.lock().unwrap().len(); + if self.current_shell == (shell_len - 1) { + self.current_shell = 0; + } else { + self.current_shell += 1; + } } self.set_path(self.path()); } pub fn prev(&mut self) { { - let mut x = self.shells.lock().unwrap(); - let shell = x.pop().unwrap(); - x.insert(0, shell); + let shell_len = self.shells.lock().unwrap().len(); + if self.current_shell == 0 { + self.current_shell = shell_len - 1; + } else { + self.current_shell -= 1; + } } self.set_path(self.path()); } @@ -91,11 +90,11 @@ impl ShellManager { pub fn ls(&self, args: EvaluatedWholeStreamCommandArgs) -> Result { let env = self.shells.lock().unwrap(); - env.last().unwrap().ls(args) + env[self.current_shell].ls(args) } pub fn cd(&self, args: EvaluatedWholeStreamCommandArgs) -> Result { let env = self.shells.lock().unwrap(); - env.last().unwrap().cd(args) + env[self.current_shell].cd(args) } }