From df7a3a48636fb02e01f2933e9f27020ea898df72 Mon Sep 17 00:00:00 2001 From: Pirmin Kalberer Date: Thu, 19 Sep 2019 22:28:48 +0200 Subject: [PATCH 1/2] Store history.txt in user data path --- src/cli.rs | 22 +++++++++++++++++++--- src/data/config.rs | 16 ++++++++++++---- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index fb158b1af..b410fadf0 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -7,6 +7,7 @@ use crate::commands::plugin::JsonRpc; use crate::commands::plugin::{PluginCommand, PluginSink}; use crate::commands::whole_stream_command; use crate::context::Context; +use crate::data::config; use crate::data::Value; pub(crate) use crate::errors::ShellError; use crate::fuzzysearch::{interactive_fuzzy_search, SelectionResult}; @@ -22,6 +23,7 @@ use std::env; use std::error::Error; use std::io::{BufRead, BufReader, Write}; use std::iter::Iterator; +use std::path::PathBuf; use std::sync::atomic::{AtomicBool, Ordering}; #[derive(Debug)] @@ -210,6 +212,20 @@ fn load_plugins(context: &mut Context) -> Result<(), ShellError> { Ok(()) } +struct History; + +impl History { + pub fn path() -> PathBuf { + const FNAME: &str = "history.txt"; + config::user_data() + .map(|mut p| { + p.push(FNAME); + p + }) + .unwrap_or(PathBuf::from(FNAME)) + } +} + pub async fn cli() -> Result<(), Box> { let mut context = Context::basic()?; @@ -302,7 +318,7 @@ pub async fn cli() -> Result<(), Box> { } // we are ok if history does not exist - let _ = rl.load_history("history.txt"); + let _ = rl.load_history(&History::path()); let ctrl_c = Arc::new(AtomicBool::new(false)); let cc = ctrl_c.clone(); @@ -323,7 +339,7 @@ pub async fn cli() -> Result<(), Box> { context.shell_manager.clone(), ))); - let edit_mode = crate::data::config::config(Tag::unknown())? + let edit_mode = config::config(Tag::unknown())? .get("edit_mode") .map(|s| match s.as_string().unwrap().as_ref() { "vi" => EditMode::Vi, @@ -417,7 +433,7 @@ pub async fn cli() -> Result<(), Box> { } // we are ok if we can not save history - let _ = rl.save_history("history.txt"); + let _ = rl.save_history(&History::path()); Ok(()) } diff --git a/src/data/config.rs b/src/data/config.rs index 6b4d1383f..1cb4533d8 100644 --- a/src/data/config.rs +++ b/src/data/config.rs @@ -23,10 +23,7 @@ pub const APP_INFO: AppInfo = AppInfo { }; pub fn config_path() -> Result { - let path = app_root(AppDataType::UserConfig, &APP_INFO) - .map_err(|err| ShellError::string(&format!("Couldn't open config path:\n{}", err)))?; - - Ok(path) + app_path(AppDataType::UserConfig, "config") } pub fn default_path() -> Result { @@ -49,6 +46,17 @@ pub fn default_path_for(file: &Option) -> Result { Ok(filename.clone()) } +pub fn user_data() -> Result { + app_path(AppDataType::UserData, "user data") +} + +pub fn app_path(app_data_type: AppDataType, display: &str) -> Result { + let path = app_root(app_data_type, &APP_INFO) + .map_err(|err| ShellError::string(&format!("Couldn't open {} path:\n{}", display, err)))?; + + Ok(path) +} + pub fn read( tag: impl Into, at: &Option, From 484d8c26ac2715fd522bd6ed03cf1d877901e664 Mon Sep 17 00:00:00 2001 From: Pirmin Kalberer Date: Thu, 19 Sep 2019 22:55:53 +0200 Subject: [PATCH 2/2] Save history when leaving with Ctrl-C --- src/cli.rs | 1 + src/commands/classified.rs | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index b410fadf0..ef809ecc1 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -399,6 +399,7 @@ pub async fn cli() -> Result<(), Box> { LineResult::CtrlC => { if ctrlcbreak { + let _ = rl.save_history(&History::path()); std::process::exit(0); } else { context.with_host(|host| host.stdout("CTRL-C pressed (again to quit)")); diff --git a/src/commands/classified.rs b/src/commands/classified.rs index b04244140..eb51f9c4c 100644 --- a/src/commands/classified.rs +++ b/src/commands/classified.rs @@ -130,7 +130,7 @@ impl InternalCommand { CommandAction::AddSpanSource(uuid, span_source) => { context.add_span_source(uuid, span_source); } - CommandAction::Exit => std::process::exit(0), + CommandAction::Exit => std::process::exit(0), // TODO: save history.txt CommandAction::EnterHelpShell(value) => { match value { Tagged { @@ -170,7 +170,7 @@ impl InternalCommand { CommandAction::LeaveShell => { context.shell_manager.remove_at_current(); if context.shell_manager.is_empty() { - std::process::exit(0); + std::process::exit(0); // TODO: save history.txt } } },