Skip to content

Commit 01c0aae

Browse files
committed
feat: New --collapse flag
--collapse will keep that directory collapsed and will not expand it.
1 parent 6cbd736 commit 01c0aae

File tree

11 files changed

+55
-5
lines changed

11 files changed

+55
-5
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ Usage: dust --skip-total (No total row will be displayed)
103103
Usage: dust -z 40000/30MB/20kib (Exclude output files/directories below size 40000 bytes / 30MB / 20KiB)
104104
Usage: dust -j (Prints JSON representation of directories, try: dust -j | jq)
105105
Usage: dust --files0-from=FILE (Reads null-terminated file paths from FILE); If FILE is - then read from stdin
106+
Usage: dust --collapse=node-modules will keep the node-modules folder collapsed in display instead of recursively opening it
106107
```
107108

108109
## Config file

completions/_dust

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ _dust() {
4545
'-y+[just like -mtime, but based on file change time]: : ' \
4646
'--ctime=[just like -mtime, but based on file change time]: : ' \
4747
'--files0-from=[run dust on NUL-terminated file names specified in file; if argument is -, then read names from standard input]: :_files' \
48+
'*--collapse=[Keep these directories collapsed]: :_files' \
4849
'-m+[Directory '\''size'\'' is max filetime of child files instead of disk size. while a/c/m for last accessed/changed/modified time]: :(a c m)' \
4950
'--filetime=[Directory '\''size'\'' is max filetime of child files instead of disk size. while a/c/m for last accessed/changed/modified time]: :(a c m)' \
5051
'-p[Subdirectories will not have their path shortened]' \

completions/_dust.ps1

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ Register-ArgumentCompleter -Native -CommandName 'dust' -ScriptBlock {
5151
[CompletionResult]::new('-y', 'y', [CompletionResultType]::ParameterName, 'just like -mtime, but based on file change time')
5252
[CompletionResult]::new('--ctime', 'ctime', [CompletionResultType]::ParameterName, 'just like -mtime, but based on file change time')
5353
[CompletionResult]::new('--files0-from', 'files0-from', [CompletionResultType]::ParameterName, 'run dust on NUL-terminated file names specified in file; if argument is -, then read names from standard input')
54+
[CompletionResult]::new('--collapse', 'collapse', [CompletionResultType]::ParameterName, 'Keep these directories collapsed')
5455
[CompletionResult]::new('-m', 'm', [CompletionResultType]::ParameterName, 'Directory ''size'' is max filetime of child files instead of disk size. while a/c/m for last accessed/changed/modified time')
5556
[CompletionResult]::new('--filetime', 'filetime', [CompletionResultType]::ParameterName, 'Directory ''size'' is max filetime of child files instead of disk size. while a/c/m for last accessed/changed/modified time')
5657
[CompletionResult]::new('-p', 'p', [CompletionResultType]::ParameterName, 'Subdirectories will not have their path shortened')

completions/dust.bash

+5-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ _dust() {
1919

2020
case "${cmd}" in
2121
dust)
22-
opts="-d -T -n -p -X -I -L -x -s -r -c -C -b -B -z -R -f -i -v -e -t -w -P -D -F -o -S -j -M -A -y -m -h -V --depth --threads --config --number-of-lines --full-paths --ignore-directory --ignore-all-in-file --dereference-links --limit-filesystem --apparent-size --reverse --no-colors --force-colors --no-percent-bars --bars-on-right --min-size --screen-reader --skip-total --filecount --ignore_hidden --invert-filter --filter --file_types --terminal_width --no-progress --print-errors --only-dir --only-file --output-format --stack-size --output-json --mtime --atime --ctime --files0-from --filetime --help --version [PATH]..."
22+
opts="-d -T -n -p -X -I -L -x -s -r -c -C -b -B -z -R -f -i -v -e -t -w -P -D -F -o -S -j -M -A -y -m -h -V --depth --threads --config --number-of-lines --full-paths --ignore-directory --ignore-all-in-file --dereference-links --limit-filesystem --apparent-size --reverse --no-colors --force-colors --no-percent-bars --bars-on-right --min-size --screen-reader --skip-total --filecount --ignore_hidden --invert-filter --filter --file_types --terminal_width --no-progress --print-errors --only-dir --only-file --output-format --stack-size --output-json --mtime --atime --ctime --files0-from --collapse --filetime --help --version [PATH]..."
2323
if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
2424
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
2525
return 0
@@ -178,6 +178,10 @@ _dust() {
178178
COMPREPLY=($(compgen -f "${cur}"))
179179
return 0
180180
;;
181+
--collapse)
182+
COMPREPLY=($(compgen -f "${cur}"))
183+
return 0
184+
;;
181185
--filetime)
182186
COMPREPLY=($(compgen -W "a c m" -- "${cur}"))
183187
return 0

completions/dust.elv

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ set edit:completion:arg-completer[dust] = {|@words|
4848
cand -y 'just like -mtime, but based on file change time'
4949
cand --ctime 'just like -mtime, but based on file change time'
5050
cand --files0-from 'run dust on NUL-terminated file names specified in file; if argument is -, then read names from standard input'
51+
cand --collapse 'Keep these directories collapsed'
5152
cand -m 'Directory ''size'' is max filetime of child files instead of disk size. while a/c/m for last accessed/changed/modified time'
5253
cand --filetime 'Directory ''size'' is max filetime of child files instead of disk size. while a/c/m for last accessed/changed/modified time'
5354
cand -p 'Subdirectories will not have their path shortened'

completions/dust.fish

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ complete -c dust -s M -l mtime -d '+/-n matches files modified more/less than n
1414
complete -c dust -s A -l atime -d 'just like -mtime, but based on file access time' -r
1515
complete -c dust -s y -l ctime -d 'just like -mtime, but based on file change time' -r
1616
complete -c dust -l files0-from -d 'run dust on NUL-terminated file names specified in file; if argument is -, then read names from standard input' -r -F
17+
complete -c dust -l collapse -d 'Keep these directories collapsed' -r -F
1718
complete -c dust -s m -l filetime -d 'Directory \'size\' is max filetime of child files instead of disk size. while a/c/m for last accessed/changed/modified time' -r -f -a "{a\t'',c\t'',m\t''}"
1819
complete -c dust -s p -l full-paths -d 'Subdirectories will not have their path shortened'
1920
complete -c dust -s L -l dereference-links -d 'dereference sym links - Treat sym links as directories and go into them'

man-page/dust.1

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
.SH NAME
55
Dust \- Like du but more intuitive
66
.SH SYNOPSIS
7-
\fBdust\fR [\fB\-d\fR|\fB\-\-depth\fR] [\fB\-T\fR|\fB\-\-threads\fR] [\fB\-\-config\fR] [\fB\-n\fR|\fB\-\-number\-of\-lines\fR] [\fB\-p\fR|\fB\-\-full\-paths\fR] [\fB\-X\fR|\fB\-\-ignore\-directory\fR] [\fB\-I\fR|\fB\-\-ignore\-all\-in\-file\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\-C\fR|\fB\-\-force\-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\-P\fR|\fB\-\-no\-progress\fR] [\fB\-\-print\-errors\fR] [\fB\-D\fR|\fB\-\-only\-dir\fR] [\fB\-F\fR|\fB\-\-only\-file\fR] [\fB\-o\fR|\fB\-\-output\-format\fR] [\fB\-S\fR|\fB\-\-stack\-size\fR] [\fB\-j\fR|\fB\-\-output\-json\fR] [\fB\-M\fR|\fB\-\-mtime\fR] [\fB\-A\fR|\fB\-\-atime\fR] [\fB\-y\fR|\fB\-\-ctime\fR] [\fB\-\-files0\-from\fR] [\fB\-m\fR|\fB\-\-filetime\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] [\fIPATH\fR]
7+
\fBdust\fR [\fB\-d\fR|\fB\-\-depth\fR] [\fB\-T\fR|\fB\-\-threads\fR] [\fB\-\-config\fR] [\fB\-n\fR|\fB\-\-number\-of\-lines\fR] [\fB\-p\fR|\fB\-\-full\-paths\fR] [\fB\-X\fR|\fB\-\-ignore\-directory\fR] [\fB\-I\fR|\fB\-\-ignore\-all\-in\-file\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\-C\fR|\fB\-\-force\-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\-P\fR|\fB\-\-no\-progress\fR] [\fB\-\-print\-errors\fR] [\fB\-D\fR|\fB\-\-only\-dir\fR] [\fB\-F\fR|\fB\-\-only\-file\fR] [\fB\-o\fR|\fB\-\-output\-format\fR] [\fB\-S\fR|\fB\-\-stack\-size\fR] [\fB\-j\fR|\fB\-\-output\-json\fR] [\fB\-M\fR|\fB\-\-mtime\fR] [\fB\-A\fR|\fB\-\-atime\fR] [\fB\-y\fR|\fB\-\-ctime\fR] [\fB\-\-files0\-from\fR] [\fB\-\-collapse\fR] [\fB\-m\fR|\fB\-\-filetime\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] [\fIPATH\fR]
88
.SH DESCRIPTION
99
Like du but more intuitive
1010
.SH OPTIONS
@@ -118,6 +118,9 @@ just like \-mtime, but based on file change time
118118
\fB\-\-files0\-from\fR
119119
run dust on NUL\-terminated file names specified in file; if argument is \-, then read names from standard input
120120
.TP
121+
\fB\-\-collapse\fR
122+
Keep these directories collapsed
123+
.TP
121124
\fB\-m\fR, \fB\-\-filetime\fR
122125
Directory \*(Aqsize\*(Aq is max filetime of child files instead of disk size. while a/c/m for last accessed/changed/modified time
123126
.br

src/cli.rs

+8
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,14 @@ pub fn build_cli() -> Command {
303303
.num_args(1)
304304
.help("run dust on NUL-terminated file names specified in file; if argument is -, then read names from standard input"),
305305
)
306+
.arg(
307+
Arg::new("collapse")
308+
.long("collapse")
309+
.value_hint(clap::ValueHint::AnyPath)
310+
.value_parser(value_parser!(String))
311+
.action(clap::ArgAction::Append)
312+
.help("Keep these directories collapsed"),
313+
)
306314
.arg(
307315
Arg::new("filetime")
308316
.short('m')

src/filter.rs

+12-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::node::FileTime;
33
use crate::node::Node;
44
use std::collections::BinaryHeap;
55
use std::collections::HashMap;
6+
use std::collections::HashSet;
67
use std::path::Path;
78
use std::path::PathBuf;
89

@@ -19,6 +20,7 @@ pub fn get_biggest(
1920
top_level_nodes: Vec<Node>,
2021
display_data: AggregateData,
2122
by_filetime: &Option<FileTime>,
23+
keep_collapsed: HashSet<PathBuf>,
2224
) -> Option<DisplayNode> {
2325
if top_level_nodes.is_empty() {
2426
// perhaps change this, bring back Error object?
@@ -52,13 +54,19 @@ pub fn get_biggest(
5254
heap = add_children(&display_data, &root, heap);
5355
}
5456

55-
Some(fill_remaining_lines(heap, &root, display_data))
57+
Some(fill_remaining_lines(
58+
heap,
59+
&root,
60+
display_data,
61+
keep_collapsed,
62+
))
5663
}
5764

5865
pub fn fill_remaining_lines<'a>(
5966
mut heap: BinaryHeap<&'a Node>,
6067
root: &'a Node,
6168
display_data: AggregateData,
69+
keep_collapsed: HashSet<PathBuf>,
6270
) -> DisplayNode {
6371
let mut allowed_nodes = HashMap::new();
6472

@@ -69,7 +77,9 @@ pub fn fill_remaining_lines<'a>(
6977
if !display_data.only_file || line.children.is_empty() {
7078
allowed_nodes.insert(line.name.as_path(), line);
7179
}
72-
heap = add_children(&display_data, line, heap);
80+
if !keep_collapsed.contains(&line.name) {
81+
heap = add_children(&display_data, line, heap);
82+
}
7383
}
7484
None => break,
7585
}

src/main.rs

+14-1
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,19 @@ fn main() {
244244
indicator.spawn(output_format.clone())
245245
}
246246

247+
let keep_collapsed: HashSet<PathBuf> = match options.get_many::<String>("collapse") {
248+
Some(collapse) => {
249+
let mut combined_dirs = HashSet::new();
250+
for collapse_dir in collapse {
251+
for target_dir in target_dirs.iter() {
252+
combined_dirs.insert(PathBuf::from(target_dir).join(collapse_dir));
253+
}
254+
}
255+
combined_dirs
256+
}
257+
None => HashSet::new(),
258+
};
259+
247260
let filter_modified_time = config.get_modified_time_operator(&options);
248261
let filter_accessed_time = config.get_accessed_time_operator(&options);
249262
let filter_changed_time = config.get_changed_time_operator(&options);
@@ -281,7 +294,7 @@ fn main() {
281294
depth,
282295
using_a_filter: !filter_regexs.is_empty() || !invert_filter_regexs.is_empty(),
283296
};
284-
get_biggest(top_level_nodes, agg_data, &by_filetime)
297+
get_biggest(top_level_nodes, agg_data, &by_filetime, keep_collapsed)
285298
}
286299
};
287300

tests/test_flags.rs

+7
Original file line numberDiff line numberDiff line change
@@ -254,3 +254,10 @@ pub fn test_force_color() {
254254
assert!(output.contains("\x1B[31m"));
255255
assert!(output.contains("\x1B[0m"));
256256
}
257+
258+
#[test]
259+
pub fn test_collapse() {
260+
let output = build_command(vec!["--collapse", "many", "tests/test_dir/"]);
261+
assert!(output.contains("many"));
262+
assert!(!output.contains("hello_file"));
263+
}

0 commit comments

Comments
 (0)