Skip to content

Commit

Permalink
chore: add --file-list support
Browse files Browse the repository at this point in the history
  • Loading branch information
dpc committed Oct 11, 2023
1 parent 2b7af0e commit e2b9743
Show file tree
Hide file tree
Showing 15 changed files with 90 additions and 8 deletions.
8 changes: 7 additions & 1 deletion crates/typos-cli/src/bin/typos-cli/args.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use std::path::PathBuf;

use clap::builder::TypedValueParser;
use clap::Parser;

Expand Down Expand Up @@ -39,9 +41,13 @@ impl Format {
#[command(group = clap::ArgGroup::new("mode").multiple(false))]
pub(crate) struct Args {
/// Paths to check with `-` for stdin
#[arg(default_value = ".")]
#[arg(default_value = ".", group = "source")]
pub(crate) path: Vec<std::path::PathBuf>,

/// Read the list of newline separated paths from file or stdin (if `-`)
#[arg(long, group = "source")]
pub(crate) file_list: Option<PathBuf>,

/// The approximate number of threads to use.
#[arg(short = 'j', long = "threads", default_value = "0")]
pub(crate) threads: usize,
Expand Down
31 changes: 29 additions & 2 deletions crates/typos-cli/src/bin/typos-cli/main.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use std::io::Write;
use std::io::{BufRead as _, BufReader, Write as _};
use std::path::PathBuf;

use clap::Parser;

Expand Down Expand Up @@ -167,8 +168,34 @@ fn run_checks(args: &args::Args) -> proc_exit::ExitResult {

let mut typos_found = false;
let mut errors_found = false;
for path in args.path.iter() {

let file_list = match args.file_list.as_deref() {
Some(dash) if dash == PathBuf::from("-") => Some(
std::io::stdin()
.lines()
.map(|res| res.map(PathBuf::from))
.collect::<Result<_, _>>()
.with_code(proc_exit::sysexits::IO_ERR)?,
),
Some(path) => Some(
BufReader::new(std::fs::File::open(path).with_code(proc_exit::sysexits::IO_ERR)?)
.lines()
.map(|res| res.map(PathBuf::from))
.collect::<Result<_, _>>()
.with_code(proc_exit::sysexits::IO_ERR)?,
),
None => None,
};

// Note: file_list and args.path are mutually exclusive, enforced by clap
for path in file_list.as_ref().unwrap_or(&args.path) {
// Note paths are passed through stdin, `-` is treated like a normal path
let cwd = if path == std::path::Path::new("-") {
if args.file_list.is_some() {
return Err(proc_exit::sysexits::USAGE_ERR.with_message(
"Can't use `-` (stdin) while using `--file_list` provided paths",
));
};
global_cwd.clone()
} else if path.is_file() {
let mut cwd = path
Expand Down
4 changes: 3 additions & 1 deletion crates/typos-cli/tests/cli_tests.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#[test]
#[cfg(feature = "dict")]
fn cli_tests() {
trycmd::TestCases::new().case("tests/cmd/*.toml");
trycmd::TestCases::new()
.case("tests/cmd/*.toml")
.case("tests/cmd/*.trycmd");
}
9 changes: 5 additions & 4 deletions crates/typos-cli/tests/cmd/help.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ Arguments:
[PATH]... Paths to check with `-` for stdin [default: .]
Options:
-j, --threads <THREADS> The approximate number of threads to use [default: 0]
--force-exclude Respect excluded files even for paths passed explicitly
-h, --help Print help
-V, --version Print version
--file-list <FILE_LIST> Read the list of newline separated paths from file or stdin (if `-`)
-j, --threads <THREADS> The approximate number of threads to use [default: 0]
--force-exclude Respect excluded files even for paths passed explicitly
-h, --help Print help
-V, --version Print version
Config:
-c, --config <CUSTOM_CONFIG> Custom config file
Expand Down
8 changes: 8 additions & 0 deletions crates/typos-cli/tests/cmd/stdin-paths.in/_typos.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[files]
extend-exclude = ["_typos.toml"]

[default.extend-identifiers]
hello = "goodbye"

[type.fail]
extend-glob = ["*.fail"]
1 change: 1 addition & 0 deletions crates/typos-cli/tests/cmd/stdin-paths.in/a.fail
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
hello
1 change: 1 addition & 0 deletions crates/typos-cli/tests/cmd/stdin-paths.in/b.fail
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
hello
1 change: 1 addition & 0 deletions crates/typos-cli/tests/cmd/stdin-paths.in/c.fail
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
hello
1 change: 1 addition & 0 deletions crates/typos-cli/tests/cmd/stdin-paths.in/d.fail
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
hello
22 changes: 22 additions & 0 deletions crates/typos-cli/tests/cmd/stdin-paths.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
bin.name = "typos"
args = "--file-list -"
stdin = """
b.fail
d.fail
"""
stdout = """
error: `hello` should be `goodbye`
--> b.fail:1:1
|
1 | hello
| ^^^^^
|
error: `hello` should be `goodbye`
--> d.fail:1:1
|
1 | hello
| ^^^^^
|
"""
stderr = ""
status.code = 2
8 changes: 8 additions & 0 deletions crates/typos-cli/tests/cmd/stdin-paths0.in/_typos.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[files]
extend-exclude = ["_typos.toml"]

[default.extend-identifiers]
hello = "goodbye"

[type.fail]
extend-glob = ["*.fail"]
1 change: 1 addition & 0 deletions crates/typos-cli/tests/cmd/stdin-paths0.in/a.fail
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
hello
1 change: 1 addition & 0 deletions crates/typos-cli/tests/cmd/stdin-paths0.in/b.fail
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
hello
1 change: 1 addition & 0 deletions crates/typos-cli/tests/cmd/stdin-paths0.in/c.fail
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
hello
1 change: 1 addition & 0 deletions crates/typos-cli/tests/cmd/stdin-paths0.in/d.fail
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
hello

0 comments on commit e2b9743

Please sign in to comment.