mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 03:27:44 +00:00
* ls: Implement --zero flag. (#2929) This flag can be used to provide a easy machine parseable output from ls, as discussed in the GNU bug report https://debbugs.gnu.org/cgi/bugreport.cgi?bug=49716. There are some peculiarities with this flag: - Current implementation of GNU ls of the `--zero` flag implies some other flags. Those can be overridden by setting those flags after `--zero` in the command line. - This flag is not compatible with `--dired`. This patch is not 100% compliant with GNU ls: GNU ls `--zero` will fail if `--dired` and `-l` are set, while with this patch only `--dired` is needed for the command to fail. We also add `--dired` flag to the parser, with no additional behaviour change. Testing done: ``` $ bash util/build-gnu.sh [...] $ bash util/run-gnu-test.sh tests/ls/zero-option.sh [...] PASS: tests/ls/zero-option.sh ============================================================================ Testsuite summary for GNU coreutils 9.1.36-8ec11 ============================================================================ # TOTAL: 1 # PASS: 1 # SKIP: 0 # XFAIL: 0 # FAIL: 0 # XPASS: 0 # ERROR: 0 ============================================================================ ``` * Use the US way to spell Behavior * Fix formatting with cargo fmt -- tests/by-util/test_ls.rs * Simplify --zero flag overriding logic by using index_of Also, allow multiple --zero flags, as this is possible with GNU ls command. Only the last one is taken into account. Co-authored-by: Sylvestre Ledru <sledru@mozilla.com>
This commit is contained in:
parent
38679f1c1b
commit
4ad0d5c5a3
2 changed files with 228 additions and 14 deletions
|
@ -796,6 +796,126 @@ fn test_ls_commas() {
|
|||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_ls_zero() {
|
||||
let scene = TestScenario::new(util_name!());
|
||||
let at = &scene.fixtures;
|
||||
at.mkdir("0-test-zero");
|
||||
at.touch(&at.plus_as_string("2-test-zero"));
|
||||
at.touch(&at.plus_as_string("3-test-zero"));
|
||||
|
||||
let ignored_opts = [
|
||||
"--quoting-style=c",
|
||||
"--color=always",
|
||||
"-m",
|
||||
"--hide-control-chars",
|
||||
];
|
||||
|
||||
scene
|
||||
.ucmd()
|
||||
.arg("--zero")
|
||||
.succeeds()
|
||||
.stdout_only("0-test-zero\x002-test-zero\x003-test-zero\x00");
|
||||
|
||||
for opt in ignored_opts {
|
||||
scene
|
||||
.ucmd()
|
||||
.args(&[opt, "--zero"])
|
||||
.succeeds()
|
||||
.stdout_only("0-test-zero\x002-test-zero\x003-test-zero\x00");
|
||||
}
|
||||
|
||||
scene
|
||||
.ucmd()
|
||||
.args(&["--zero", "--quoting-style=c"])
|
||||
.succeeds()
|
||||
.stdout_only("\"0-test-zero\"\x00\"2-test-zero\"\x00\"3-test-zero\"\x00");
|
||||
|
||||
scene
|
||||
.ucmd()
|
||||
.args(&["--zero", "--color=always"])
|
||||
.succeeds()
|
||||
.stdout_only("\x1b[1;34m0-test-zero\x1b[0m\x002-test-zero\x003-test-zero\x00");
|
||||
|
||||
scene
|
||||
.ucmd()
|
||||
.args(&["--zero", "-m"])
|
||||
.succeeds()
|
||||
.stdout_only("0-test-zero, 2-test-zero, 3-test-zero\x00");
|
||||
|
||||
scene
|
||||
.ucmd()
|
||||
.args(&["--zero", "--hide-control-chars"])
|
||||
.succeeds()
|
||||
.stdout_only("0-test-zero\x002-test-zero\x003-test-zero\x00");
|
||||
|
||||
scene
|
||||
.ucmd()
|
||||
.args(&["--zero", "--quoting-style=c", "--zero"])
|
||||
.succeeds()
|
||||
.stdout_only("0-test-zero\x002-test-zero\x003-test-zero\x00");
|
||||
|
||||
#[cfg(unix)]
|
||||
{
|
||||
at.touch(&at.plus_as_string("1\ntest-zero"));
|
||||
|
||||
let ignored_opts = [
|
||||
"--quoting-style=c",
|
||||
"--color=always",
|
||||
"-m",
|
||||
"--hide-control-chars",
|
||||
];
|
||||
|
||||
scene
|
||||
.ucmd()
|
||||
.arg("--zero")
|
||||
.succeeds()
|
||||
.stdout_only("0-test-zero\x001\ntest-zero\x002-test-zero\x003-test-zero\x00");
|
||||
|
||||
for opt in ignored_opts {
|
||||
scene
|
||||
.ucmd()
|
||||
.args(&[opt, "--zero"])
|
||||
.succeeds()
|
||||
.stdout_only("0-test-zero\x001\ntest-zero\x002-test-zero\x003-test-zero\x00");
|
||||
}
|
||||
|
||||
scene
|
||||
.ucmd()
|
||||
.args(&["--zero", "--quoting-style=c"])
|
||||
.succeeds()
|
||||
.stdout_only(
|
||||
"\"0-test-zero\"\x00\"1\\ntest-zero\"\x00\"2-test-zero\"\x00\"3-test-zero\"\x00",
|
||||
);
|
||||
|
||||
scene
|
||||
.ucmd()
|
||||
.args(&["--zero", "--color=always"])
|
||||
.succeeds()
|
||||
.stdout_only(
|
||||
"\x1b[1;34m0-test-zero\x1b[0m\x001\ntest-zero\x002-test-zero\x003-test-zero\x00",
|
||||
);
|
||||
|
||||
scene
|
||||
.ucmd()
|
||||
.args(&["--zero", "-m"])
|
||||
.succeeds()
|
||||
.stdout_only("0-test-zero, 1\ntest-zero, 2-test-zero, 3-test-zero\x00");
|
||||
|
||||
scene
|
||||
.ucmd()
|
||||
.args(&["--zero", "--hide-control-chars"])
|
||||
.succeeds()
|
||||
.stdout_only("0-test-zero\x001?test-zero\x002-test-zero\x003-test-zero\x00");
|
||||
}
|
||||
|
||||
scene
|
||||
.ucmd()
|
||||
.args(&["-l", "--zero"])
|
||||
.succeeds()
|
||||
.stdout_contains("total ");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_ls_commas_trailing() {
|
||||
let scene = TestScenario::new(util_name!());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue