Compare commits

...

19 Commits

Author SHA1 Message Date
kdurant 93fe658574 add install.sh 2026-02-21 15:29:15 +00:00
andy.boot 709b87e137 docs: Update README.md 2026-01-08 23:30:04 +00:00
andy.boot 3a16a6a234 version: increment version 2026-01-08 23:16:16 +00:00
andy.boot 2066b7fa86 Revert "build: Attempt to add deb musl build."
This reverts commit 37dd671e5e.
2026-01-08 23:03:10 +00:00
andy.boot 07be4261b9 build: Attempt to add deb musl build.
I have no idea if this will work
2026-01-08 20:28:52 +00:00
andy.boot d26971f869 Fix: windows build missed in nu_ansi_term upgrade 2026-01-08 20:14:56 +00:00
andy.boot 28018bc8c2 deps: update dependencies 2026-01-08 20:14:56 +00:00
andy.boot 37dd671e5e build: Attempt to add deb musl build.
I have no idea if this will work
2026-01-08 20:03:42 +00:00
Jeremy Bícha d39224d670 deps: switch from ansi_term to nu_ansi_term 2026-01-08 19:32:58 +00:00
andy.boot 6c20fae3e8 docs: Update README.md
typos
2026-01-07 20:05:43 +00:00
andy.boot 3ab81fcd2f docs: Update README.md 2026-01-07 20:03:28 +00:00
andy.boot 0703784cab docs: Update README.md 2026-01-07 20:02:58 +00:00
andy.boot f51bd0d6a3 docs: update image
better image
2026-01-07 20:00:55 +00:00
andy.boot 514bdcdc74 docs: Update README.md
using a new image
2026-01-07 19:59:26 +00:00
andy.boot 4b64585290 docs: Update README.md 2026-01-07 19:54:43 +00:00
andy.boot 10eba445c9 docs: update description of 'n'
Change sample image file
2026-01-07 19:51:47 +00:00
andy.boot a0c0779849 tests: Update assert_cmd
Use new cargo_bin_cmd macro. Old way of building Commands is deprecated
2026-01-07 19:13:33 +00:00
andy.boot 62bf1e14de deps: update libraries 2025-11-24 21:15:44 +00:00
andy.boot de2d748a88 chore: Retire directories library
Only used in one place (less dependencies = good).
Also directories has been retired as a github project. Easier to replace
with std::env::home() which has all the functionality we need
2025-11-20 23:46:34 +00:00
18 changed files with 610 additions and 439 deletions
Generated
+284 -388
View File
File diff suppressed because it is too large Load Diff
+8 -9
View File
@@ -1,7 +1,7 @@
[package]
name = "du-dust"
description = "A more intuitive version of du"
version = "1.2.3"
version = "1.2.4"
authors = ["bootandy <bootandy@gmail.com>", "nebkor <code@ardent.nebcorp.com>"]
edition = "2024"
readme = "README.md"
@@ -27,11 +27,11 @@ lto = true
strip = true
[dependencies]
ansi_term = "0.12"
clap = { version = "4.4", features = ["derive"] }
lscolors = "0.13"
terminal_size = "0.2"
unicode-width = "0.1"
clap = { version = "4", features = ["derive"] }
lscolors = "0.21"
nu-ansi-term = "0.50"
terminal_size = "0.4"
unicode-width = "0.2"
rayon = "1"
thousands = "0.2"
stfu8 = "0.2"
@@ -39,9 +39,8 @@ regex = "1"
config-file = "0.2"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
directories = "6"
sysinfo = "0.27"
ctrlc = "3.4"
sysinfo = "0.37"
ctrlc = "3"
chrono = "0.4"
[target.'cfg(not(target_has_atomic = "64"))'.dependencies]
+32 -2
View File
@@ -13,9 +13,27 @@ Because I want an easy way to see where my disk is being used.
![Example](media/snap.png)
Study the above picture.
* We see `target` has 1.8G
* `target/debug` is the same size as `target` - so we know nearly all the disk usage of the 1.8G is in this folder
* `target/debug/deps` this is 1.2G - Note the bar jumps down to 70% to indicate that most disk usage is here but not all.
* `target/debug/deps/dust-e78c9f87a17f24f3` - This is the largest file in this folder, but it is only 46M - Note the bar jumps down to 3% to indicate the file is small.
From here we can conclude:
* `target/debug/deps` takes the majority of the space in `target` and that `target/debug/deps` has a large number of relatively small files.
## Install
#### Cargo <a href="https://repology.org/project/du-dust/versions"><img src="https://repology.org/badge/vertical-allrepos/du-dust.svg" alt="Packaging status" align="right"></a>
### Quick Install (Linux, macOS, Windows)
```bash
curl -sSfL https://raw.githubusercontent.com/bootandy/dust/refs/heads/master/install.sh | sh
```
### Cargo <a href="https://repology.org/project/du-dust/versions"><img src="https://repology.org/badge/vertical-allrepos/du-dust.svg" alt="Packaging status" align="right"></a>
#### Cargo
- `cargo install du-dust`
@@ -69,6 +87,8 @@ Dust will list a slightly-less-than-the-terminal-height number of the biggest su
The different colors on the bars: These represent the combined tree hierarchy & disk usage. The shades of grey are used to indicate which parent folder a subfolder belongs to. For instance, look at the above screenshot. `.steam` is a folder taking 44% of the space. From the `.steam` bar is a light grey line that goes up. All these folders are inside `.steam` so if you delete `.steam` all that stuff will be gone too.
If you are new to the tool I recommend to try tweaking the `-n` parameter. `dust -n 10`, `dust -n 50`.
## Usage
```
@@ -125,4 +145,14 @@ reverse=true
- [dirstat-rs](https://github.com/scullionw/dirstat-rs)
- `du -d 1 -h | sort -h`
Note: Apparent-size is calculated slightly differently in dust to gdu. In dust each hard link is counted as using file_length space. In gdu only the first entry is counted.
## Why to use Dust over the Alternatives
Dust simply Does The Right Thing when handling lots of small files & directories. Dust keeps the output simple by only showing large entries.
Tools like ncdu & baobab, give you a view of directory sizes but you have no idea where the largest files are. For example directory A could have a size larger than directory B, but in fact the largest file is in B and not A. Finding this out via these other tools is not trivial whereas Dust will show the large file clearly in the tree hierarchy
Dust will not count hard links multiple times (unless you want to `-s`).
Typing `dust -n 90` will show you your 90 largest entries. `-n` is not quite like `head -n` or `tail -n`, dust is intelligent and chooses the largest entries
+2 -2
View File
@@ -20,8 +20,8 @@ _dust() {
'-T+[Number of threads to use]:THREADS:_default' \
'--threads=[Number of threads to use]:THREADS:_default' \
'--config=[Specify a config file to use]:FILE:_files' \
'-n+[Number of lines of output to show. (Default is terminal_height - 10)]:NUMBER:_default' \
'--number-of-lines=[Number of lines of output to show. (Default is terminal_height - 10)]:NUMBER:_default' \
'-n+[Display the '\''n'\'' largest entries. (Default is terminal_height)]:NUMBER:_default' \
'--number-of-lines=[Display the '\''n'\'' largest entries. (Default is terminal_height)]:NUMBER:_default' \
'*-X+[Exclude any file or directory with this path]:PATH:_files' \
'*--ignore-directory=[Exclude any file or directory with this path]:PATH:_files' \
'-I+[Exclude any file or directory with a regex matching that listed in this file, the file entries will be added to the ignore regexs provided by --invert_filter]:FILE:_files' \
+2 -2
View File
@@ -26,8 +26,8 @@ Register-ArgumentCompleter -Native -CommandName 'dust' -ScriptBlock {
[CompletionResult]::new('-T', '-T ', [CompletionResultType]::ParameterName, 'Number of threads to use')
[CompletionResult]::new('--threads', '--threads', [CompletionResultType]::ParameterName, 'Number of threads to use')
[CompletionResult]::new('--config', '--config', [CompletionResultType]::ParameterName, 'Specify a config file to use')
[CompletionResult]::new('-n', '-n', [CompletionResultType]::ParameterName, 'Number of lines of output to show. (Default is terminal_height - 10)')
[CompletionResult]::new('--number-of-lines', '--number-of-lines', [CompletionResultType]::ParameterName, 'Number of lines of output to show. (Default is terminal_height - 10)')
[CompletionResult]::new('-n', '-n', [CompletionResultType]::ParameterName, 'Display the ''n'' largest entries. (Default is terminal_height)')
[CompletionResult]::new('--number-of-lines', '--number-of-lines', [CompletionResultType]::ParameterName, 'Display the ''n'' largest entries. (Default is terminal_height)')
[CompletionResult]::new('-X', '-X ', [CompletionResultType]::ParameterName, 'Exclude any file or directory with this path')
[CompletionResult]::new('--ignore-directory', '--ignore-directory', [CompletionResultType]::ParameterName, 'Exclude any file or directory with this path')
[CompletionResult]::new('-I', '-I ', [CompletionResultType]::ParameterName, 'Exclude any file or directory with a regex matching that listed in this file, the file entries will be added to the ignore regexs provided by --invert_filter')
+2 -2
View File
@@ -23,8 +23,8 @@ set edit:completion:arg-completer[dust] = {|@words|
cand -T 'Number of threads to use'
cand --threads 'Number of threads to use'
cand --config 'Specify a config file to use'
cand -n 'Number of lines of output to show. (Default is terminal_height - 10)'
cand --number-of-lines 'Number of lines of output to show. (Default is terminal_height - 10)'
cand -n 'Display the ''n'' largest entries. (Default is terminal_height)'
cand --number-of-lines 'Display the ''n'' largest entries. (Default is terminal_height)'
cand -X 'Exclude any file or directory with this path'
cand --ignore-directory 'Exclude any file or directory with this path'
cand -I 'Exclude any file or directory with a regex matching that listed in this file, the file entries will be added to the ignore regexs provided by --invert_filter'
+1 -1
View File
@@ -1,7 +1,7 @@
complete -c dust -s d -l depth -d 'Depth to show' -r
complete -c dust -s T -l threads -d 'Number of threads to use' -r
complete -c dust -l config -d 'Specify a config file to use' -r -F
complete -c dust -s n -l number-of-lines -d 'Number of lines of output to show. (Default is terminal_height - 10)' -r
complete -c dust -s n -l number-of-lines -d 'Display the \'n\' largest entries. (Default is terminal_height)' -r
complete -c dust -s X -l ignore-directory -d 'Exclude any file or directory with this path' -r -F
complete -c dust -s I -l ignore-all-in-file -d 'Exclude any file or directory with a regex matching that listed in this file, the file entries will be added to the ignore regexs provided by --invert_filter' -r -F
complete -c dust -s z -l min-size -d 'Minimum size file to include in output' -r
+3
View File
@@ -28,3 +28,6 @@ ignore-hidden=true
output-format="si"
number-of-lines=5
# To keep the .git directory collapsed
collapse=[".git"]
Executable
+233
View File
@@ -0,0 +1,233 @@
#!/usr/bin/env bash
# dust installer script
# Usage: curl -sSfL https://raw.githubusercontent.com/bootandy/dust/main/install.sh | sh
set -e
REPO="bootandy/dust"
BINARY_NAME="dust"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
error() {
echo -e "${RED}[ERROR]${NC} $1"
exit 1
}
# Detect OS
detect_os() {
case "$(uname -s)" in
Linux*) OS="linux" ;;
Darwin*) OS="darwin" ;;
MINGW*|MSYS*|CYGWIN*) OS="windows" ;;
*) error "Unsupported operating system: $(uname -s)" ;;
esac
}
# Detect architecture
detect_arch() {
ARCH=$(uname -m)
case "$ARCH" in
x86_64|amd64) ARCH="x86_64" ;;
aarch64|arm64) ARCH="aarch64" ;;
armv7l) ARCH="arm" ;;
i686|i386) ARCH="i686" ;;
*) error "Unsupported architecture: $ARCH" ;;
esac
}
# Get the latest release version
get_latest_version() {
info "Fetching latest version..."
# Try using curl
if command -v curl >/dev/null 2>&1; then
VERSION=$(curl -sSf "https://api.github.com/repos/$REPO/releases/latest" | grep '"tag_name"' | sed -E 's/.*"v?([^"]+)".*/\1/')
# Try using wget
elif command -v wget >/dev/null 2>&1; then
VERSION=$(wget -qO- "https://api.github.com/repos/$REPO/releases/latest" | grep '"tag_name"' | sed -E 's/.*"v?([^"]+)".*/\1/')
else
error "Neither curl nor wget is available. Please install one of them."
fi
if [ -z "$VERSION" ]; then
error "Failed to fetch latest version"
fi
info "Latest version: v$VERSION"
}
# Determine target triple
get_target() {
if [ "$OS" = "linux" ]; then
if [ "$ARCH" = "x86_64" ]; then
TARGET="x86_64-unknown-linux-musl"
elif [ "$ARCH" = "aarch64" ]; then
TARGET="aarch64-unknown-linux-musl"
elif [ "$ARCH" = "arm" ]; then
TARGET="arm-unknown-linux-musleabi"
elif [ "$ARCH" = "i686" ]; then
TARGET="i686-unknown-linux-musl"
else
error "Unsupported Linux architecture: $ARCH"
fi
elif [ "$OS" = "darwin" ]; then
if [ "$ARCH" = "x86_64" ]; then
TARGET="x86_64-apple-darwin"
elif [ "$ARCH" = "aarch64" ]; then
# For Apple Silicon, use x86_64 with Rosetta if native build not available
TARGET="x86_64-apple-darwin"
warn "Using x86_64 binary (will run via Rosetta 2 on Apple Silicon)"
else
error "Unsupported macOS architecture: $ARCH"
fi
elif [ "$OS" = "windows" ]; then
if [ "$ARCH" = "x86_64" ]; then
TARGET="x86_64-pc-windows-msvc"
elif [ "$ARCH" = "i686" ]; then
TARGET="i686-pc-windows-msvc"
else
error "Unsupported Windows architecture: $ARCH"
fi
else
error "Unsupported OS: $OS"
fi
info "Target platform: $TARGET"
}
# Download and extract
download_and_install() {
# Construct download URL
if [ "$OS" = "windows" ]; then
ARCHIVE_NAME="dust-v${VERSION}-${TARGET}.zip"
ARCHIVE_EXT="zip"
else
ARCHIVE_NAME="dust-v${VERSION}-${TARGET}.tar.gz"
ARCHIVE_EXT="tar.gz"
fi
DOWNLOAD_URL="https://github.com/$REPO/releases/download/v${VERSION}/${ARCHIVE_NAME}"
info "Downloading from: $DOWNLOAD_URL"
# Create temporary directory
TMP_DIR=$(mktemp -d)
cd "$TMP_DIR"
# Download
if command -v curl >/dev/null 2>&1; then
curl -sSfL "$DOWNLOAD_URL" -o "$ARCHIVE_NAME" || error "Download failed"
elif command -v wget >/dev/null 2>&1; then
wget -q "$DOWNLOAD_URL" -O "$ARCHIVE_NAME" || error "Download failed"
fi
# Extract
info "Extracting archive..."
if [ "$ARCHIVE_EXT" = "tar.gz" ]; then
tar -xzf "$ARCHIVE_NAME" || error "Extraction failed"
elif [ "$ARCHIVE_EXT" = "zip" ]; then
unzip -q "$ARCHIVE_NAME" || error "Extraction failed"
fi
# Find the binary (it might be in a subdirectory)
if [ "$OS" = "windows" ]; then
BINARY_PATH=$(find . -name "${BINARY_NAME}.exe" | head -n 1)
else
BINARY_PATH=$(find . -name "$BINARY_NAME" -type f | head -n 1)
fi
if [ -z "$BINARY_PATH" ]; then
error "Binary not found in archive"
fi
# Determine installation directory
if [ -n "$DUST_INSTALL" ]; then
INSTALL_DIR="$DUST_INSTALL"
elif [ -w "/usr/local/bin" ]; then
INSTALL_DIR="/usr/local/bin"
elif [ -w "$HOME/.local/bin" ]; then
INSTALL_DIR="$HOME/.local/bin"
mkdir -p "$INSTALL_DIR"
else
INSTALL_DIR="$HOME/.local/bin"
mkdir -p "$INSTALL_DIR"
fi
# Install binary
info "Installing to $INSTALL_DIR..."
if [ -w "$INSTALL_DIR" ]; then
cp "$BINARY_PATH" "$INSTALL_DIR/" || error "Installation failed"
chmod +x "$INSTALL_DIR/$BINARY_NAME" || true
else
# Try with sudo
warn "Installing with sudo (requires administrator privileges)..."
sudo cp "$BINARY_PATH" "$INSTALL_DIR/" || error "Installation failed"
sudo chmod +x "$INSTALL_DIR/$BINARY_NAME" || true
fi
# Clean up
cd - > /dev/null
rm -rf "$TMP_DIR"
info "${GREEN}${NC} dust v$VERSION installed successfully!"
# Check if install directory is in PATH
case ":$PATH:" in
*:$INSTALL_DIR:*)
;;
*)
warn "⚠️ $INSTALL_DIR is not in your PATH"
warn " Add the following to your shell config (~/.bashrc, ~/.zshrc, etc.):"
echo ""
echo " export PATH=\"$INSTALL_DIR:\$PATH\""
echo ""
;;
esac
# Show version
if command -v "$BINARY_NAME" >/dev/null 2>&1; then
info "Version check:"
"$BINARY_NAME" --version || true
fi
}
# Main execution
main() {
info "dust installer"
echo ""
# Check for required tools
if ! command -v tar >/dev/null 2>&1 && ! command -v unzip >/dev/null 2>&1; then
error "Neither tar nor unzip is available. Please install one of them."
fi
detect_os
detect_arch
get_latest_version
get_target
download_and_install
echo ""
info "Installation complete! Try running: ${GREEN}dust${NC}"
}
# Allow version to be specified via environment variable
if [ -n "$DUST_VERSION" ]; then
VERSION="$DUST_VERSION"
fi
main
+3 -3
View File
@@ -1,6 +1,6 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH Dust 1 "Dust 1.2.3"
.TH Dust 1 "Dust 1.2.4"
.SH NAME
Dust \- Like du but more intuitive
.SH SYNOPSIS
@@ -19,7 +19,7 @@ Number of threads to use
Specify a config file to use
.TP
\fB\-n\fR, \fB\-\-number\-of\-lines\fR \fI<NUMBER>\fR
Number of lines of output to show. (Default is terminal_height \- 10)
Display the \*(Aqn\*(Aq largest entries. (Default is terminal_height)
.TP
\fB\-p\fR, \fB\-\-full\-paths\fR
Subdirectories will not have their path shortened
@@ -170,4 +170,4 @@ Print version
[\fIPATH\fR]
Input files or directories
.SH VERSION
v1.2.3
v1.2.4
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 107 KiB

+1 -1
View File
@@ -21,7 +21,7 @@ pub struct Cli {
#[arg(long, value_name("FILE"), value_hint(ValueHint::FilePath))]
pub config: Option<String>,
/// Number of lines of output to show. (Default is terminal_height - 10)
/// Display the 'n' largest entries. (Default is terminal_height)
#[arg(short, long, value_name("NUMBER"))]
pub number_of_lines: Option<usize>,
+12 -3
View File
@@ -38,6 +38,7 @@ pub struct Config {
pub files0_from: Option<String>,
pub number_of_lines: Option<usize>,
pub files_from: Option<String>,
pub collapse: Option<Vec<String>>,
}
impl Config {
@@ -177,6 +178,14 @@ impl Config {
pub fn get_changed_time_operator(&self, options: &Cli) -> Option<(Operator, i64)> {
get_filter_time_operator(options.ctime.as_ref(), get_current_date_epoch_seconds())
}
pub fn get_collapse(&self, options: &Cli) -> Option<Vec<String>> {
if self.collapse.is_none() {
options.collapse.clone()
} else {
self.collapse.clone()
}
}
}
fn get_current_date_epoch_seconds() -> i64 {
@@ -244,7 +253,7 @@ fn convert_min_size(input: &str) -> Option<usize> {
}
}
fn get_config_locations(base: &Path) -> Vec<PathBuf> {
fn get_config_locations(base: PathBuf) -> Vec<PathBuf> {
vec![
base.join(".dust.toml"),
base.join(".config").join("dust").join("config.toml"),
@@ -267,8 +276,8 @@ pub fn get_config(conf_path: Option<&String>) -> Config {
}
}
None => {
if let Some(home) = directories::BaseDirs::new() {
for path in get_config_locations(home.home_dir()) {
if let Some(home) = std::env::home_dir() {
for path in get_config_locations(home) {
if path.exists()
&& let Ok(config) = Config::from_config_file(&path)
{
+2 -2
View File
@@ -1,8 +1,8 @@
use crate::display_node::DisplayNode;
use crate::node::FileTime;
use ansi_term::Colour::Red;
use lscolors::{LsColors, Style};
use nu_ansi_term::Color::Red;
use unicode_width::UnicodeWidthStr;
@@ -403,7 +403,7 @@ fn get_pretty_name(
.ls_colors
.style_for_path_with_metadata(&node.name, meta_result.as_ref().ok());
let ansi_style = directory_color
.map(Style::to_ansi_term_style)
.map(Style::to_nu_ansi_term_style)
.unwrap_or_default();
let out = ansi_style.paint(name_and_padding);
format!("{out}")
+6 -6
View File
@@ -29,7 +29,7 @@ use std::panic;
use std::process;
use std::sync::Arc;
use std::sync::Mutex;
use sysinfo::{System, SystemExt};
use sysinfo::System;
use utils::canonicalize_absolute_path;
use self::display::draw_it;
@@ -69,7 +69,7 @@ fn should_init_color(no_color: bool, force_color: bool) -> bool {
{
// Required for windows 10
// Fails to resolve for windows 8 so disable color
match ansi_term::enable_ansi_support() {
match nu_ansi_term::enable_ansi_support() {
Ok(_) => true,
Err(_) => {
eprintln!("This version of Windows does not support ANSI colors");
@@ -224,7 +224,7 @@ fn main() {
indicator.spawn(output_format.clone())
}
let keep_collapsed: HashSet<PathBuf> = match options.collapse {
let keep_collapsed: HashSet<PathBuf> = match config.get_collapse(&options) {
Some(ref collapse) => {
let mut combined_dirs = HashSet::new();
for collapse_dir in collapse {
@@ -440,10 +440,10 @@ fn init_rayon(stack: &Option<usize>, threads: &Option<usize>) -> rayon::ThreadPo
None
} else {
let large_stack = usize::pow(1024, 3);
let mut s = System::new();
s.refresh_memory();
let mut sys = System::new_all();
sys.refresh_memory();
// Larger stack size if possible to handle cases with lots of nested directories
let available = s.available_memory();
let available = sys.available_memory();
if available > (large_stack * threads.unwrap_or(1)).try_into().unwrap() {
Some(large_stack)
} else {
+5 -3
View File
@@ -1,4 +1,4 @@
use assert_cmd::Command;
use assert_cmd::{Command, cargo_bin_cmd};
use std::ffi::OsStr;
use std::process::Output;
use std::sync::Once;
@@ -61,9 +61,11 @@ fn initialize() {
fn run_cmd<T: AsRef<OsStr>>(command_args: &[T]) -> Output {
initialize();
let mut to_run = &mut Command::cargo_bin("dust").unwrap();
let mut to_run = cargo_bin_cmd!("dust");
// Hide progress bar
to_run.arg("-P");
for p in command_args {
to_run = to_run.arg(p);
to_run.arg(p);
}
to_run.unwrap()
}
+9 -10
View File
@@ -1,4 +1,4 @@
use assert_cmd::Command;
use assert_cmd::cargo_bin_cmd;
use std::ffi::OsStr;
use std::str;
@@ -9,17 +9,16 @@ use std::str;
*/
fn build_command<T: AsRef<OsStr>>(command_args: Vec<T>) -> String {
let mut cmd = &mut Command::cargo_bin("dust").unwrap();
let mut cmd = cargo_bin_cmd!("dust");
// Hide progress bar
cmd = cmd.arg("-P");
cmd.arg("-P");
for p in command_args {
cmd = cmd.arg(p);
cmd.arg(p);
}
let finished = &cmd.unwrap();
let stderr = str::from_utf8(&finished.stderr).unwrap();
assert_eq!(stderr, "");
assert_eq!(str::from_utf8(&finished.stderr).unwrap(), "");
str::from_utf8(&finished.stdout).unwrap().into()
}
@@ -126,7 +125,7 @@ pub fn test_files0_from_flag_file() {
#[test]
pub fn test_files_from_flag_stdin() {
let mut cmd = Command::cargo_bin("dust").unwrap();
let mut cmd = cargo_bin_cmd!("dust");
cmd.arg("-P").arg("--files-from").arg("-");
let input = b"tests/test_dir_files_from/a_file\ntests/test_dir_files_from/hello_file\n";
cmd.write_stdin(input.as_ref());
@@ -140,7 +139,7 @@ pub fn test_files_from_flag_stdin() {
#[test]
pub fn test_files0_from_flag_stdin() {
let mut cmd = Command::cargo_bin("dust").unwrap();
let mut cmd = cargo_bin_cmd!("dust");
cmd.arg("-P").arg("--files0-from").arg("-");
let input = b"tests/test_dir_files_from/a_file\0tests/test_dir_files_from/hello_file\0";
cmd.write_stdin(input.as_ref());
@@ -154,7 +153,7 @@ pub fn test_files0_from_flag_stdin() {
#[test]
pub fn test_with_bad_param() {
let mut cmd = Command::cargo_bin("dust").unwrap();
let mut cmd = cargo_bin_cmd!("dust");
cmd.arg("-P").arg("bad_place");
let output_error = cmd.unwrap_err();
let result = output_error.as_output().unwrap();
+5 -5
View File
@@ -1,4 +1,4 @@
use assert_cmd::Command;
use assert_cmd::{Command, cargo_bin_cmd};
use std::fs::File;
use std::io::Write;
use std::path::PathBuf;
@@ -44,7 +44,7 @@ pub fn test_soft_sym_link() {
let b = format!(" ┌── {}", file_path_s);
let a = format!("─┴ {}", dir_s);
let mut cmd = Command::cargo_bin("dust").unwrap();
let mut cmd = cargo_bin_cmd!("dust");
// Mac test runners create long filenames in tmp directories
let output = cmd
.args(["-p", "-c", "-s", "-w", "999", dir_s])
@@ -72,7 +72,7 @@ pub fn test_hard_sym_link() {
let file_output = format!(" ┌── {}", file_path_s);
let dirs_output = format!("─┴ {}", dir_s);
let mut cmd = Command::cargo_bin("dust").unwrap();
let mut cmd = cargo_bin_cmd!("dust");
// Mac test runners create long filenames in tmp directories
let output = cmd.args(["-p", "-c", "-w", "999", dir_s]).unwrap().stdout;
@@ -96,7 +96,7 @@ pub fn test_hard_sym_link_no_dup_multi_arg() {
let link_name = dir_link.path().join("the_link");
let link_name_s = link_it(link_name, file_path_s, false);
let mut cmd = Command::cargo_bin("dust").unwrap();
let mut cmd = cargo_bin_cmd!("dust");
// Mac test runners create long filenames in tmp directories
let output = cmd
@@ -123,7 +123,7 @@ pub fn test_recursive_sym_link() {
let a = format!("─┬ {}", dir_s);
let b = format!(" └── {}", link_name_s);
let mut cmd = Command::cargo_bin("dust").unwrap();
let mut cmd = cargo_bin_cmd!("dust");
let output = cmd
.arg("-p")
.arg("-c")