forked from extern/nushell
Flag to clear history file (#2720)
This commit is contained in:
parent
0ee054b14d
commit
0113661c81
@ -323,6 +323,7 @@ pub async fn run_vec_of_pipelines(
|
|||||||
#[cfg(feature = "rustyline-support")]
|
#[cfg(feature = "rustyline-support")]
|
||||||
fn convert_rustyline_result_to_string(input: Result<String, ReadlineError>) -> LineResult {
|
fn convert_rustyline_result_to_string(input: Result<String, ReadlineError>) -> LineResult {
|
||||||
match input {
|
match input {
|
||||||
|
Ok(s) if s == "history -c" || s == "history --clear" => LineResult::ClearHistory,
|
||||||
Ok(s) => LineResult::Success(s),
|
Ok(s) => LineResult::Success(s),
|
||||||
Err(ReadlineError::Interrupted) => LineResult::CtrlC,
|
Err(ReadlineError::Interrupted) => LineResult::CtrlC,
|
||||||
Err(ReadlineError::Eof) => LineResult::CtrlD,
|
Err(ReadlineError::Eof) => LineResult::CtrlD,
|
||||||
@ -499,6 +500,11 @@ pub async fn cli(mut context: EvaluationContext) -> Result<(), Box<dyn Error>> {
|
|||||||
context.maybe_print_errors(Text::from(line));
|
context.maybe_print_errors(Text::from(line));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LineResult::ClearHistory => {
|
||||||
|
rl.clear_history();
|
||||||
|
let _ = rl.save_history(&history_path);
|
||||||
|
}
|
||||||
|
|
||||||
LineResult::Error(line, err) => {
|
LineResult::Error(line, err) => {
|
||||||
rl.add_history_entry(&line);
|
rl.add_history_entry(&line);
|
||||||
let _ = rl.save_history(&history_path);
|
let _ = rl.save_history(&history_path);
|
||||||
@ -848,6 +854,7 @@ pub enum LineResult {
|
|||||||
Break,
|
Break,
|
||||||
CtrlC,
|
CtrlC,
|
||||||
CtrlD,
|
CtrlD,
|
||||||
|
ClearHistory,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn parse_and_eval(line: &str, ctx: &mut EvaluationContext) -> Result<String, ShellError> {
|
pub async fn parse_and_eval(line: &str, ctx: &mut EvaluationContext) -> Result<String, ShellError> {
|
||||||
|
@ -27,6 +27,11 @@ pub fn history_path(config: &dyn Conf) -> PathBuf {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
struct Arguments {
|
||||||
|
clear: Option<bool>,
|
||||||
|
}
|
||||||
|
|
||||||
pub struct History;
|
pub struct History;
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
@ -36,7 +41,7 @@ impl WholeStreamCommand for History {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn signature(&self) -> Signature {
|
fn signature(&self) -> Signature {
|
||||||
Signature::build("history")
|
Signature::build("history").switch("clear", "Clears out the history entries", Some('c'))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn usage(&self) -> &str {
|
fn usage(&self) -> &str {
|
||||||
@ -48,18 +53,30 @@ impl WholeStreamCommand for History {
|
|||||||
args: CommandArgs,
|
args: CommandArgs,
|
||||||
registry: &CommandRegistry,
|
registry: &CommandRegistry,
|
||||||
) -> Result<OutputStream, ShellError> {
|
) -> Result<OutputStream, ShellError> {
|
||||||
history(args, registry)
|
history(args, registry).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn history(args: CommandArgs, _registry: &CommandRegistry) -> Result<OutputStream, ShellError> {
|
async fn history(
|
||||||
|
args: CommandArgs,
|
||||||
|
_registry: &CommandRegistry,
|
||||||
|
) -> Result<OutputStream, ShellError> {
|
||||||
let config: Box<dyn Conf> = Box::new(NuConfig::new());
|
let config: Box<dyn Conf> = Box::new(NuConfig::new());
|
||||||
let tag = args.call_info.name_tag;
|
let tag = args.call_info.name_tag.clone();
|
||||||
|
let (Arguments { clear }, _) = args.process(&_registry).await?;
|
||||||
|
|
||||||
let path = history_path(&config);
|
let path = history_path(&config);
|
||||||
let file = File::open(path);
|
|
||||||
if let Ok(file) = file {
|
match clear {
|
||||||
|
Some(_) => {
|
||||||
|
// This is a NOOP, the logic to clear is handled in cli.rs
|
||||||
|
Ok(OutputStream::empty())
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
if let Ok(file) = File::open(path) {
|
||||||
let reader = BufReader::new(file);
|
let reader = BufReader::new(file);
|
||||||
let output = reader.lines().filter_map(move |line| match line {
|
// Skips the first line, which is a Rustyline internal
|
||||||
|
let output = reader.lines().skip(1).filter_map(move |line| match line {
|
||||||
Ok(line) => Some(ReturnSuccess::value(
|
Ok(line) => Some(ReturnSuccess::value(
|
||||||
UntaggedValue::string(line).into_value(tag.clone()),
|
UntaggedValue::string(line).into_value(tag.clone()),
|
||||||
)),
|
)),
|
||||||
@ -75,6 +92,8 @@ fn history(args: CommandArgs, _registry: &CommandRegistry) -> Result<OutputStrea
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
Loading…
Reference in New Issue
Block a user