forked from extern/nushell
Finish adding support for protecting value shells
This commit is contained in:
parent
78ca297e47
commit
303d27d4b6
@ -35,8 +35,6 @@ fn mkdir(
|
|||||||
args: MkdirArgs,
|
args: MkdirArgs,
|
||||||
context: &RunnablePerItemContext,
|
context: &RunnablePerItemContext,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
||||||
println!("shell clone");
|
|
||||||
let shell_manager = context.shell_manager.clone();
|
let shell_manager = context.shell_manager.clone();
|
||||||
println!("mkdir");
|
|
||||||
shell_manager.mkdir(args, context)
|
shell_manager.mkdir(args, context)
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::commands::command::{EvaluatedWholeStreamCommandArgs, RunnablePerItemContext};
|
use crate::commands::command::EvaluatedWholeStreamCommandArgs;
|
||||||
use crate::commands::cp::CopyArgs;
|
use crate::commands::cp::CopyArgs;
|
||||||
use crate::commands::mkdir::MkdirArgs;
|
use crate::commands::mkdir::MkdirArgs;
|
||||||
use crate::commands::mv::MoveArgs;
|
use crate::commands::mv::MoveArgs;
|
||||||
@ -200,12 +200,13 @@ impl Shell for FilesystemShell {
|
|||||||
dst,
|
dst,
|
||||||
recursive,
|
recursive,
|
||||||
}: CopyArgs,
|
}: CopyArgs,
|
||||||
context: &RunnablePerItemContext,
|
name: Span,
|
||||||
|
path: &str,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
||||||
let name_span = context.name;
|
let name_span = name;
|
||||||
|
|
||||||
let mut source = PathBuf::from(context.shell_manager.path());
|
let mut source = PathBuf::from(path);
|
||||||
let mut destination = PathBuf::from(context.shell_manager.path());
|
let mut destination = PathBuf::from(path);
|
||||||
|
|
||||||
source.push(&src.item);
|
source.push(&src.item);
|
||||||
destination.push(&dst.item);
|
destination.push(&dst.item);
|
||||||
@ -476,15 +477,16 @@ impl Shell for FilesystemShell {
|
|||||||
|
|
||||||
fn mkdir(
|
fn mkdir(
|
||||||
&self,
|
&self,
|
||||||
mkdir_args: MkdirArgs,
|
MkdirArgs { rest: directories }: MkdirArgs,
|
||||||
RunnablePerItemContext {
|
// RunnablePerItemContext {
|
||||||
name,
|
// name,
|
||||||
shell_manager,
|
// shell_manager,
|
||||||
..
|
// ..
|
||||||
}: &RunnablePerItemContext,
|
// }: &RunnablePerItemContext,
|
||||||
|
name: Span,
|
||||||
|
path: &str,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
||||||
println!("full path");
|
let full_path = PathBuf::from(path);
|
||||||
let full_path = PathBuf::from(shell_manager.path());
|
|
||||||
|
|
||||||
if directories.len() == 0 {
|
if directories.len() == 0 {
|
||||||
return Err(ShellError::labeled_error(
|
return Err(ShellError::labeled_error(
|
||||||
@ -494,17 +496,13 @@ impl Shell for FilesystemShell {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("dirs");
|
|
||||||
for dir in directories.iter() {
|
for dir in directories.iter() {
|
||||||
println!("create at:");
|
|
||||||
let create_at = {
|
let create_at = {
|
||||||
let mut loc = full_path.clone();
|
let mut loc = full_path.clone();
|
||||||
loc.push(&dir.item);
|
loc.push(&dir.item);
|
||||||
loc
|
loc
|
||||||
};
|
};
|
||||||
|
|
||||||
println!("{:?}", create_at);
|
|
||||||
|
|
||||||
match std::fs::create_dir_all(create_at) {
|
match std::fs::create_dir_all(create_at) {
|
||||||
Err(reason) => {
|
Err(reason) => {
|
||||||
return Err(ShellError::labeled_error(
|
return Err(ShellError::labeled_error(
|
||||||
@ -513,14 +511,9 @@ impl Shell for FilesystemShell {
|
|||||||
dir.span(),
|
dir.span(),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
Ok(_) => {
|
Ok(_) => {}
|
||||||
println!("OK");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
println!("End loop");
|
|
||||||
}
|
|
||||||
|
|
||||||
println!("Done");
|
|
||||||
|
|
||||||
Ok(VecDeque::new())
|
Ok(VecDeque::new())
|
||||||
}
|
}
|
||||||
@ -528,12 +521,13 @@ impl Shell for FilesystemShell {
|
|||||||
fn mv(
|
fn mv(
|
||||||
&self,
|
&self,
|
||||||
MoveArgs { src, dst }: MoveArgs,
|
MoveArgs { src, dst }: MoveArgs,
|
||||||
context: &RunnablePerItemContext,
|
name: Span,
|
||||||
|
path: &str,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
||||||
let name_span = context.name;
|
let name_span = name;
|
||||||
|
|
||||||
let mut source = PathBuf::from(context.shell_manager.path());
|
let mut source = PathBuf::from(path);
|
||||||
let mut destination = PathBuf::from(context.shell_manager.path());
|
let mut destination = PathBuf::from(path);
|
||||||
|
|
||||||
source.push(&src.item);
|
source.push(&src.item);
|
||||||
destination.push(&dst.item);
|
destination.push(&dst.item);
|
||||||
@ -832,11 +826,12 @@ impl Shell for FilesystemShell {
|
|||||||
fn rm(
|
fn rm(
|
||||||
&self,
|
&self,
|
||||||
RemoveArgs { target, recursive }: RemoveArgs,
|
RemoveArgs { target, recursive }: RemoveArgs,
|
||||||
context: &RunnablePerItemContext,
|
name: Span,
|
||||||
|
path: &str,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
||||||
let name_span = context.name;
|
let name_span = name;
|
||||||
|
|
||||||
let mut path = PathBuf::from(context.shell_manager.path());
|
let mut path = PathBuf::from(path);
|
||||||
|
|
||||||
path.push(&target.item);
|
path.push(&target.item);
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::commands::command::{EvaluatedWholeStreamCommandArgs, RunnablePerItemContext};
|
use crate::commands::command::EvaluatedWholeStreamCommandArgs;
|
||||||
use crate::commands::cp::CopyArgs;
|
use crate::commands::cp::CopyArgs;
|
||||||
use crate::commands::mkdir::MkdirArgs;
|
use crate::commands::mkdir::MkdirArgs;
|
||||||
use crate::commands::mv::MoveArgs;
|
use crate::commands::mv::MoveArgs;
|
||||||
@ -15,22 +15,26 @@ pub trait Shell: std::fmt::Debug {
|
|||||||
fn cp(
|
fn cp(
|
||||||
&self,
|
&self,
|
||||||
args: CopyArgs,
|
args: CopyArgs,
|
||||||
context: &RunnablePerItemContext,
|
name: Span,
|
||||||
|
path: &str,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError>;
|
) -> Result<VecDeque<ReturnValue>, ShellError>;
|
||||||
fn mkdir(
|
fn mkdir(
|
||||||
&self,
|
&self,
|
||||||
args: MkdirArgs,
|
args: MkdirArgs,
|
||||||
context: &RunnablePerItemContext,
|
name: Span,
|
||||||
|
path: &str,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError>;
|
) -> Result<VecDeque<ReturnValue>, ShellError>;
|
||||||
fn mv(
|
fn mv(
|
||||||
&self,
|
&self,
|
||||||
args: MoveArgs,
|
args: MoveArgs,
|
||||||
context: &RunnablePerItemContext,
|
name: Span,
|
||||||
|
path: &str,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError>;
|
) -> Result<VecDeque<ReturnValue>, ShellError>;
|
||||||
fn rm(
|
fn rm(
|
||||||
&self,
|
&self,
|
||||||
args: RemoveArgs,
|
args: RemoveArgs,
|
||||||
context: &RunnablePerItemContext,
|
name: Span,
|
||||||
|
path: &str,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError>;
|
) -> Result<VecDeque<ReturnValue>, ShellError>;
|
||||||
fn path(&self) -> String;
|
fn path(&self) -> String;
|
||||||
fn set_path(&mut self, path: String);
|
fn set_path(&mut self, path: String);
|
||||||
|
@ -117,9 +117,19 @@ impl ShellManager {
|
|||||||
args: CopyArgs,
|
args: CopyArgs,
|
||||||
context: &RunnablePerItemContext,
|
context: &RunnablePerItemContext,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
||||||
let env = self.shells.lock().unwrap();
|
let env = self.shells.lock();
|
||||||
|
|
||||||
env[self.current_shell].cp(args, context)
|
match env {
|
||||||
|
Ok(x) => {
|
||||||
|
let path = x[self.current_shell].path();
|
||||||
|
x[self.current_shell].cp(args, context.name, &path)
|
||||||
|
}
|
||||||
|
Err(e) => Err(ShellError::labeled_error(
|
||||||
|
format!("Internal error: could not lock {}", e),
|
||||||
|
"Internal error: could not lock",
|
||||||
|
context.name,
|
||||||
|
)),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn rm(
|
pub fn rm(
|
||||||
@ -127,9 +137,19 @@ impl ShellManager {
|
|||||||
args: RemoveArgs,
|
args: RemoveArgs,
|
||||||
context: &RunnablePerItemContext,
|
context: &RunnablePerItemContext,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
||||||
let env = self.shells.lock().unwrap();
|
let env = self.shells.lock();
|
||||||
|
|
||||||
env[self.current_shell].rm(args, context)
|
match env {
|
||||||
|
Ok(x) => {
|
||||||
|
let path = x[self.current_shell].path();
|
||||||
|
x[self.current_shell].rm(args, context.name, &path)
|
||||||
|
}
|
||||||
|
Err(e) => Err(ShellError::labeled_error(
|
||||||
|
format!("Internal error: could not lock {}", e),
|
||||||
|
"Internal error: could not lock",
|
||||||
|
context.name,
|
||||||
|
)),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn mkdir(
|
pub fn mkdir(
|
||||||
@ -137,9 +157,19 @@ impl ShellManager {
|
|||||||
args: MkdirArgs,
|
args: MkdirArgs,
|
||||||
context: &RunnablePerItemContext,
|
context: &RunnablePerItemContext,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
||||||
let env = self.shells.lock().unwrap();
|
let env = self.shells.lock();
|
||||||
|
|
||||||
env[self.current_shell].mkdir(args, context)
|
match env {
|
||||||
|
Ok(x) => {
|
||||||
|
let path = x[self.current_shell].path();
|
||||||
|
x[self.current_shell].mkdir(args, context.name, &path)
|
||||||
|
}
|
||||||
|
Err(e) => Err(ShellError::labeled_error(
|
||||||
|
format!("Internal error: could not lock {}", e),
|
||||||
|
"Internal error: could not lock",
|
||||||
|
context.name,
|
||||||
|
)),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn mv(
|
pub fn mv(
|
||||||
@ -147,8 +177,18 @@ impl ShellManager {
|
|||||||
args: MoveArgs,
|
args: MoveArgs,
|
||||||
context: &RunnablePerItemContext,
|
context: &RunnablePerItemContext,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
||||||
let env = self.shells.lock().unwrap();
|
let env = self.shells.lock();
|
||||||
|
|
||||||
env[self.current_shell].mv(args, context)
|
match env {
|
||||||
|
Ok(x) => {
|
||||||
|
let path = x[self.current_shell].path();
|
||||||
|
x[self.current_shell].mv(args, context.name, &path)
|
||||||
|
}
|
||||||
|
Err(e) => Err(ShellError::labeled_error(
|
||||||
|
format!("Internal error: could not lock {}", e),
|
||||||
|
"Internal error: could not lock",
|
||||||
|
context.name,
|
||||||
|
)),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::commands::command::{EvaluatedWholeStreamCommandArgs, RunnablePerItemContext};
|
use crate::commands::command::EvaluatedWholeStreamCommandArgs;
|
||||||
use crate::commands::cp::CopyArgs;
|
use crate::commands::cp::CopyArgs;
|
||||||
use crate::commands::mkdir::MkdirArgs;
|
use crate::commands::mkdir::MkdirArgs;
|
||||||
use crate::commands::mv::MoveArgs;
|
use crate::commands::mv::MoveArgs;
|
||||||
@ -106,48 +106,52 @@ impl Shell for ValueShell {
|
|||||||
fn cp(
|
fn cp(
|
||||||
&self,
|
&self,
|
||||||
_args: CopyArgs,
|
_args: CopyArgs,
|
||||||
context: &RunnablePerItemContext,
|
name: Span,
|
||||||
|
_path: &str,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
||||||
Err(ShellError::labeled_error(
|
Err(ShellError::labeled_error(
|
||||||
"cp not currently supported on values",
|
"cp not currently supported on values",
|
||||||
"not currently supported",
|
"not currently supported",
|
||||||
context.name,
|
name,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mv(
|
fn mv(
|
||||||
&self,
|
&self,
|
||||||
_args: MoveArgs,
|
_args: MoveArgs,
|
||||||
context: &RunnablePerItemContext,
|
name: Span,
|
||||||
|
_path: &str,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
||||||
Err(ShellError::labeled_error(
|
Err(ShellError::labeled_error(
|
||||||
"mv not currently supported on values",
|
"mv not currently supported on values",
|
||||||
"not currently supported",
|
"not currently supported",
|
||||||
context.name,
|
name,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mkdir(
|
fn mkdir(
|
||||||
&self,
|
&self,
|
||||||
_args: MkdirArgs,
|
_args: MkdirArgs,
|
||||||
context: &RunnablePerItemContext,
|
name: Span,
|
||||||
|
_path: &str,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
||||||
Err(ShellError::labeled_error(
|
Err(ShellError::labeled_error(
|
||||||
"mkdir not currently supported on values",
|
"mkdir not currently supported on values",
|
||||||
"not currently supported",
|
"not currently supported",
|
||||||
context.name,
|
name,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rm(
|
fn rm(
|
||||||
&self,
|
&self,
|
||||||
_args: RemoveArgs,
|
_args: RemoveArgs,
|
||||||
context: &RunnablePerItemContext,
|
name: Span,
|
||||||
|
_path: &str,
|
||||||
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
) -> Result<VecDeque<ReturnValue>, ShellError> {
|
||||||
Err(ShellError::labeled_error(
|
Err(ShellError::labeled_error(
|
||||||
"rm not currently supported on values",
|
"rm not currently supported on values",
|
||||||
"not currently supported",
|
"not currently supported",
|
||||||
context.name,
|
name,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user