summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandy.boot <bootandy@gmail.com>2022-08-19 11:54:51 +0100
committerandy.boot <bootandy@gmail.com>2022-08-22 12:05:04 +0100
commit5980858b3912075f511967f3019a9c4abb5a7c65 (patch)
treeb00a41eed24513dc218f421384ab850b0353ba41
parented6a8d0462f6c09300e0d8d497a1114d0f67eb9f (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.lock194
-rw-r--r--Cargo.toml3
-rw-r--r--config/config.toml13
-rw-r--r--src/config.rs68
-rw-r--r--src/main.rs26
5 files changed, 268 insertions, 36 deletions
diff --git a/Cargo.lock b/Cargo.lock
index c05e8e3..c0d69eb 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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"
diff --git a/Cargo.toml b/Cargo.toml
index 89c7daa..f22a67d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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),
)
}
}