diff --git a/src/args.rs b/src/args.rs new file mode 100644 index 00000000..765e11c5 --- /dev/null +++ b/src/args.rs @@ -0,0 +1,100 @@ +use crate::bug_report; +use anyhow::{anyhow, Result}; +use clap::{ + crate_authors, crate_description, crate_name, crate_version, + App as ClapApp, Arg, +}; +use simplelog::{Config, LevelFilter, WriteLogger}; +use std::{ + env, + fs::{self, File}, + path::PathBuf, +}; + +pub struct CliArgs { + pub theme: PathBuf, +} + +pub fn process_cmdline() -> Result { + let app = ClapApp::new(crate_name!()) + .author(crate_authors!()) + .version(crate_version!()) + .about(crate_description!()) + .arg( + Arg::with_name("theme") + .help("Set the color theme (defaults to theme.ron)") + .short("t") + .long("theme") + .value_name("THEME") + .takes_value(true), + ) + .arg( + Arg::with_name("logging") + .help("Stores logging output into a cache directory") + .short("l") + .long("logging"), + ) + .arg( + Arg::with_name("bugreport") + .help("Generate a bug report") + .long("bugreport"), + ) + .arg( + Arg::with_name("directory") + .help("Set the working directory") + .short("d") + .long("directory") + .takes_value(true), + ); + + let arg_matches = app.get_matches(); + if arg_matches.is_present("bugreport") { + bug_report::generate_bugreport()?; + std::process::exit(0); + } + if arg_matches.is_present("logging") { + setup_logging()?; + } + if arg_matches.is_present("directory") { + let directory = + arg_matches.value_of("directory").unwrap_or("."); + env::set_current_dir(directory)?; + } + let arg_theme = + arg_matches.value_of("theme").unwrap_or("theme.ron"); + if get_app_config_path()?.join(arg_theme).is_file() { + Ok(CliArgs { + theme: get_app_config_path()?.join(arg_theme), + }) + } else { + Ok(CliArgs { + theme: get_app_config_path()?.join("theme.ron"), + }) + } +} + +fn setup_logging() -> Result<()> { + let mut path = get_app_config_path()?; + path.push("gitui.log"); + + let _ = WriteLogger::init( + LevelFilter::Trace, + Config::default(), + File::create(path)?, + ); + + Ok(()) +} + +pub fn get_app_config_path() -> Result { + let mut path = if cfg!(target_os = "macos") { + dirs_next::home_dir().map(|h| h.join(".config")) + } else { + dirs_next::config_dir() + } + .ok_or_else(|| anyhow!("failed to find os config dir."))?; + + path.push("gitui"); + fs::create_dir_all(&path)?; + Ok(path) +} diff --git a/src/components/commit.rs b/src/components/commit.rs index 49ff4df7..317f4682 100644 --- a/src/components/commit.rs +++ b/src/components/commit.rs @@ -4,7 +4,7 @@ use super::{ EventState, ExternalEditorComponent, }; use crate::{ - get_app_config_path, + args::get_app_config_path, keys::SharedKeyConfig, queue::{InternalEvent, NeedsUpdate, Queue}, strings, diff --git a/src/keys.rs b/src/keys.rs index 6ee72ea9..c8ba4fa1 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -1,7 +1,6 @@ //TODO: remove once fixed https://github.com/rust-lang/rust-clippy/issues/6818 #![allow(clippy::use_self)] -use crate::get_app_config_path; use anyhow::Result; use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; use ron::{ @@ -16,6 +15,8 @@ use std::{ rc::Rc, }; +use crate::args::get_app_config_path; + pub type SharedKeyConfig = Rc; #[derive(Serialize, Deserialize, Debug)] diff --git a/src/main.rs b/src/main.rs index 1930da3e..048e0370 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,6 +15,7 @@ // #![deny(clippy::expect_used)] mod app; +mod args; mod bug_report; mod clipboard; mod cmdbar; @@ -30,14 +31,10 @@ mod tabs; mod ui; mod version; -use crate::app::App; -use anyhow::{anyhow, bail, Result}; +use crate::{app::App, args::process_cmdline}; +use anyhow::{bail, Result}; use asyncgit::AsyncNotification; use backtrace::Backtrace; -use clap::{ - crate_authors, crate_description, crate_name, crate_version, - App as ClapApp, Arg, -}; use crossbeam_channel::{tick, unbounded, Receiver, Select}; use crossterm::{ terminal::{ @@ -51,15 +48,10 @@ use keys::KeyConfig; use profiler::Profiler; use scopeguard::defer; use scopetime::scope_time; -use simplelog::{Config, LevelFilter, WriteLogger}; use spinner::Spinner; use std::{ - env, fs, - fs::File, io::{self, Write}, - panic, - path::PathBuf, - process, + panic, process, time::{Duration, Instant}, }; use tui::{ @@ -80,10 +72,6 @@ pub enum QueueEvent { InputEvent(InputEvent), } -struct CliArgs { - theme: PathBuf, -} - fn main() -> Result<()> { let cliargs = process_cmdline()?; @@ -259,99 +247,6 @@ fn start_terminal( Ok(terminal) } -fn get_app_cache_path() -> Result { - let mut path = dirs_next::cache_dir() - .ok_or_else(|| anyhow!("failed to find os cache dir."))?; - - path.push("gitui"); - fs::create_dir_all(&path)?; - Ok(path) -} - -fn get_app_config_path() -> Result { - let mut path = if cfg!(target_os = "macos") { - dirs_next::home_dir().map(|h| h.join(".config")) - } else { - dirs_next::config_dir() - } - .ok_or_else(|| anyhow!("failed to find os config dir."))?; - - path.push("gitui"); - fs::create_dir_all(&path)?; - Ok(path) -} - -fn setup_logging() -> Result<()> { - let mut path = get_app_cache_path()?; - path.push("gitui.log"); - - let _ = WriteLogger::init( - LevelFilter::Trace, - Config::default(), - File::create(path)?, - ); - - Ok(()) -} - -fn process_cmdline() -> Result { - let app = ClapApp::new(crate_name!()) - .author(crate_authors!()) - .version(crate_version!()) - .about(crate_description!()) - .arg( - Arg::with_name("theme") - .help("Set the color theme (defaults to theme.ron)") - .short("t") - .long("theme") - .value_name("THEME") - .takes_value(true), - ) - .arg( - Arg::with_name("logging") - .help("Stores logging output into a cache directory") - .short("l") - .long("logging"), - ) - .arg( - Arg::with_name("bugreport") - .help("Generate a bug report") - .long("bugreport"), - ) - .arg( - Arg::with_name("directory") - .help("Set the working directory") - .short("d") - .long("directory") - .takes_value(true), - ); - - let arg_matches = app.get_matches(); - if arg_matches.is_present("bugreport") { - bug_report::generate_bugreport()?; - std::process::exit(0); - } - if arg_matches.is_present("logging") { - setup_logging()?; - } - if arg_matches.is_present("directory") { - let directory = - arg_matches.value_of("directory").unwrap_or("."); - env::set_current_dir(directory)?; - } - let arg_theme = - arg_matches.value_of("theme").unwrap_or("theme.ron"); - if get_app_config_path()?.join(arg_theme).is_file() { - Ok(CliArgs { - theme: get_app_config_path()?.join(arg_theme), - }) - } else { - Ok(CliArgs { - theme: get_app_config_path()?.join("theme.ron"), - }) - } -} - fn set_panic_handlers() -> Result<()> { // regular panic handler panic::set_hook(Box::new(|e| {