mirror of
https://github.com/bootandy/dust.git
synced 2026-06-08 11:29:05 +03:00
feat: Reverse direction of bars
Add bars on right option Add tests
This commit is contained in:
@@ -47,6 +47,8 @@ _dust() {
|
|||||||
'--no-colors[No colors will be printed (Useful for commands like: watch)]' \
|
'--no-colors[No colors will be printed (Useful for commands like: watch)]' \
|
||||||
'-b[No percent bars or percentages will be displayed]' \
|
'-b[No percent bars or percentages will be displayed]' \
|
||||||
'--no-percent-bars[No percent bars or percentages will be displayed]' \
|
'--no-percent-bars[No percent bars or percentages will be displayed]' \
|
||||||
|
'-B[percent bars moved to right side of screen]' \
|
||||||
|
'--bars-on-right[percent bars moved to right side of screen]' \
|
||||||
'-R[For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)]' \
|
'-R[For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)]' \
|
||||||
'--screen-reader[For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)]' \
|
'--screen-reader[For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)]' \
|
||||||
'--skip-total[No total row will be displayed]' \
|
'--skip-total[No total row will be displayed]' \
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ Register-ArgumentCompleter -Native -CommandName 'dust' -ScriptBlock {
|
|||||||
[CompletionResult]::new('--no-colors', 'no-colors', [CompletionResultType]::ParameterName, 'No colors will be printed (Useful for commands like: watch)')
|
[CompletionResult]::new('--no-colors', 'no-colors', [CompletionResultType]::ParameterName, 'No colors will be printed (Useful for commands like: watch)')
|
||||||
[CompletionResult]::new('-b', 'b', [CompletionResultType]::ParameterName, 'No percent bars or percentages will be displayed')
|
[CompletionResult]::new('-b', 'b', [CompletionResultType]::ParameterName, 'No percent bars or percentages will be displayed')
|
||||||
[CompletionResult]::new('--no-percent-bars', 'no-percent-bars', [CompletionResultType]::ParameterName, 'No percent bars or percentages will be displayed')
|
[CompletionResult]::new('--no-percent-bars', 'no-percent-bars', [CompletionResultType]::ParameterName, 'No percent bars or percentages will be displayed')
|
||||||
|
[CompletionResult]::new('-B', 'B', [CompletionResultType]::ParameterName, 'percent bars moved to right side of screen')
|
||||||
|
[CompletionResult]::new('--bars-on-right', 'bars-on-right', [CompletionResultType]::ParameterName, 'percent bars moved to right side of screen')
|
||||||
[CompletionResult]::new('-R', 'R', [CompletionResultType]::ParameterName, 'For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)')
|
[CompletionResult]::new('-R', 'R', [CompletionResultType]::ParameterName, 'For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)')
|
||||||
[CompletionResult]::new('--screen-reader', 'screen-reader', [CompletionResultType]::ParameterName, 'For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)')
|
[CompletionResult]::new('--screen-reader', 'screen-reader', [CompletionResultType]::ParameterName, 'For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)')
|
||||||
[CompletionResult]::new('--skip-total', 'skip-total', [CompletionResultType]::ParameterName, 'No total row will be displayed')
|
[CompletionResult]::new('--skip-total', 'skip-total', [CompletionResultType]::ParameterName, 'No total row will be displayed')
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ _dust() {
|
|||||||
|
|
||||||
case "${cmd}" in
|
case "${cmd}" in
|
||||||
dust)
|
dust)
|
||||||
opts="-h -V -d -n -p -X -L -x -s -r -c -b -z -R -f -i -v -e -t -w -H -P -D -F --help --version --depth --number-of-lines --full-paths --ignore-directory --dereference-links --limit-filesystem --apparent-size --reverse --no-colors --no-percent-bars --min-size --screen-reader --skip-total --filecount --ignore_hidden --invert-filter --filter --file_types --terminal_width --si --no-progress --only-dir --only-file <inputs>..."
|
opts="-h -V -d -n -p -X -L -x -s -r -c -b -B -z -R -f -i -v -e -t -w -H -P -D -F --help --version --depth --number-of-lines --full-paths --ignore-directory --dereference-links --limit-filesystem --apparent-size --reverse --no-colors --no-percent-bars --bars-on-right --min-size --screen-reader --skip-total --filecount --ignore_hidden --invert-filter --filter --file_types --terminal_width --si --no-progress --only-dir --only-file <inputs>..."
|
||||||
if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
|
if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
|
||||||
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
|
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -50,6 +50,8 @@ set edit:completion:arg-completer[dust] = {|@words|
|
|||||||
cand --no-colors 'No colors will be printed (Useful for commands like: watch)'
|
cand --no-colors 'No colors will be printed (Useful for commands like: watch)'
|
||||||
cand -b 'No percent bars or percentages will be displayed'
|
cand -b 'No percent bars or percentages will be displayed'
|
||||||
cand --no-percent-bars 'No percent bars or percentages will be displayed'
|
cand --no-percent-bars 'No percent bars or percentages will be displayed'
|
||||||
|
cand -B 'percent bars moved to right side of screen'
|
||||||
|
cand --bars-on-right 'percent bars moved to right side of screen'
|
||||||
cand -R 'For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)'
|
cand -R 'For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)'
|
||||||
cand --screen-reader 'For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)'
|
cand --screen-reader 'For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)'
|
||||||
cand --skip-total 'No total row will be displayed'
|
cand --skip-total 'No total row will be displayed'
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ complete -c dust -s s -l apparent-size -d 'Use file length instead of blocks'
|
|||||||
complete -c dust -s r -l reverse -d 'Print tree upside down (biggest highest)'
|
complete -c dust -s r -l reverse -d 'Print tree upside down (biggest highest)'
|
||||||
complete -c dust -s c -l no-colors -d 'No colors will be printed (Useful for commands like: watch)'
|
complete -c dust -s c -l no-colors -d 'No colors will be printed (Useful for commands like: watch)'
|
||||||
complete -c dust -s b -l no-percent-bars -d 'No percent bars or percentages will be displayed'
|
complete -c dust -s b -l no-percent-bars -d 'No percent bars or percentages will be displayed'
|
||||||
|
complete -c dust -s B -l bars-on-right -d 'percent bars moved to right side of screen'
|
||||||
complete -c dust -s R -l screen-reader -d 'For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)'
|
complete -c dust -s R -l screen-reader -d 'For screen readers. Removes bars. Adds new column: depth level (May want to use -p too for full path)'
|
||||||
complete -c dust -l skip-total -d 'No total row will be displayed'
|
complete -c dust -l skip-total -d 'No total row will be displayed'
|
||||||
complete -c dust -s f -l filecount -d 'Directory \'size\' is number of child files instead of disk size'
|
complete -c dust -s f -l filecount -d 'Directory \'size\' is number of child files instead of disk size'
|
||||||
|
|||||||
+4
-1
@@ -4,7 +4,7 @@
|
|||||||
.SH NAME
|
.SH NAME
|
||||||
Dust \- Like du but more intuitive
|
Dust \- Like du but more intuitive
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
\fBDust\fR [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] [\fB\-d\fR|\fB\-\-depth\fR] [\fB\-n\fR|\fB\-\-number\-of\-lines\fR] [\fB\-p\fR|\fB\-\-full\-paths\fR] [\fB\-X\fR|\fB\-\-ignore\-directory\fR] [\fB\-L\fR|\fB\-\-dereference\-links\fR] [\fB\-x\fR|\fB\-\-limit\-filesystem\fR] [\fB\-s\fR|\fB\-\-apparent\-size\fR] [\fB\-r\fR|\fB\-\-reverse\fR] [\fB\-c\fR|\fB\-\-no\-colors\fR] [\fB\-b\fR|\fB\-\-no\-percent\-bars\fR] [\fB\-z\fR|\fB\-\-min\-size\fR] [\fB\-R\fR|\fB\-\-screen\-reader\fR] [\fB\-\-skip\-total\fR] [\fB\-f\fR|\fB\-\-filecount\fR] [\fB\-i\fR|\fB\-\-ignore_hidden\fR] [\fB\-v\fR|\fB\-\-invert\-filter\fR] [\fB\-e\fR|\fB\-\-filter\fR] [\fB\-t\fR|\fB\-\-file_types\fR] [\fB\-w\fR|\fB\-\-terminal_width\fR] [\fB\-H\fR|\fB\-\-si\fR] [\fB\-P\fR|\fB\-\-no\-progress\fR] [\fB\-D\fR|\fB\-\-only\-dir\fR] [\fB\-F\fR|\fB\-\-only\-file\fR] [\fIinputs\fR]
|
\fBDust\fR [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] [\fB\-d\fR|\fB\-\-depth\fR] [\fB\-n\fR|\fB\-\-number\-of\-lines\fR] [\fB\-p\fR|\fB\-\-full\-paths\fR] [\fB\-X\fR|\fB\-\-ignore\-directory\fR] [\fB\-L\fR|\fB\-\-dereference\-links\fR] [\fB\-x\fR|\fB\-\-limit\-filesystem\fR] [\fB\-s\fR|\fB\-\-apparent\-size\fR] [\fB\-r\fR|\fB\-\-reverse\fR] [\fB\-c\fR|\fB\-\-no\-colors\fR] [\fB\-b\fR|\fB\-\-no\-percent\-bars\fR] [\fB\-B\fR|\fB\-\-bars\-on\-right\fR] [\fB\-z\fR|\fB\-\-min\-size\fR] [\fB\-R\fR|\fB\-\-screen\-reader\fR] [\fB\-\-skip\-total\fR] [\fB\-f\fR|\fB\-\-filecount\fR] [\fB\-i\fR|\fB\-\-ignore_hidden\fR] [\fB\-v\fR|\fB\-\-invert\-filter\fR] [\fB\-e\fR|\fB\-\-filter\fR] [\fB\-t\fR|\fB\-\-file_types\fR] [\fB\-w\fR|\fB\-\-terminal_width\fR] [\fB\-H\fR|\fB\-\-si\fR] [\fB\-P\fR|\fB\-\-no\-progress\fR] [\fB\-D\fR|\fB\-\-only\-dir\fR] [\fB\-F\fR|\fB\-\-only\-file\fR] [\fIinputs\fR]
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Like du but more intuitive
|
Like du but more intuitive
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
@@ -45,6 +45,9 @@ No colors will be printed (Useful for commands like: watch)
|
|||||||
\fB\-b\fR, \fB\-\-no\-percent\-bars\fR
|
\fB\-b\fR, \fB\-\-no\-percent\-bars\fR
|
||||||
No percent bars or percentages will be displayed
|
No percent bars or percentages will be displayed
|
||||||
.TP
|
.TP
|
||||||
|
\fB\-B\fR, \fB\-\-bars\-on\-right\fR
|
||||||
|
percent bars moved to right side of screen
|
||||||
|
.TP
|
||||||
\fB\-z\fR, \fB\-\-min\-size\fR
|
\fB\-z\fR, \fB\-\-min\-size\fR
|
||||||
Minimum size file to include in output
|
Minimum size file to include in output
|
||||||
.TP
|
.TP
|
||||||
|
|||||||
@@ -73,6 +73,12 @@ pub fn build_cli() -> Command<'static> {
|
|||||||
.long("no-percent-bars")
|
.long("no-percent-bars")
|
||||||
.help("No percent bars or percentages will be displayed"),
|
.help("No percent bars or percentages will be displayed"),
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::new("bars_on_right")
|
||||||
|
.short('B')
|
||||||
|
.long("bars-on-right")
|
||||||
|
.help("percent bars moved to right side of screen"),
|
||||||
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("min_size")
|
Arg::new("min_size")
|
||||||
.short('z')
|
.short('z')
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ pub struct Config {
|
|||||||
pub only_file: Option<bool>,
|
pub only_file: Option<bool>,
|
||||||
pub disable_progress: Option<bool>,
|
pub disable_progress: Option<bool>,
|
||||||
pub depth: Option<usize>,
|
pub depth: Option<usize>,
|
||||||
|
pub bars_on_right: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
@@ -93,6 +94,9 @@ impl Config {
|
|||||||
pub fn get_only_file(&self, options: &ArgMatches) -> bool {
|
pub fn get_only_file(&self, options: &ArgMatches) -> bool {
|
||||||
Some(true) == self.only_file || options.is_present("only_file")
|
Some(true) == self.only_file || options.is_present("only_file")
|
||||||
}
|
}
|
||||||
|
pub fn get_bars_on_right(&self, options: &ArgMatches) -> bool {
|
||||||
|
Some(true) == self.bars_on_right || options.is_present("bars_on_right")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn convert_min_size(input: &str, iso: bool) -> Option<usize> {
|
fn convert_min_size(input: &str, iso: bool) -> Option<usize> {
|
||||||
|
|||||||
+67
-1
@@ -24,6 +24,7 @@ pub struct InitialDisplayData {
|
|||||||
pub by_filecount: bool,
|
pub by_filecount: bool,
|
||||||
pub is_screen_reader: bool,
|
pub is_screen_reader: bool,
|
||||||
pub iso: bool,
|
pub iso: bool,
|
||||||
|
pub bars_on_right: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct DisplayData {
|
pub struct DisplayData {
|
||||||
@@ -98,7 +99,13 @@ impl DrawData<'_> {
|
|||||||
let mut new_bar = "".to_string();
|
let mut new_bar = "".to_string();
|
||||||
let idx = 5 - level.clamp(1, 4);
|
let idx = 5 - level.clamp(1, 4);
|
||||||
|
|
||||||
for c in self.percent_bar.chars() {
|
let itr: Box<dyn Iterator<Item = char>> = if self.display_data.initial.bars_on_right {
|
||||||
|
Box::new(self.percent_bar.chars())
|
||||||
|
} else {
|
||||||
|
Box::new(self.percent_bar.chars().rev())
|
||||||
|
};
|
||||||
|
|
||||||
|
for c in itr {
|
||||||
num_not_my_bar -= 1;
|
num_not_my_bar -= 1;
|
||||||
if num_not_my_bar <= 0 {
|
if num_not_my_bar <= 0 {
|
||||||
new_bar.push(BLOCKS[0]);
|
new_bar.push(BLOCKS[0]);
|
||||||
@@ -108,7 +115,11 @@ impl DrawData<'_> {
|
|||||||
new_bar.push(c);
|
new_bar.push(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if self.display_data.initial.bars_on_right {
|
||||||
new_bar
|
new_bar
|
||||||
|
} else {
|
||||||
|
new_bar.chars().rev().collect()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -426,6 +437,7 @@ mod tests {
|
|||||||
by_filecount: false,
|
by_filecount: false,
|
||||||
is_screen_reader: false,
|
is_screen_reader: false,
|
||||||
iso: false,
|
iso: false,
|
||||||
|
bars_on_right: false,
|
||||||
};
|
};
|
||||||
DisplayData {
|
DisplayData {
|
||||||
initial,
|
initial,
|
||||||
@@ -508,4 +520,58 @@ mod tests {
|
|||||||
"1.0T"
|
"1.0T"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
fn build_draw_data<'a>(disp: &'a DisplayData, size: u32) -> (DrawData<'a>, DisplayNode) {
|
||||||
|
let n = DisplayNode {
|
||||||
|
name: PathBuf::from("/short"),
|
||||||
|
size: 2_u64.pow(size),
|
||||||
|
children: vec![],
|
||||||
|
};
|
||||||
|
let first_size_bar = repeat(BLOCKS[0]).take(13).collect();
|
||||||
|
let dd = DrawData {
|
||||||
|
indent: "".into(),
|
||||||
|
percent_bar: first_size_bar,
|
||||||
|
display_data: disp,
|
||||||
|
};
|
||||||
|
(dd, n)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_draw_data() {
|
||||||
|
let disp = &get_fake_display_data(20);
|
||||||
|
let (dd, n) = build_draw_data(disp, 12);
|
||||||
|
let bar = dd.generate_bar(&n, 1);
|
||||||
|
assert_eq!(bar, "█████████████");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_draw_data2() {
|
||||||
|
let disp = &get_fake_display_data(20);
|
||||||
|
let (dd, n) = build_draw_data(disp, 11);
|
||||||
|
let bar = dd.generate_bar(&n, 2);
|
||||||
|
assert_eq!(bar, "███████░░░░░░");
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn test_draw_data3() {
|
||||||
|
let mut disp = get_fake_display_data(20);
|
||||||
|
let (dd, n) = build_draw_data(&disp, 11);
|
||||||
|
let bar = dd.generate_bar(&n, 3);
|
||||||
|
assert_eq!(bar, "███████▒▒▒▒▒▒");
|
||||||
|
|
||||||
|
disp.initial.bars_on_right = true;
|
||||||
|
let (dd, n) = build_draw_data(&disp, 11);
|
||||||
|
let bar = dd.generate_bar(&n, 3);
|
||||||
|
assert_eq!(bar, "▒▒▒▒▒▒███████")
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn test_draw_data4() {
|
||||||
|
let disp = &get_fake_display_data(20);
|
||||||
|
let (dd, n) = build_draw_data(disp, 10);
|
||||||
|
// After 4 we have no more levels of shading so 4+ is the same
|
||||||
|
let bar = dd.generate_bar(&n, 4);
|
||||||
|
assert_eq!(bar, "████▓▓▓▓▓▓▓▓▓");
|
||||||
|
let bar = dd.generate_bar(&n, 5);
|
||||||
|
assert_eq!(bar, "████▓▓▓▓▓▓▓▓▓");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -214,6 +214,7 @@ fn main() {
|
|||||||
by_filecount,
|
by_filecount,
|
||||||
iso,
|
iso,
|
||||||
is_screen_reader: config.get_screen_reader(&options),
|
is_screen_reader: config.get_screen_reader(&options),
|
||||||
|
bars_on_right: config.get_bars_on_right(&options),
|
||||||
};
|
};
|
||||||
draw_it(
|
draw_it(
|
||||||
idd,
|
idd,
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ fn exact_output_test<T: AsRef<OsStr>>(valid_outputs: Vec<String>, command_args:
|
|||||||
#[test]
|
#[test]
|
||||||
pub fn test_main_basic() {
|
pub fn test_main_basic() {
|
||||||
// -c is no color mode - This makes testing much simpler
|
// -c is no color mode - This makes testing much simpler
|
||||||
exact_output_test(main_output(), vec!["-c", "/tmp/test_dir/"])
|
exact_output_test(main_output(), vec!["-c", "-B", "/tmp/test_dir/"])
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(target_os = "windows", ignore)]
|
#[cfg_attr(target_os = "windows", ignore)]
|
||||||
@@ -68,6 +68,7 @@ pub fn test_main_basic() {
|
|||||||
pub fn test_main_multi_arg() {
|
pub fn test_main_multi_arg() {
|
||||||
let command_args = vec![
|
let command_args = vec![
|
||||||
"-c",
|
"-c",
|
||||||
|
"-B",
|
||||||
"/tmp/test_dir/many/",
|
"/tmp/test_dir/many/",
|
||||||
"/tmp/test_dir",
|
"/tmp/test_dir",
|
||||||
"/tmp/test_dir",
|
"/tmp/test_dir",
|
||||||
@@ -102,7 +103,7 @@ fn main_output() -> Vec<String> {
|
|||||||
#[cfg_attr(target_os = "windows", ignore)]
|
#[cfg_attr(target_os = "windows", ignore)]
|
||||||
#[test]
|
#[test]
|
||||||
pub fn test_main_long_paths() {
|
pub fn test_main_long_paths() {
|
||||||
let command_args = vec!["-c", "-p", "/tmp/test_dir/"];
|
let command_args = vec!["-c", "-p", "-B", "/tmp/test_dir/"];
|
||||||
exact_output_test(main_output_long_paths(), command_args);
|
exact_output_test(main_output_long_paths(), command_args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,7 +131,7 @@ fn main_output_long_paths() -> Vec<String> {
|
|||||||
#[cfg_attr(target_os = "windows", ignore)]
|
#[cfg_attr(target_os = "windows", ignore)]
|
||||||
#[test]
|
#[test]
|
||||||
pub fn test_substring_of_names_and_long_names() {
|
pub fn test_substring_of_names_and_long_names() {
|
||||||
let command_args = vec!["-c", "/tmp/test_dir2"];
|
let command_args = vec!["-c", "-B", "/tmp/test_dir2"];
|
||||||
exact_output_test(no_substring_of_names_output(), command_args);
|
exact_output_test(no_substring_of_names_output(), command_args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,7 +165,7 @@ fn no_substring_of_names_output() -> Vec<String> {
|
|||||||
#[cfg_attr(target_os = "windows", ignore)]
|
#[cfg_attr(target_os = "windows", ignore)]
|
||||||
#[test]
|
#[test]
|
||||||
pub fn test_unicode_directories() {
|
pub fn test_unicode_directories() {
|
||||||
let command_args = vec!["-c", "/tmp/test_dir_unicode"];
|
let command_args = vec!["-c", "-B", "/tmp/test_dir_unicode"];
|
||||||
exact_output_test(unicode_dir(), command_args);
|
exact_output_test(unicode_dir(), command_args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user