diff options
author | andy.boot <bootandy@gmail.com> | 2022-08-19 11:54:51 +0100 |
---|---|---|
committer | andy.boot <bootandy@gmail.com> | 2022-08-22 12:05:04 +0100 |
commit | 5980858b3912075f511967f3019a9c4abb5a7c65 (patch) | |
tree | b00a41eed24513dc218f421384ab850b0353ba41 | |
parent | ed6a8d0462f6c09300e0d8d497a1114d0f67eb9f (diff) |
Feature: Config file
Read flags for several params from config file.
This was a popular requested feature (many people want to run with -r on
by default).
-rw-r--r-- | Cargo.lock | 194 | ||||
-rw-r--r-- | Cargo.toml | 3 | ||||
-rw-r--r-- | config/config.toml | 13 | ||||
-rw-r--r-- | src/config.rs | 68 | ||||
-rw-r--r-- | src/main.rs | 26 |
5 files changed, 268 insertions, 36 deletions
@@ -76,9 +76,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "3.2.11" +version = "3.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d646c7ade5eb07c4aa20e907a922750df0c448892513714fd3e4acbc7130829f" +checksum = "29e724a68d9319343bb3328c9cc2dfde263f4b3142ee1059a9980580171c954b" dependencies = [ "atty", "bitflags", @@ -100,10 +100,21 @@ dependencies = [ ] [[package]] +name = "config-file" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df51e72c150781d2c7d4cbcb0b803277caaa80476786994a62961a8f1010dafb" +dependencies = [ + "serde", + "thiserror", + "toml", +] + +[[package]] name = "crossbeam-channel" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c02a4d71819009c192cf4872265391563fd6a84c81ff2c0f2a7026ca4c1d85c" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ "cfg-if", "crossbeam-utils", @@ -111,9 +122,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ "cfg-if", "crossbeam-epoch", @@ -122,9 +133,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07db9d94cbd326813772c968ccd25999e5f8ae22f4f8d1b11effa37ef6ce281d" +checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" dependencies = [ "autocfg", "cfg-if", @@ -136,9 +147,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d82ee10ce34d7bc12c2122495e7593a9c41347ecdd64185af4ecf72cb1a7f83" +checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" dependencies = [ "cfg-if", "once_cell", @@ -151,6 +162,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" [[package]] +name = "directories" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] name = "doc-comment" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -163,9 +194,12 @@ dependencies = [ "ansi_term", "assert_cmd", "clap", + "config-file", + "directories", "lscolors", "rayon", "regex", + "serde", "stfu8", "tempfile", "terminal_size", @@ -176,24 +210,35 @@ dependencies = [ [[package]] name = "either" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] name = "fastrand" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" dependencies = [ "instant", ] [[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] name = "hashbrown" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "607c8a29735385251a339424dd462993c0fed8fa09d378f259377df08c126022" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hermit-abi" @@ -240,9 +285,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.126" +version = "0.2.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" [[package]] name = "lscolors" @@ -280,15 +325,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" +checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" [[package]] name = "os_str_bytes" -version = "6.1.0" +version = "6.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21326818e99cfe6ce1e524c2a805c189a99b5ae555a35d19f9a284b427d86afa" +checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" [[package]] name = "predicates" @@ -318,6 +363,24 @@ dependencies = [ ] [[package]] +name = "proc-macro2" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] name = "rayon" version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -343,14 +406,25 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] [[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall", + "thiserror", +] + +[[package]] name = "regex" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -389,6 +463,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] +name = "serde" +version = "1.0.143" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e8e5d5b70924f74ff5c6d64d9a5acd91422117c60f48c4e07855238a254553" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.143" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d8e8de557aee63c26b85b947f5e59b690d0454c753f3adeb5cd7835ab88391" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] name = "stfu8" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -405,6 +499,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] +name = "syn" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] name = "tempfile" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -450,12 +555,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" [[package]] +name = "thiserror" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] name = "thousands" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" [[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + +[[package]] +name = "unicode-ident" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" + +[[package]] name = "unicode-width" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -471,6 +611,12 @@ dependencies = [ ] [[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -36,6 +36,9 @@ rayon = "1" thousands = "0.2" stfu8 = "0.2" regex = "1" +config-file = "0.2" +serde = { version = "1.0", features = ["derive"] } +directories = "4" [target.'cfg(windows)'.dependencies] winapi-util = "0.1" diff --git a/config/config.toml b/config/config.toml new file mode 100644 index 0000000..f45a1c0 --- /dev/null +++ b/config/config.toml @@ -0,0 +1,13 @@ +# Sample Config file, works with toml and yaml +# Place in either: +# ~/.config/dust/config.toml +# ~/.dust.toml + +reverse=true +display-full-paths=true +display-apparent-size=true +no-colors=true +no-bars=true +skip-total=true +ignore-hidden=true +iso=true diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..25e64bb --- /dev/null +++ b/src/config.rs @@ -0,0 +1,68 @@ +use clap::ArgMatches; +use config_file::FromConfigFile; +use serde::Deserialize; +use std::path::Path; +use std::path::PathBuf; + +#[derive(Deserialize, Default)] +#[serde(rename_all = "kebab-case")] +#[serde(deny_unknown_fields)] +pub struct Config { + pub display_full_paths: Option<bool>, + pub display_apparent_size: Option<bool>, + pub reverse: Option<bool>, + pub no_colors: Option<bool>, + pub no_bars: Option<bool>, + pub skip_total: Option<bool>, + pub ignore_hidden: Option<bool>, + pub iso: Option<bool>, +} + +impl Config { + pub fn get_no_colors(&self, options: &ArgMatches) -> bool { + Some(true) == self.no_colors || options.is_present("no_colors") + } + pub fn get_apparent_size(&self, options: &ArgMatches) -> bool { + Some(true) == self.display_apparent_size || options.is_present("display_apparent_size") + } + pub fn get_ignore_hidden(&self, options: &ArgMatches) -> bool { + Some(true) == self.ignore_hidden || options.is_present("ignore_hidden") + } + pub fn get_full_paths(&self, options: &ArgMatches) -> bool { + Some(true) == self.display_full_paths || options.is_present("display_full_paths") + } + pub fn get_reverse(&self, options: &ArgMatches) -> bool { + Some(true) == self.reverse || options.is_present("reverse") + } + pub fn get_no_bars(&self, options: &ArgMatches) -> bool { + Some(true) == self.no_bars || options.is_present("no_bars") + } + pub fn get_iso(&self, options: &ArgMatches) -> bool { + Some(true) == self.iso || options.is_present("iso") + } + pub fn get_skip_total(&self, options: &ArgMatches) -> bool { + Some(true) == self.skip_total || options.is_present("skip_total") + } +} + +fn get_config_locations(base: &Path) -> Vec<PathBuf> { + vec![ + base.join(".dust.toml"), + base.join(".config").join("dust").join("config.toml"), + ] +} + +pub fn get_config() -> Config { + if let Some(home) = directories::BaseDirs::new() { + for path in get_config_locations(home.home_dir()) { + if path.exists() { + if let Ok(config) = Config::from_config_file(path) { + return config; + } + } + } + } + Config { + ..Default::default() + } +} diff --git a/src/main.rs b/src/main.rs index cb92ebb..afba484 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ use std::process; use self::display::draw_it; use clap::{crate_version, Arg}; use clap::{Command, Values}; +use config::get_config; use dir_walker::{walk_it, WalkData}; use filter::get_biggest; use filter_type::get_all_file_types; @@ -19,6 +20,7 @@ use terminal_size::{terminal_size, Height, Width}; use utils::get_filesystem_devices; use utils::simplify_dir_names; +mod config; mod dir_walker; mod display; mod display_node; @@ -209,15 +211,17 @@ fn main() { .number_of_values(1) .help("Specify width of output overriding the auto detection of terminal width"), ) - .arg(Arg::new("inputs").multiple_occurrences(true).default_value(".")) .arg( Arg::new("iso") .short('H') .long("si") .help("print sizes in powers of 1000 (e.g., 1.1G)") ) + .arg(Arg::new("inputs").multiple_occurrences(true).default_value(".")) .get_matches(); + let config = get_config(); + let target_dirs = options .values_of("inputs") .expect("Should be a default value here") @@ -254,15 +258,14 @@ fn main() { }) .unwrap_or(default_height); - let no_colors = init_color(options.is_present("no_colors")); - let use_apparent_size = options.is_present("display_apparent_size"); + let no_colors = init_color(config.get_no_colors(&options)); + let ignore_directories = options .values_of("ignore_directory") .unwrap_or_default() .map(PathBuf::from); let by_filecount = options.is_present("by_filecount"); - let ignore_hidden = options.is_present("ignore_hidden"); let limit_filesystem = options.is_present("limit_filesystem"); let simplified_dirs = simplify_dir_names(target_dirs); @@ -279,9 +282,9 @@ fn main() { filter_regex: &filter_regexs, invert_filter_regex: &invert_filter_regexs, allowed_filesystems, - use_apparent_size, + use_apparent_size: config.get_apparent_size(&options), by_filecount, - ignore_hidden, + ignore_hidden: config.get_ignore_hidden(&options), }; // Larger stack size to handle cases with lots of nested directories rayon::ThreadPoolBuilder::new() @@ -304,18 +307,17 @@ fn main() { if has_errors { eprintln!("Did not have permissions for all directories"); } - if let Some(root_node) = tree { draw_it( - options.is_present("display_full_paths"), - !options.is_present("reverse"), + config.get_full_paths(&options), + !config.get_reverse(&options), no_colors, - options.is_present("no_bars"), + config.get_no_bars(&options), terminal_width, by_filecount, &root_node, - options.is_present("iso"), - options.is_present("skip_total"), + config.get_iso(&options), + config.get_skip_total(&options), ) } } |