mirror of
https://github.com/uutils/coreutils.git
synced 2025-12-23 08:47:37 +00:00
Merge branch 'main' into nextest-profile-cmd
This commit is contained in:
commit
db5e4ce528
6 changed files with 142 additions and 190 deletions
150
Cargo.lock
generated
150
Cargo.lock
generated
|
|
@ -32,12 +32,6 @@ dependencies = [
|
|||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anes"
|
||||
version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
|
||||
|
||||
[[package]]
|
||||
name = "ansi-width"
|
||||
version = "0.1.0"
|
||||
|
|
@ -303,12 +297,6 @@ version = "1.5.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
|
||||
|
||||
[[package]]
|
||||
name = "cast"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.27"
|
||||
|
|
@ -350,33 +338,6 @@ dependencies = [
|
|||
"windows-link 0.2.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ciborium"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e"
|
||||
dependencies = [
|
||||
"ciborium-io",
|
||||
"ciborium-ll",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ciborium-io"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757"
|
||||
|
||||
[[package]]
|
||||
name = "ciborium-ll"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9"
|
||||
dependencies = [
|
||||
"ciborium-io",
|
||||
"half",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clang-sys"
|
||||
version = "1.8.1"
|
||||
|
|
@ -763,39 +724,6 @@ dependencies = [
|
|||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "criterion"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3bf7af66b0989381bd0be551bd7cc91912a655a58c6918420c9527b1fd8b4679"
|
||||
dependencies = [
|
||||
"anes",
|
||||
"cast",
|
||||
"ciborium",
|
||||
"clap",
|
||||
"criterion-plot",
|
||||
"itertools 0.13.0",
|
||||
"num-traits",
|
||||
"oorandom",
|
||||
"plotters",
|
||||
"rayon",
|
||||
"regex",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tinytemplate",
|
||||
"walkdir",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "criterion-plot"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
|
||||
dependencies = [
|
||||
"cast",
|
||||
"itertools 0.10.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-deque"
|
||||
version = "0.8.6"
|
||||
|
|
@ -1620,15 +1548,6 @@ version = "1.70.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.10.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.13.0"
|
||||
|
|
@ -1665,7 +1584,7 @@ dependencies = [
|
|||
"portable-atomic",
|
||||
"portable-atomic-util",
|
||||
"serde_core",
|
||||
"windows-sys 0.59.0",
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1752,7 +1671,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"windows-targets 0.52.6",
|
||||
"windows-targets 0.53.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1963,7 +1882,7 @@ version = "0.50.3"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
|
||||
dependencies = [
|
||||
"windows-sys 0.59.0",
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2077,12 +1996,6 @@ dependencies = [
|
|||
"pkg-config",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "oorandom"
|
||||
version = "11.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
|
||||
|
||||
[[package]]
|
||||
name = "ordered-multimap"
|
||||
version = "0.7.3"
|
||||
|
|
@ -2209,34 +2122,6 @@ dependencies = [
|
|||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "plotters"
|
||||
version = "0.3.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
"plotters-backend",
|
||||
"plotters-svg",
|
||||
"wasm-bindgen",
|
||||
"web-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "plotters-backend"
|
||||
version = "0.3.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a"
|
||||
|
||||
[[package]]
|
||||
name = "plotters-svg"
|
||||
version = "0.3.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670"
|
||||
dependencies = [
|
||||
"plotters-backend",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "portable-atomic"
|
||||
version = "1.11.1"
|
||||
|
|
@ -2568,7 +2453,7 @@ dependencies = [
|
|||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys 0.11.0",
|
||||
"windows-sys 0.59.0",
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2874,7 +2759,7 @@ dependencies = [
|
|||
"getrandom 0.3.3",
|
||||
"once_cell",
|
||||
"rustix",
|
||||
"windows-sys 0.59.0",
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2991,16 +2876,6 @@ dependencies = [
|
|||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tinytemplate"
|
||||
version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "0.6.11"
|
||||
|
|
@ -3468,7 +3343,7 @@ name = "uu_factor_benches"
|
|||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"array-init",
|
||||
"criterion",
|
||||
"codspeed-divan-compat",
|
||||
"num-prime",
|
||||
"rand 0.9.2",
|
||||
"rand_chacha 0.9.0",
|
||||
|
|
@ -4111,6 +3986,7 @@ dependencies = [
|
|||
"clap",
|
||||
"fluent",
|
||||
"libc",
|
||||
"tempfile",
|
||||
"thiserror 2.0.17",
|
||||
"uucore",
|
||||
]
|
||||
|
|
@ -4513,16 +4389,6 @@ dependencies = [
|
|||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "web-sys"
|
||||
version = "0.3.77"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
|
||||
dependencies = [
|
||||
"js-sys",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "web-time"
|
||||
version = "1.1.0"
|
||||
|
|
@ -4564,7 +4430,7 @@ version = "0.1.11"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
|
||||
dependencies = [
|
||||
"windows-sys 0.59.0",
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
|
|||
|
|
@ -19,10 +19,13 @@ path = "src/test.rs"
|
|||
|
||||
[dependencies]
|
||||
clap = { workspace = true }
|
||||
libc = { workspace = true }
|
||||
uucore = { workspace = true, features = ["process"] }
|
||||
thiserror = { workspace = true }
|
||||
fluent = { workspace = true }
|
||||
libc = { workspace = true }
|
||||
thiserror = { workspace = true }
|
||||
uucore = { workspace = true, features = ["process"] }
|
||||
|
||||
[dev-dependencies]
|
||||
tempfile = { workspace = true }
|
||||
|
||||
[[bin]]
|
||||
name = "test"
|
||||
|
|
|
|||
|
|
@ -205,24 +205,26 @@ fn integers(a: &OsStr, b: &OsStr, op: &OsStr) -> ParseResult<bool> {
|
|||
|
||||
/// Operations to compare files metadata
|
||||
/// `a` is the left hand side
|
||||
/// `b` is the left hand side
|
||||
/// `b` is the right hand side
|
||||
/// `op` the operation (ex: -ef, -nt, etc)
|
||||
fn files(a: &OsStr, b: &OsStr, op: &OsStr) -> ParseResult<bool> {
|
||||
// Don't manage the error. GNU doesn't show error when doing
|
||||
// test foo -nt bar
|
||||
let (Ok(f_a), Ok(f_b)) = (fs::metadata(a), fs::metadata(b)) else {
|
||||
return Ok(false);
|
||||
let f_a = fs::metadata(a);
|
||||
let f_b = fs::metadata(b);
|
||||
|
||||
let result = match (op.to_str(), f_a, f_b) {
|
||||
#[cfg(unix)]
|
||||
(Some("-ef"), Ok(f_a), Ok(f_b)) => f_a.ino() == f_b.ino() && f_a.dev() == f_b.dev(),
|
||||
#[cfg(not(unix))]
|
||||
(Some("-ef"), Ok(_), Ok(_)) => unimplemented!(),
|
||||
(Some("-nt"), Ok(f_a), Ok(f_b)) => f_a.modified().unwrap() > f_b.modified().unwrap(),
|
||||
(Some("-nt"), Ok(_), _) => true,
|
||||
(Some("-ot"), Ok(f_a), Ok(f_b)) => f_a.modified().unwrap() < f_b.modified().unwrap(),
|
||||
(Some("-ot"), _, Ok(_)) => true,
|
||||
(Some("-ef" | "-nt" | "-ot"), _, _) => false,
|
||||
(_, _, _) => return Err(ParseError::UnknownOperator(op.quote().to_string())),
|
||||
};
|
||||
|
||||
Ok(match op.to_str() {
|
||||
#[cfg(unix)]
|
||||
Some("-ef") => f_a.ino() == f_b.ino() && f_a.dev() == f_b.dev(),
|
||||
#[cfg(not(unix))]
|
||||
Some("-ef") => unimplemented!(),
|
||||
Some("-nt") => f_a.modified().unwrap() > f_b.modified().unwrap(),
|
||||
Some("-ot") => f_a.modified().unwrap() < f_b.modified().unwrap(),
|
||||
_ => return Err(ParseError::UnknownOperator(op.quote().to_string())),
|
||||
})
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn isatty(fd: &OsStr) -> ParseResult<bool> {
|
||||
|
|
@ -347,8 +349,81 @@ fn path(path: &OsStr, condition: &PathCondition) -> bool {
|
|||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::integers;
|
||||
use std::ffi::OsStr;
|
||||
use super::*;
|
||||
use std::{ffi::OsStr, time::UNIX_EPOCH};
|
||||
use tempfile::NamedTempFile;
|
||||
|
||||
#[test]
|
||||
fn test_files_with_unknown_op() {
|
||||
let a = NamedTempFile::new().unwrap();
|
||||
let b = NamedTempFile::new().unwrap();
|
||||
let a = OsStr::new(a.path());
|
||||
let b = OsStr::new(b.path());
|
||||
let op = OsStr::new("unknown_op");
|
||||
|
||||
assert!(files(a, b, op).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(unix)]
|
||||
fn test_files_with_ef_op() {
|
||||
let a = NamedTempFile::new().unwrap();
|
||||
let b = NamedTempFile::new().unwrap();
|
||||
let a = OsStr::new(a.path());
|
||||
let b = OsStr::new(b.path());
|
||||
let op = OsStr::new("-ef");
|
||||
|
||||
assert!(files(a, a, op).unwrap());
|
||||
assert!(!files(a, b, op).unwrap());
|
||||
assert!(!files(b, a, op).unwrap());
|
||||
|
||||
let existing_file = a;
|
||||
let non_existing_file = OsStr::new("non_existing_file");
|
||||
|
||||
assert!(!files(existing_file, non_existing_file, op).unwrap());
|
||||
assert!(!files(non_existing_file, existing_file, op).unwrap());
|
||||
assert!(!files(non_existing_file, non_existing_file, op).unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_files_with_nt_op() {
|
||||
let older_file = NamedTempFile::new().unwrap();
|
||||
older_file.as_file().set_modified(UNIX_EPOCH).unwrap();
|
||||
let older_file = OsStr::new(older_file.path());
|
||||
let newer_file = NamedTempFile::new().unwrap();
|
||||
let newer_file = OsStr::new(newer_file.path());
|
||||
let op = OsStr::new("-nt");
|
||||
|
||||
assert!(files(newer_file, older_file, op).unwrap());
|
||||
assert!(!files(older_file, newer_file, op).unwrap());
|
||||
|
||||
let existing_file = newer_file;
|
||||
let non_existing_file = OsStr::new("non_existing_file");
|
||||
|
||||
assert!(files(existing_file, non_existing_file, op).unwrap());
|
||||
assert!(!files(non_existing_file, existing_file, op).unwrap());
|
||||
assert!(!files(non_existing_file, non_existing_file, op).unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_files_with_ot_op() {
|
||||
let older_file = NamedTempFile::new().unwrap();
|
||||
older_file.as_file().set_modified(UNIX_EPOCH).unwrap();
|
||||
let older_file = OsStr::new(older_file.path());
|
||||
let newer_file = NamedTempFile::new().unwrap();
|
||||
let newer_file = OsStr::new(newer_file.path());
|
||||
let op = OsStr::new("-ot");
|
||||
|
||||
assert!(!files(newer_file, older_file, op).unwrap());
|
||||
assert!(files(older_file, newer_file, op).unwrap());
|
||||
|
||||
let existing_file = newer_file;
|
||||
let non_existing_file = OsStr::new("non_existing_file");
|
||||
|
||||
assert!(!files(existing_file, non_existing_file, op).unwrap());
|
||||
assert!(files(non_existing_file, existing_file, op).unwrap());
|
||||
assert!(!files(non_existing_file, non_existing_file, op).unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_integer_op() {
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ publish = false
|
|||
|
||||
[dev-dependencies]
|
||||
array-init = "2.0.0"
|
||||
criterion = "0.6.0"
|
||||
divan = { workspace = true }
|
||||
rand = "0.9.1"
|
||||
rand_chacha = "0.9.0"
|
||||
num-prime = "0.4.4"
|
||||
|
|
|
|||
|
|
@ -6,9 +6,14 @@
|
|||
// spell-checker:ignore funcs
|
||||
|
||||
use array_init::array_init;
|
||||
use criterion::{BenchmarkId, Criterion, Throughput, criterion_group, criterion_main};
|
||||
use divan::Bencher;
|
||||
|
||||
fn table(c: &mut Criterion) {
|
||||
fn main() {
|
||||
divan::main();
|
||||
}
|
||||
|
||||
#[divan::bench()]
|
||||
fn factor_table(bencher: Bencher) {
|
||||
#[cfg(target_os = "linux")]
|
||||
check_personality();
|
||||
|
||||
|
|
@ -22,21 +27,17 @@ fn table(c: &mut Criterion) {
|
|||
let mut rng = ChaCha8Rng::seed_from_u64(SEED);
|
||||
|
||||
std::iter::repeat_with(move || array_init::<_, _, INPUT_SIZE>(|_| rng.next_u64()))
|
||||
.take(10)
|
||||
.collect::<Vec<_>>()
|
||||
};
|
||||
|
||||
let mut group = c.benchmark_group("table");
|
||||
group.throughput(Throughput::Elements(INPUT_SIZE as _));
|
||||
for a in inputs.take(10) {
|
||||
let a_str = format!("{a:?}");
|
||||
group.bench_with_input(BenchmarkId::new("factor", &a_str), &a, |b, &a| {
|
||||
b.iter(|| {
|
||||
for n in a {
|
||||
let _r = num_prime::nt_funcs::factors(n, None);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
group.finish();
|
||||
bencher.bench(|| {
|
||||
for a in &inputs {
|
||||
for n in a {
|
||||
divan::black_box(num_prime::nt_funcs::factors(*n, None));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
|
|
@ -59,6 +60,3 @@ fn check_personality() {
|
|||
);
|
||||
}
|
||||
}
|
||||
|
||||
criterion_group!(benches, table);
|
||||
criterion_main!(benches);
|
||||
|
|
|
|||
|
|
@ -5,10 +5,8 @@
|
|||
|
||||
// spell-checker:ignore (words) egid euid pseudofloat
|
||||
|
||||
use uutests::at_and_ucmd;
|
||||
use uutests::new_ucmd;
|
||||
use uutests::util::TestScenario;
|
||||
use uutests::util_name;
|
||||
use uutests::{at_and_ucmd, new_ucmd, util_name};
|
||||
|
||||
#[test]
|
||||
fn test_empty_test_equivalent_to_false() {
|
||||
|
|
@ -337,14 +335,26 @@ fn test_file_is_newer_than_and_older_than_itself() {
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn test_non_existing_files() {
|
||||
let scenario = TestScenario::new(util_name!());
|
||||
fn test_file_is_newer_than_non_existing_file() {
|
||||
new_ucmd!()
|
||||
.args(&["non_existing_file", "-nt", "regular_file"])
|
||||
.fails_with_code(1)
|
||||
.no_output();
|
||||
|
||||
let result = scenario
|
||||
.ucmd()
|
||||
.args(&["newer_file", "-nt", "regular_file"])
|
||||
.fails_with_code(1);
|
||||
assert!(result.stderr().is_empty());
|
||||
new_ucmd!()
|
||||
.args(&["regular_file", "-nt", "non_existing_file"])
|
||||
.succeeds()
|
||||
.no_output();
|
||||
|
||||
new_ucmd!()
|
||||
.args(&["non_existing_file", "-ot", "regular_file"])
|
||||
.succeeds()
|
||||
.no_output();
|
||||
|
||||
new_ucmd!()
|
||||
.args(&["regular_file", "-ot", "non_existing_file"])
|
||||
.fails_with_code(1)
|
||||
.no_output();
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue