diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index cf12ee2d7..9e48eb804 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -291,7 +291,13 @@ jobs: shell: bash run: | RUSTDOCFLAGS="-Dwarnings" cargo doc ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} --no-deps --workspace --document-private-items - + - uses: DavidAnson/markdownlint-cli2-action@v9 + with: + command: fix + globs: | + *.md + docs/src/*.md + src/uu/*/*.md min_version: name: MinRustV # Minimum supported rust version (aka, MinSRV or MSRV) @@ -408,6 +414,16 @@ jobs: make test env: RUST_BACKTRACE: "1" + - name: "`make install`" + shell: bash + run: | + DESTDIR=/tmp/ make PROFILE=release install + # Check that the manpage is present + test -f /tmp/usr/local/share/man/man1/whoami.1 + # Check that the completion is present + test -f /tmp/usr/local/share/zsh/site-functions/_install + env: + RUST_BACKTRACE: "1" build_rust_stable: diff --git a/.github/workflows/GnuTests.yml b/.github/workflows/GnuTests.yml index fd2d66835..7c8c307ec 100644 --- a/.github/workflows/GnuTests.yml +++ b/.github/workflows/GnuTests.yml @@ -86,7 +86,7 @@ jobs: run: | ## Install dependencies sudo apt-get update - sudo apt-get install autoconf autopoint bison texinfo gperf gcc g++ gdb python3-pyinotify jq valgrind libexpect-perl + sudo apt-get install -y autoconf autopoint bison texinfo gperf gcc g++ gdb python3-pyinotify jq valgrind libexpect-perl libacl1-dev libattr1-dev libcap-dev - name: Add various locales shell: bash run: | @@ -316,8 +316,8 @@ jobs: - name: Install dependencies run: | ## Install dependencies - sudo apt update - sudo apt install autoconf autopoint bison texinfo gperf gcc g++ gdb python3-pyinotify jq valgrind libexpect-perl -y + sudo apt-get update + sudo apt-get install -y autoconf autopoint bison texinfo gperf gcc g++ gdb python3-pyinotify jq valgrind libexpect-perl libacl1-dev libattr1-dev libcap-dev - name: Add various locales run: | ## Add various locales diff --git a/.markdownlint.yaml b/.markdownlint.yaml new file mode 100644 index 000000000..11b733e0b --- /dev/null +++ b/.markdownlint.yaml @@ -0,0 +1,6 @@ +# Disable 'Line length'. Doesn't provide much values +MD013: false +# Disable 'Fenced code blocks should have a language specified' +# Doesn't provide much in src/ to enforce it +MD040: false + diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index d196c6e95..39474f7ab 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -116,7 +116,7 @@ the community. This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at -https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. +. Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). @@ -124,5 +124,5 @@ enforcement ladder](https://github.com/mozilla/diversity). [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see the FAQ at -https://www.contributor-covenant.org/faq. Translations are available at -https://www.contributor-covenant.org/translations. +. Translations are available at +. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7a749ebac..f2e5763a1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -38,20 +38,19 @@ search the issues to make sure no one else is working on it. ## Platforms -We take pride in supporting many operating systems and architectures. +We take pride in supporting many operating systems and architectures. **Tip:** -For Windows, Microsoft provides some images (VMWare, Hyper-V, VirtualBox and Parallels) +For Windows, Microsoft provides some images (VMWare, Hyper-V, VirtualBox and Parallels) for development: -https://developer.microsoft.com/windows/downloads/virtual-machines/ - + ## Commit messages To help the project maintainers review pull requests from contributors across numerous utilities, the team has settled on conventions for commit messages. -From http://git-scm.com/book/ch5-2.html: +From : ``` Short (50 chars or less) summary of changes diff --git a/Cargo.lock b/Cargo.lock index fd2385a64..e4f489eae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -67,7 +67,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -267,6 +267,16 @@ dependencies = [ "os_str_bytes", ] +[[package]] +name = "clap_mangen" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0f09a0ca8f0dd8ac92c546b426f466ef19828185c6d504c80c48c9c2768ed9" +dependencies = [ + "clap", + "roff", +] + [[package]] name = "codespan-reporting" version = "0.11.1" @@ -293,7 +303,7 @@ dependencies = [ "lazy_static", "libc", "unicode-width", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -321,14 +331,15 @@ checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" name = "coreutils" version = "0.0.17" dependencies = [ - "atty", "chrono", "clap", "clap_complete", + "clap_mangen", "conv", "filetime", "glob", "hex-literal", + "is-terminal", "libc", "nix", "once_cell", @@ -635,7 +646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1631ca6e3c59112501a9d87fd86f21591ff77acd31331e8a73f8d80a65bbdd71" dependencies = [ "nix", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -834,7 +845,7 @@ dependencies = [ "cfg-if", "libc", "redox_syscall", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -1045,6 +1056,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "hex" version = "0.4.3" @@ -1139,6 +1156,28 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59ce5ef949d49ee85593fc4d3f3f95ad61657076395cbbce23e2121fc5542074" +[[package]] +name = "io-lifetimes" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" +dependencies = [ + "libc", + "windows-sys 0.45.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0a45d56fe973d6db23972bf5bc46f988a4a2385deac9cc29572f09daef" +dependencies = [ + "hermit-abi 0.3.1", + "io-lifetimes 1.0.5", + "rustix 0.36.8", + "windows-sys 0.45.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -1235,6 +1274,12 @@ version = "0.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + [[package]] name = "lock_api" version = "0.4.9" @@ -1326,7 +1371,7 @@ dependencies = [ "libc", "log", "wasi", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -1415,7 +1460,7 @@ version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", ] @@ -1436,9 +1481,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "once_cell" -version = "1.16.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "onig" @@ -1545,7 +1590,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -1693,7 +1738,7 @@ dependencies = [ "byteorder", "hex", "lazy_static", - "rustix", + "rustix 0.35.13", ] [[package]] @@ -1833,13 +1878,19 @@ dependencies = [ [[package]] name = "rlimit" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7278a1ec8bfd4a4e07515c589f5ff7b309a373f987393aef44813d9dcf87aa3" +checksum = "f8a29d87a652dc4d43c586328706bb5cdff211f3f39a530f240b53f7221dab8e" dependencies = [ "libc", ] +[[package]] +name = "roff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b833d8d034ea094b1ea68aa6d5c740e0d04bad9d16568d08ba6f76823a114316" + [[package]] name = "rstest" version = "0.16.0" @@ -1899,10 +1950,24 @@ checksum = "727a1a6d65f786ec22df8a81ca3121107f235970dc1705ed681d3e6e8b9cd5f9" dependencies = [ "bitflags", "errno", - "io-lifetimes", + "io-lifetimes 0.7.5", "libc", - "linux-raw-sys", - "windows-sys", + "linux-raw-sys 0.0.46", + "windows-sys 0.42.0", +] + +[[package]] +name = "rustix" +version = "0.36.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes 1.0.5", + "libc", + "linux-raw-sys 0.1.4", + "windows-sys 0.45.0", ] [[package]] @@ -1934,9 +1999,9 @@ checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" [[package]] name = "selinux" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "966a861c0b329c3078d82b404f7086009487123fd0cc905a9caac55d8b13bee1" +checksum = "a00576725d21b588213fbd4af84cd7e4cc4304e8e9bd6c0f5a1498a3e2ca6a51" dependencies = [ "bitflags", "libc", @@ -2053,6 +2118,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "sm3" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f943a7c5e3089f2bd046221d1e9f4fa59396bf0fe966360983649683086215da" +dependencies = [ + "digest", +] + [[package]] name = "smallvec" version = "1.10.0" @@ -2161,8 +2235,8 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40ca90c434fd12083d1a6bdcbe9f92a14f96c8a1ba600ba451734ac334521f7a" dependencies = [ - "rustix", - "windows-sys", + "rustix 0.35.13", + "windows-sys 0.42.0", ] [[package]] @@ -2334,8 +2408,8 @@ dependencies = [ name = "uu_cat" version = "0.0.17" dependencies = [ - "atty", "clap", + "is-terminal", "nix", "thiserror", "uucore", @@ -2391,6 +2465,7 @@ name = "uu_cksum" version = "0.0.17" dependencies = [ "clap", + "hex", "uucore", ] @@ -2432,9 +2507,9 @@ dependencies = [ name = "uu_cut" version = "0.0.17" dependencies = [ - "atty", "bstr", "clap", + "is-terminal", "memchr", "uucore", ] @@ -2447,7 +2522,7 @@ dependencies = [ "clap", "libc", "uucore", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2503,7 +2578,7 @@ dependencies = [ "clap", "glob", "uucore", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2595,17 +2670,10 @@ dependencies = [ name = "uu_hashsum" version = "0.0.17" dependencies = [ - "blake2b_simd", - "blake3", "clap", - "digest", "hex", - "md-5", "memchr", "regex", - "sha1", - "sha2", - "sha3", "uucore", ] @@ -2634,7 +2702,7 @@ dependencies = [ "clap", "hostname", "uucore", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2705,10 +2773,10 @@ dependencies = [ name = "uu_ls" version = "0.0.17" dependencies = [ - "atty", "chrono", "clap", "glob", + "is-terminal", "lscolors", "number_prefix", "once_cell", @@ -2759,9 +2827,9 @@ dependencies = [ name = "uu_more" version = "0.0.17" dependencies = [ - "atty", "clap", "crossterm", + "is-terminal", "nix", "unicode-segmentation", "unicode-width", @@ -2801,8 +2869,8 @@ dependencies = [ name = "uu_nohup" version = "0.0.17" dependencies = [ - "atty", "clap", + "is-terminal", "libc", "uucore", ] @@ -2936,7 +3004,7 @@ dependencies = [ "libc", "uucore", "walkdir", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -3079,7 +3147,7 @@ dependencies = [ "libc", "nix", "uucore", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -3097,16 +3165,16 @@ dependencies = [ name = "uu_tail" version = "0.0.17" dependencies = [ - "atty", "clap", "fundu", + "is-terminal", "libc", "memchr", "notify", "same-file", "uucore", "winapi-util", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -3146,7 +3214,7 @@ dependencies = [ "filetime", "time", "uucore", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -3186,8 +3254,8 @@ dependencies = [ name = "uu_tty" version = "0.0.17" dependencies = [ - "atty", "clap", + "is-terminal", "nix", "uucore", ] @@ -3282,7 +3350,7 @@ dependencies = [ "clap", "libc", "uucore", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -3299,24 +3367,34 @@ dependencies = [ name = "uucore" version = "0.0.17" dependencies = [ + "blake2b_simd", + "blake3", "clap", "data-encoding", "data-encoding-macro", + "digest", "dns-lookup", "dunce", "glob", + "hex", "itertools", "libc", + "md-5", + "memchr", "nix", "once_cell", "os_display", + "sha1", + "sha2", + "sha3", + "sm3", "thiserror", "time", "uucore_procs", "walkdir", "wild", "winapi-util", - "windows-sys", + "windows-sys 0.42.0", "z85", ] @@ -3478,46 +3556,70 @@ dependencies = [ ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.0" +name = "windows-sys" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" [[package]] name = "windows_aarch64_msvc" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" [[package]] name = "windows_i686_gnu" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" [[package]] name = "windows_i686_msvc" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" [[package]] name = "windows_x86_64_gnu" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" [[package]] name = "windows_x86_64_msvc" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" [[package]] name = "xattr" diff --git a/Cargo.toml b/Cargo.toml index ebd8685ca..d8d43b252 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ # coreutils (uutils) # * see the repository LICENSE, README, and CONTRIBUTING files for more information -# spell-checker:ignore (libs) libselinux gethostid procfs bigdecimal kqueue fundu +# spell-checker:ignore (libs) libselinux gethostid procfs bigdecimal kqueue fundu mangen [package] name = "coreutils" @@ -263,7 +263,6 @@ feat_os_windows_legacy = [ test = [ "uu_test" ] [workspace.dependencies] -atty = "0.2" bigdecimal = "0.3" binary-heap-plus = "0.5.0" bstr = "1.0" @@ -272,6 +271,7 @@ byteorder = "1.3.2" chrono = { version="^0.4.23", default-features=false, features=["std", "alloc", "clock"]} clap = { version = "4.0", features = ["wrap_help", "cargo"] } clap_complete = "4.0" +clap_mangen = "0.2" compare = "0.1.0" coz = { version = "0.1.3" } crossterm = ">=0.19" @@ -287,6 +287,7 @@ gcd = "2.2" glob = "0.3.0" half = "2.1" indicatif = "0.17" +is-terminal = "0.4.3" itertools = "0.10.0" libc = "0.2.139" lscolors = { version = "0.13.0", default-features=false, features = ["nu-ansi-term"] } @@ -312,7 +313,7 @@ redox_syscall = "0.2" regex = "1.7.1" rust-ini = "0.18.0" same-file = "1.0.6" -selinux = "0.3" +selinux = "0.4" signal-hook = "0.3.14" smallvec = { version = "1.10", features = ["union"] } strum = "0.24.1" @@ -332,6 +333,16 @@ windows-sys = { version="0.42.0", default-features=false } xattr = "0.2.3" zip = { version = "0.6.3", default_features=false, features=["deflate"] } +hex = "0.4.3" +md-5 = "0.10.5" +sha1 = "0.10.1" +sha2 = "0.10.2" +sha3 = "0.10.6" +blake2b_simd = "1.0.1" +blake3 = "1.3.2" +sm3 = "0.4.1" +digest = "0.10.6" + uucore = { version=">=0.0.17", package="uucore", path="src/uucore" } uucore_procs = { version=">=0.0.17", package="uucore_procs", path="src/uucore_procs" } uu_ls = { version=">=0.0.17", path="src/uu/ls" } @@ -342,6 +353,7 @@ clap = { workspace=true } once_cell = { workspace=true } uucore = { workspace=true } clap_complete = { workspace=true } +clap_mangen = { workspace=true } phf = { workspace=true } selinux = { workspace=true, optional = true } textwrap = { workspace=true } @@ -476,13 +488,13 @@ time = { workspace=true, features=["local-offset"] } unindent = "0.1" uucore = { workspace=true, features=["entries", "process", "signals"] } walkdir = { workspace=true } -atty = { workspace=true } +is-terminal = { workspace=true } hex-literal = "0.3.1" rstest = "0.16.0" [target.'cfg(any(target_os = "linux", target_os = "android"))'.dev-dependencies] procfs = { version = "0.14", default-features = false } -rlimit = "0.8.3" +rlimit = "0.9.1" [target.'cfg(unix)'.dev-dependencies] nix = { workspace=true, features=["process", "signal", "user"] } diff --git a/DEVELOPER_INSTRUCTIONS.md b/DEVELOPER_INSTRUCTIONS.md index 28deb2677..3641f57b9 100644 --- a/DEVELOPER_INSTRUCTIONS.md +++ b/DEVELOPER_INSTRUCTIONS.md @@ -1,21 +1,19 @@ -Documentation -------------- +# Documentation The source of the documentation is available on: -https://uutils.github.io/dev/coreutils/ + The documentation is updated everyday on this repository: -https://github.com/uutils/uutils.github.io/ + -Running GNU tests ------------------ +## Running GNU tests -- Check out https://github.com/coreutils/coreutils next to your fork as gnu -- Check out https://github.com/coreutils/gnulib next to your fork as gnulib +- Check out next to your fork as gnu +- Check out next to your fork as gnulib - Rename the checkout of your fork to uutils At the end you should have uutils, gnu and gnulib checked out next to each other. @@ -23,9 +21,7 @@ At the end you should have uutils, gnu and gnulib checked out next to each other - Run `cd uutils && ./util/build-gnu.sh && cd ..` to get everything ready (this may take a while) - Finally, you can run tests with `bash uutils/util/run-gnu-test.sh `. Instead of `` insert the tests you want to run, e.g. `tests/misc/wc-proc.sh`. - -Code Coverage Report Generation ---------------------------------- +## Code Coverage Report Generation @@ -35,14 +31,14 @@ Code coverage report can be generated using [grcov](https://github.com/mozilla/g To generate [gcov-based](https://github.com/mozilla/grcov#example-how-to-generate-gcda-files-for-a-rust-project) coverage report -```bash -$ export CARGO_INCREMENTAL=0 -$ export RUSTFLAGS="-Zprofile -Ccodegen-units=1 -Copt-level=0 -Clink-dead-code -Coverflow-checks=off -Zpanic_abort_tests -Cpanic=abort" -$ export RUSTDOCFLAGS="-Cpanic=abort" -$ cargo build # e.g., --features feat_os_unix -$ cargo test # e.g., --features feat_os_unix test_pathchk -$ grcov . -s . --binary-path ./target/debug/ -t html --branch --ignore-not-existing --ignore build.rs --excl-br-line "^\s*((debug_)?assert(_eq|_ne)?\#\[derive\()" -o ./target/debug/coverage/ -$ # open target/debug/coverage/index.html in browser +```shell +export CARGO_INCREMENTAL=0 +export RUSTFLAGS="-Zprofile -Ccodegen-units=1 -Copt-level=0 -Clink-dead-code -Coverflow-checks=off -Zpanic_abort_tests -Cpanic=abort" +export RUSTDOCFLAGS="-Cpanic=abort" +cargo build # e.g., --features feat_os_unix +cargo test # e.g., --features feat_os_unix test_pathchk +grcov . -s . --binary-path ./target/debug/ -t html --branch --ignore-not-existing --ignore build.rs --excl-br-line "^\s*((debug_)?assert(_eq|_ne)?\#\[derive\()" -o ./target/debug/coverage/ +# open target/debug/coverage/index.html in browser ``` if changes are not reflected in the report then run `cargo clean` and run the above commands. @@ -52,19 +48,21 @@ if changes are not reflected in the report then run `cargo clean` and run the ab If you are using stable version of Rust that doesn't enable code coverage instrumentation by default then add `-Z-Zinstrument-coverage` flag to `RUSTFLAGS` env variable specified above. - -pre-commit hooks ----------------- +## pre-commit hooks A configuration for `pre-commit` is provided in the repository. It allows automatically checking every git commit you make to ensure it compiles, and passes `clippy` and `rustfmt` without warnings. To use the provided hook: 1. [Install `pre-commit`](https://pre-commit.com/#install) -2. Run `pre-commit install` while in the repository directory +1. Run `pre-commit install` while in the repository directory Your git commits will then automatically be checked. If a check fails, an error message will explain why, and your commit will be canceled. You can then make the suggested changes, and run `git commit ...` again. -### Using Clippy +## Using Clippy The `msrv` key in the clippy configuration file `clippy.toml` is used to disable lints pertaining to newer features by specifying the minimum supported Rust version (MSRV). However, this key is only supported on `nightly`. To invoke clippy without errors, use `cargo +nightly clippy`. In order to also check tests and non-default crate features, use `cargo +nightly clippy --all-targets --all-features`. + +## Markdown linter + +We use to lint the Markdown files. diff --git a/GNUmakefile b/GNUmakefile index b242bc8ce..81b90d32f 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -349,10 +349,12 @@ endif mkdir -p $(DESTDIR)$(DATAROOTDIR)/zsh/site-functions mkdir -p $(DESTDIR)$(DATAROOTDIR)/bash-completion/completions mkdir -p $(DESTDIR)$(DATAROOTDIR)/fish/vendor_completions.d + mkdir -p $(DESTDIR)$(DATAROOTDIR)/man/man1 $(foreach prog, $(INSTALLEES), \ $(BUILDDIR)/coreutils completion $(prog) zsh > $(DESTDIR)$(DATAROOTDIR)/zsh/site-functions/_$(PROG_PREFIX)$(prog); \ $(BUILDDIR)/coreutils completion $(prog) bash > $(DESTDIR)$(DATAROOTDIR)/bash-completion/completions/$(PROG_PREFIX)$(prog); \ $(BUILDDIR)/coreutils completion $(prog) fish > $(DESTDIR)$(DATAROOTDIR)/fish/vendor_completions.d/$(PROG_PREFIX)$(prog).fish; \ + $(BUILDDIR)/coreutils manpage $(prog) > $(DESTDIR)$(DATAROOTDIR)/man/man1/$(PROG_PREFIX)$(prog).1; \ ) uninstall: diff --git a/README.md b/README.md index 66a0395e9..35ac5dc18 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ----------------------------------------------- - + uutils is an attempt at writing universal (as in cross-platform) CLI utilities in [Rust](http://www.rust-lang.org). @@ -21,11 +21,12 @@ or different behavior might be experienced. To install it: -``` -$ cargo install coreutils -$ ~/.cargo/bin/coreutils +```shell +cargo install coreutils +~/.cargo/bin/coreutils ``` + ## Why? uutils aims to work on as many platforms as possible, to be able to use the @@ -35,6 +36,7 @@ chosen not only because it is fast and safe, but is also excellent for writing cross-platform code. ## Documentation + uutils has both user and developer documentation available: - [User Manual](https://uutils.github.io/user/) @@ -46,8 +48,8 @@ Both can also be generated locally, the instructions for that can be found in th ## Requirements -* Rust (`cargo`, `rustc`) -* GNU Make (optional) +- Rust (`cargo`, `rustc`) +- GNU Make (optional) ### Rust Version @@ -64,9 +66,9 @@ or GNU Make. For either method, we first need to fetch the repository: -```bash -$ git clone https://github.com/uutils/coreutils -$ cd coreutils +```shell +git clone https://github.com/uutils/coreutils +cd coreutils ``` ### Cargo @@ -74,8 +76,8 @@ $ cd coreutils Building uutils using Cargo is easy because the process is the same as for every other Rust program: -```bash -$ cargo build --release +```shell +cargo build --release ``` This command builds the most portable common core set of uutils into a multicall @@ -85,20 +87,20 @@ Additional platform-specific uutils are often available. Building these expanded sets of uutils for a platform (on that platform) is as simple as specifying it as a feature: -```bash -$ cargo build --release --features macos +```shell +cargo build --release --features macos # or ... -$ cargo build --release --features windows +cargo build --release --features windows # or ... -$ cargo build --release --features unix +cargo build --release --features unix ``` If you don't want to build every utility available on your platform into the final binary, you can also specify which ones you want to build manually. For example: -```bash -$ cargo build --features "base32 cat echo rm" --no-default-features +```shell +cargo build --features "base32 cat echo rm" --no-default-features ``` If you don't want to build the multicall binary and would prefer to build @@ -107,8 +109,8 @@ is contained in its own package within the main repository, named "uu_UTILNAME". To build individual utilities, use cargo to build just the specific packages (using the `--package` [aka `-p`] option). For example: -```bash -$ cargo build -p uu_base32 -p uu_cat -p uu_echo -p uu_rm +```shell +cargo build -p uu_base32 -p uu_cat -p uu_echo -p uu_rm ``` ### GNU Make @@ -117,80 +119,80 @@ Building using `make` is a simple process as well. To simply build all available utilities: -```bash -$ make +```shell +make ``` To build all but a few of the available utilities: -```bash -$ make SKIP_UTILS='UTILITY_1 UTILITY_2' +```shell +make SKIP_UTILS='UTILITY_1 UTILITY_2' ``` To build only a few of the available utilities: -```bash -$ make UTILS='UTILITY_1 UTILITY_2' +```shell +make UTILS='UTILITY_1 UTILITY_2' ``` ## Installation -### Cargo +### Install with Cargo Likewise, installing can simply be done using: -```bash -$ cargo install --path . +```shell +cargo install --path . ``` This command will install uutils into Cargo's *bin* folder (*e.g.* `$HOME/.cargo/bin`). -This does not install files necessary for shell completion. For shell completion to work, -use `GNU Make` or see `Manually install shell completions`. +This does not install files necessary for shell completion or manpages. +For manpages or shell completion to work, use `GNU Make` or see `Manually install shell completions`/`Manually install manpages`. -### GNU Make +### Install with GNU Make To install all available utilities: -```bash -$ make install +```shell +make install ``` To install using `sudo` switch `-E` must be used: -```bash -$ sudo -E make install +```shell +sudo -E make install ``` To install all but a few of the available utilities: -```bash -$ make SKIP_UTILS='UTILITY_1 UTILITY_2' install +```shell +make SKIP_UTILS='UTILITY_1 UTILITY_2' install ``` To install only a few of the available utilities: -```bash -$ make UTILS='UTILITY_1 UTILITY_2' install +```shell +make UTILS='UTILITY_1 UTILITY_2' install ``` To install every program with a prefix (e.g. uu-echo uu-cat): -```bash -$ make PROG_PREFIX=PREFIX_GOES_HERE install +```shell +make PROG_PREFIX=PREFIX_GOES_HERE install ``` To install the multicall binary: -```bash -$ make MULTICALL=y install +```shell +make MULTICALL=y install ``` Set install parent directory (default value is /usr/local): -```bash +```shell # DESTDIR is also supported -$ make PREFIX=/my/path install +make PREFIX=/my/path install ``` Installing with `make` installs shell completions for all installed utilities @@ -203,123 +205,139 @@ The `coreutils` binary can generate completions for the `bash`, `elvish`, `fish` and `zsh` shells. It prints the result to stdout. The syntax is: -```bash + +```shell cargo run completion ``` So, to install completions for `ls` on `bash` to `/usr/local/share/bash-completion/completions/ls`, run: -```bash +```shell cargo run completion ls bash > /usr/local/share/bash-completion/completions/ls ``` +### Manually install manpages + +To generate manpages, the syntax is: +```bash +cargo run manpage +``` + +So, to install the manpage for `ls` to `/usr/local/share/man/man1/ls.1` +run: + +```bash +cargo run manpage ls > /usr/local/share/man/man1/ls.1 +``` + ## Un-installation Un-installation differs depending on how you have installed uutils. If you used Cargo to install, use Cargo to uninstall. If you used GNU Make to install, use Make to uninstall. -### Cargo +### Uninstall with Cargo To uninstall uutils: -```bash -$ cargo uninstall uutils +```shell +cargo uninstall uutils ``` -### GNU Make +### Uninstall with GNU Make To uninstall all utilities: -```bash -$ make uninstall +```shell +make uninstall ``` To uninstall every program with a set prefix: -```bash -$ make PROG_PREFIX=PREFIX_GOES_HERE uninstall +```shell +make PROG_PREFIX=PREFIX_GOES_HERE uninstall ``` To uninstall the multicall binary: -```bash -$ make MULTICALL=y uninstall +```shell +make MULTICALL=y uninstall ``` To uninstall from a custom parent directory: -```bash +```shell # DESTDIR is also supported -$ make PREFIX=/my/path uninstall +make PREFIX=/my/path uninstall ``` + ## Testing Testing can be done using either Cargo or `make`. -### Cargo +### Testing with Cargo Just like with building, we follow the standard procedure for testing using Cargo: -```bash -$ cargo test +```shell +cargo test ``` By default, `cargo test` only runs the common programs. To run also platform specific tests, run: -```bash -$ cargo test --features unix +```shell +cargo test --features unix ``` If you would prefer to test a select few utilities: -```bash -$ cargo test --features "chmod mv tail" --no-default-features +```shell +cargo test --features "chmod mv tail" --no-default-features ``` If you also want to test the core utilities: -```bash -$ cargo test -p uucore -p coreutils +```shell +cargo test -p uucore -p coreutils ``` To debug: -```bash -$ gdb --args target/debug/coreutils ls +```shell +gdb --args target/debug/coreutils ls (gdb) b ls.rs:79 (gdb) run ``` -### GNU Make +### Testing with GNU Make To simply test all available utilities: -```bash -$ make test +```shell +make test ``` To test all but a few of the available utilities: -```bash -$ make SKIP_UTILS='UTILITY_1 UTILITY_2' test +```shell +make SKIP_UTILS='UTILITY_1 UTILITY_2' test ``` To test only a few of the available utilities: -```bash -$ make UTILS='UTILITY_1 UTILITY_2' test +```shell +make UTILS='UTILITY_1 UTILITY_2' test ``` To include tests for unimplemented behavior: -```bash -$ make UTILS='UTILITY_1 UTILITY_2' SPEC=y test +```shell +make UTILS='UTILITY_1 UTILITY_2' SPEC=y test ``` ### Run Busybox Tests @@ -329,20 +347,20 @@ requires `make`. To run busybox tests for all utilities for which busybox has tests -```bash -$ make busytest +```shell +make busytest ``` To run busybox tests for a few of the available utilities -```bash -$ make UTILS='UTILITY_1 UTILITY_2' busytest +```shell +make UTILS='UTILITY_1 UTILITY_2' busytest ``` To pass an argument like "-v" to the busybox test runtime -```bash -$ make UTILS='UTILITY_1 UTILITY_2' RUNTEST_ARGS='-v' busytest +```shell +make UTILS='UTILITY_1 UTILITY_2' RUNTEST_ARGS='-v' busytest ``` ### Comparing with GNU @@ -355,15 +373,15 @@ breakdown of the GNU test results of the main branch can be found To run locally: -```bash -$ bash util/build-gnu.sh -$ bash util/run-gnu-test.sh +```shell +bash util/build-gnu.sh +bash util/run-gnu-test.sh # To run a single test: -$ bash util/run-gnu-test.sh tests/touch/not-owner.sh # for example +bash util/run-gnu-test.sh tests/touch/not-owner.sh # for example # To run several tests: -$ bash util/run-gnu-test.sh tests/touch/not-owner.sh tests/rm/no-give-up.sh # for example +bash util/run-gnu-test.sh tests/touch/not-owner.sh tests/rm/no-give-up.sh # for example # If this is a perl (.pl) test, to run in debug: -$ DEBUG=1 bash util/run-gnu-test.sh tests/misc/sm3sum.pl +DEBUG=1 bash util/run-gnu-test.sh tests/misc/sm3sum.pl ``` Note that it relies on individual utilities (not the multicall binary). @@ -387,7 +405,6 @@ To improve the GNU compatibility, the following process is recommended: 1. Start to modify the Rust implementation to match the expected behavior 1. Add a test to make sure that we don't regress (our test suite is super quick) - ## Contributing To contribute to uutils, please see [CONTRIBUTING](CONTRIBUTING.md). @@ -395,11 +412,12 @@ To contribute to uutils, please see [CONTRIBUTING](CONTRIBUTING.md). ## Utilities Please note that this is not fully accurate: -* Some new options can be added / removed in the GNU implementation; -* Some error management might be missing; -* Some behaviors might be different. -See https://github.com/uutils/coreutils/issues/3336 for the main meta bugs +- Some new options can be added / removed in the GNU implementation; +- Some error management might be missing; +- Some behaviors might be different. + +See for the main meta bugs (many are missing). | Done | WIP | diff --git a/deny.toml b/deny.toml index 20995c936..aa05cdf3e 100644 --- a/deny.toml +++ b/deny.toml @@ -58,12 +58,24 @@ highlight = "all" # For each duplicate dependency, indicate the name of the dependency which # introduces it. # spell-checker: disable -skip = [] +skip = [ + # is-terminal + { name = "hermit-abi", version = "0.3.1" }, + # is-terminal + { name = "rustix", version = "0.36.8" }, + # is-terminal (via rustix) + { name = "io-lifetimes", version = "1.0.5" }, + # is-terminal + { name = "linux-raw-sys", version = "0.1.4" }, + # is-terminal + { name = "windows-sys", version = "0.45.0" }, +] # spell-checker: enable # This section is considered when running `cargo deny check sources`. # More documentation about the 'sources' section can be found here: # https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html + [sources] unknown-registry = "warn" unknown-git = "warn" diff --git a/docs/src/build.md b/docs/src/build.md index 6505b5b6e..e35b0ebe8 100644 --- a/docs/src/build.md +++ b/docs/src/build.md @@ -1,3 +1,3 @@ # Build from source -{{#include ../../README.md:build }} \ No newline at end of file +{{#include ../../README.md:build }} diff --git a/docs/src/contributing.md b/docs/src/contributing.md index 79ef4d13b..f69e1b377 100644 --- a/docs/src/contributing.md +++ b/docs/src/contributing.md @@ -1 +1,3 @@ -{{ #include ../../CONTRIBUTING.md }} \ No newline at end of file + + +{{ #include ../../CONTRIBUTING.md }} diff --git a/docs/src/index.md b/docs/src/index.md index 7bac8b816..0212b7526 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -1,5 +1,9 @@ + + {{#include logo.svg}} + +