Merge branch 'main' into fix-doc-hashs

This commit is contained in:
Sylvestre Ledru
2025-12-29 13:44:14 +01:00
committed by GitHub
221 changed files with 8410 additions and 2232 deletions
+5
View File
@@ -2,3 +2,8 @@ CONFIG_FEATURE_FANCY_HEAD=y
CONFIG_UNICODE_SUPPORT=y
CONFIG_DESKTOP=y
CONFIG_LONG_OPTS=y
CONFIG_FEATURE_SORT_BIG=y
CONFIG_FEATURE_CATV=y
CONFIG_FEATURE_CATN=y
CONFIG_FEATURE_TR_CLASSES=y
CONFIG_FEATURE_READLINK_FOLLOW=y
+1
View File
@@ -17,6 +17,7 @@ RUN apt-get update \
libcap-dev \
libexpect-perl \
libselinux1-dev \
libsystemd-dev \
python3-pyinotify \
quilt \
texinfo \
+26 -24
View File
@@ -149,7 +149,7 @@ 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@v21
- uses: DavidAnson/markdownlint-cli2-action@v22
with:
fix: "true"
globs: |
@@ -300,22 +300,22 @@ jobs:
run: make nextest PROFILE=ci CARGOFLAGS="--hide-progress-bar"
env:
RUST_BACKTRACE: "1"
- name: "`make install PROFILE=release-fast COMPLETIONS=n MANPAGES=n LOCALES=n`"
- name: "`make install PROG_PREFIX=uu- PROFILE=release-fast COMPLETIONS=n MANPAGES=n LOCALES=n`"
shell: bash
run: |
set -x
DESTDIR=/tmp/ make PROFILE=release-fast COMPLETIONS=n MANPAGES=n LOCALES=n install
DESTDIR=/tmp/ make install PROG_PREFIX=uu- PROFILE=release-fast COMPLETIONS=n MANPAGES=n LOCALES=n
# Check that utils are built with given profile
./target/release-fast/true
# Check that the utils are present
test -f /tmp/usr/local/bin/tty
# Check that the progs have prefix
test -f /tmp/usr/local/bin/uu-tty
test -f /tmp/usr/local/libexec/uu-coreutils/libstdbuf.*
# Check that the manpage is not present
! test -f /tmp/usr/local/share/man/man1/whoami.1
! test -f /tmp/usr/local/share/man/man1/uu-whoami.1
# Check that the completion is not present
! test -f /tmp/usr/local/share/zsh/site-functions/_install
! test -f /tmp/usr/local/share/bash-completion/completions/head.bash
! test -f /tmp/usr/local/share/fish/vendor_completions.d/cat.fish
! test -f /tmp/usr/local/share/zsh/site-functions/_uu-install
! test -f /tmp/usr/local/share/bash-completion/completions/uu-head.bash
! test -f /tmp/usr/local/share/fish/vendor_completions.d/uu-cat.fish
env:
RUST_BACKTRACE: "1"
- name: "`make install`"
@@ -502,14 +502,14 @@ jobs:
--arg multisize "$SIZE_MULTI" \
'{($date): { sha: $sha, size: $size, multisize: $multisize, }}' > size-result.json
- name: Download the previous individual size result
uses: dawidd6/action-download-artifact@v11
uses: dawidd6/action-download-artifact@v12
with:
workflow: CICD.yml
name: individual-size-result
repo: uutils/coreutils
path: dl
- name: Download the previous size result
uses: dawidd6/action-download-artifact@v11
uses: dawidd6/action-download-artifact@v12
with:
workflow: CICD.yml
name: size-result
@@ -546,12 +546,12 @@ jobs:
previous_multisize=$(cat dl/size-result.json | jq -r '.[] | .multisize')
check 'multicall binary' "$multisize" "$previous_multisize" 'size-result.json'
- name: Upload the individual size result
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: individual-size-result
path: individual-size-result.json
- name: Upload the size result
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: size-result
path: size-result.json
@@ -585,7 +585,7 @@ jobs:
- { os: ubuntu-latest , target: x86_64-unknown-redox , features: feat_os_unix_redox , use-cross: redoxer , skip-tests: true }
- { os: ubuntu-latest , target: wasm32-unknown-unknown , default-features: false, features: uucore/format, skip-tests: true, skip-package: true, skip-publish: true }
- { os: macos-latest , target: aarch64-apple-darwin , features: feat_os_macos, workspace-tests: true } # M1 CPU
# PR #7964: Mac should still build even if the feature is not enabled. Do not publish this.
# PR #7964: Mac should still build even if the feature is not enabled. Do not publish this.
- { os: macos-latest , target: aarch64-apple-darwin , workspace-tests: true, skip-publish: true } # M1 CPU
- { os: macos-latest , target: x86_64-apple-darwin , features: feat_os_macos, workspace-tests: true }
- { os: windows-latest , target: i686-pc-windows-msvc , features: feat_os_windows }
@@ -820,7 +820,7 @@ jobs:
env:
RUST_BACKTRACE: "1"
- name: Archive executable artifacts
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: ${{ env.PROJECT_NAME }}-${{ matrix.job.target }}${{ steps.vars.outputs.ARTIFACTS_SUFFIX }}
path: target/${{ matrix.job.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}
@@ -920,17 +920,17 @@ jobs:
HASH=$(sha1sum '${{ steps.vars.outputs.TEST_SUMMARY_FILE }}' | cut --delim=" " -f 1)
echo "HASH=${HASH}" >> $GITHUB_OUTPUT
- name: Reserve SHA1/ID of 'test-summary'
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: "${{ steps.summary.outputs.HASH }}"
path: "${{ steps.vars.outputs.TEST_SUMMARY_FILE }}"
- name: Reserve test results summary
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: busybox-test-summary
path: "${{ steps.vars.outputs.TEST_SUMMARY_FILE }}"
- name: Upload json results
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: busybox-result.json
path: ${{ steps.vars.outputs.TEST_SUMMARY_FILE }}
@@ -1013,17 +1013,17 @@ jobs:
HASH=$(sha1sum '${{ steps.vars.outputs.TEST_SUMMARY_FILE }}' | cut --delim=" " -f 1)
echo "HASH=${HASH}" >> $GITHUB_OUTPUT
- name: Reserve SHA1/ID of 'test-summary'
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: "${{ steps.summary.outputs.HASH }}"
path: "${{ steps.vars.outputs.TEST_SUMMARY_FILE }}"
- name: Reserve test results summary
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: toybox-test-summary
path: "${{ steps.vars.outputs.TEST_SUMMARY_FILE }}"
- name: Upload json results
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: toybox-result.json
path: ${{ steps.vars.outputs.TEST_SUMMARY_FILE }}
@@ -1099,7 +1099,9 @@ jobs:
case '${{ matrix.job.os }}' in
ubuntu-latest)
sudo apt-get -y update ; sudo apt-get -y install libselinux1-dev
# selinux and systemd headers needed to build tests
sudo apt-get -y update
sudo apt-get -y install libselinux1-dev libsystemd-dev
# pinky is a tool to show logged-in users from utmp, and gecos fields from /etc/passwd.
# In GitHub Action *nix VMs, no accounts log in, even the "runner" account that runs the commands, and "system boot" entry is missing.
# The account also has empty gecos fields.
@@ -1213,7 +1215,7 @@ jobs:
uses: lima-vm/lima-actions/setup@v1
id: lima-actions-setup
- name: Cache ~/.cache/lima
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ~/.cache/lima
key: lima-${{ steps.lima-actions-setup.outputs.version }}
+132 -67
View File
@@ -2,10 +2,11 @@ name: GnuTests
# spell-checker:ignore (abbrev/names) CodeCov gnulib GnuTests Swatinem
# spell-checker:ignore (jargon) submodules devel
# spell-checker:ignore (libs/utils) autopoint chksum getenforce gperf lcov libexpect limactl pyinotify setenforce shopt texinfo valgrind libattr libcap taiki-e
# spell-checker:ignore (libs/utils) autopoint chksum dpkg getenforce getlimits gperf lcov libexpect limactl pyinotify setenforce shopt texinfo valgrind libattr libcap taiki-e zstd cpio
# spell-checker:ignore (options) Ccodegen Coverflow Cpanic Zpanic
# spell-checker:ignore (people) Dawid Dziurla * dawidd dtolnay
# spell-checker:ignore (vars) FILESET SUBDIRS XPASS
# spell-checker:ignore userns
# * note: to run a single test => `REPO/util/run-gnu-test.sh PATH/TO/TEST/SCRIPT`
@@ -27,8 +28,10 @@ env:
DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
TEST_FULL_SUMMARY_FILE: 'gnu-full-result.json'
TEST_ROOT_FULL_SUMMARY_FILE: 'gnu-root-full-result.json'
TEST_STTY_FULL_SUMMARY_FILE: 'gnu-stty-full-result.json'
TEST_SELINUX_FULL_SUMMARY_FILE: 'selinux-gnu-full-result.json'
TEST_SELINUX_ROOT_FULL_SUMMARY_FILE: 'selinux-root-gnu-full-result.json'
TEST_SMACK_FULL_SUMMARY_FILE: 'smack-gnu-full-result.json'
jobs:
native:
@@ -41,16 +44,6 @@ jobs:
with:
path: 'uutils'
persist-credentials: false
- name: Extract GNU version from build-gnu.sh
id: gnu-version
run: |
GNU_VERSION=$(grep '^release_tag_GNU=' uutils/util/build-gnu.sh | cut -d'"' -f2)
if [ -z "$GNU_VERSION" ]; then
echo "Error: Failed to extract GNU version from build-gnu.sh"
exit 1
fi
echo "REPO_GNU_REF=${GNU_VERSION}" >> $GITHUB_ENV
echo "Extracted GNU version: ${GNU_VERSION}"
- uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
@@ -59,20 +52,15 @@ jobs:
with:
workspaces: "./uutils -> target"
- name: Checkout code (GNU coreutils)
uses: actions/checkout@v6
run: (mkdir -p gnu && cd gnu && bash ../uutils/util/fetch-gnu.sh)
- name: Restore files for faster configure and skipping make
uses: actions/cache@v5
id: cache-config-gnu
with:
repository: 'coreutils/coreutils'
path: 'gnu'
ref: ${{ env.REPO_GNU_REF }}
submodules: false
persist-credentials: false
- name: Override submodule URL and initialize submodules
# Use github instead of upstream git server
run: |
git submodule sync --recursive
git config submodule.gnulib.url https://github.com/coreutils/gnulib.git
git submodule update --init --recursive --depth 1
working-directory: gnu
path: |
gnu/config.cache
gnu/src/getlimits
key: ${{ runner.os }}-gnu-config-${{ hashFiles('gnu/NEWS') }}-${{ hashFiles('uutils/util/build-gnu.sh') }} # use build-gnu.sh for extremely safe caching
#### Build environment setup
- name: Install dependencies
@@ -82,6 +70,8 @@ jobs:
sudo apt-get update
## Check that build-gnu.sh works on the non SELinux system by installing libselinux only on lima
sudo apt-get install -y autopoint gperf gdb python3-pyinotify valgrind libexpect-perl libacl1-dev libattr1-dev libcap-dev attr quilt
curl http://launchpadlibrarian.net/831710181/automake_1.18.1-3_all.deb > automake-1.18.deb
sudo dpkg -i --force-depends automake-1.18.deb
- name: Add various locales
shell: bash
run: |
@@ -102,6 +92,7 @@ jobs:
sudo locale-gen --keep-existing fa_IR.UTF-8 # Iran
sudo locale-gen --keep-existing am_ET.UTF-8 # Ethiopia
sudo locale-gen --keep-existing th_TH.UTF-8 # Thailand
sudo locale-gen --keep-existing zh_CN.GB18030 # China
sudo update-locale
echo "After:"
@@ -114,11 +105,23 @@ jobs:
## Build binaries
cd 'uutils'
env PROFILE=release-small bash util/build-gnu.sh
- name: Save files for faster configure and skipping make
uses: actions/cache/save@v5
if: always() && steps.cache-config-gnu.outputs.cache-hit != 'true'
with:
path: |
gnu/config.cache
gnu/src/getlimits
key: ${{ runner.os }}-gnu-config-${{ hashFiles('gnu/NEWS') }}-${{ hashFiles('uutils/util/build-gnu.sh') }}
### Run tests as user
- name: Run GNU tests
shell: bash
run: |
## Use unshare
sudo sysctl -w kernel.unprivileged_userns_clone=1
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
## Run GNU tests
path_GNU='gnu'
path_UUTILS='uutils'
@@ -137,30 +140,58 @@ jobs:
path_GNU='gnu'
path_UUTILS='uutils'
bash "uutils/util/run-gnu-test.sh" run-root
- name: Extract testing info from individual logs (run as root) into JSON
shell: bash
run : |
path_UUTILS='uutils'
python uutils/util/gnu-json-result.py gnu/tests > ${{ env.TEST_ROOT_FULL_SUMMARY_FILE }}
### This shell has been changed from "bash" to this command
### "script" will start a pty and the -q command removes the "script" initiation log
### the -e flag makes it propagate the error code and -c runs the command in a pty
### the primary purpose of this change is to run the tty GNU tests
### The reason its separated from the rest of the tests is because one test can corrupt the other
### tests through the use of the shared terminal and it changes the environment that the other
### tests are run in, which can cause different results.
- name: Run GNU stty tests
shell: 'script -q -e -c "bash {0}"'
run: |
## Run GNU root tests
path_GNU='gnu'
path_UUTILS='uutils'
bash "uutils/util/run-gnu-test.sh" run-tty
- name: Extract testing info from individual logs (stty) into JSON
shell: bash
run : |
path_UUTILS='uutils'
python uutils/util/gnu-json-result.py gnu/tests > ${{ env.TEST_STTY_FULL_SUMMARY_FILE }}
### Upload artifacts
- name: Upload full json results
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: gnu-full-result
path: ${{ env.TEST_FULL_SUMMARY_FILE }}
- name: Upload root json results
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: gnu-root-full-result
path: ${{ env.TEST_ROOT_FULL_SUMMARY_FILE }}
- name: Upload stty json results
uses: actions/upload-artifact@v6
with:
name: gnu-stty-full-result
path: ${{ env.TEST_STTY_FULL_SUMMARY_FILE }}
- name: Compress test logs
shell: bash
run : |
# Compress logs before upload (fails otherwise)
gzip gnu/tests/*/*.log
- name: Upload test logs
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: test-logs
path: |
@@ -177,16 +208,6 @@ jobs:
with:
path: 'uutils'
persist-credentials: false
- name: Extract GNU version from build-gnu.sh
id: gnu-version-selinux
run: |
GNU_VERSION=$(grep '^release_tag_GNU=' uutils/util/build-gnu.sh | cut -d'"' -f2)
if [ -z "$GNU_VERSION" ]; then
echo "Error: Failed to extract GNU version from build-gnu.sh"
exit 1
fi
echo "REPO_GNU_REF=${GNU_VERSION}" >> $GITHUB_ENV
echo "Extracted GNU version: ${GNU_VERSION}"
- uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
@@ -195,27 +216,14 @@ jobs:
with:
workspaces: "./uutils -> target"
- name: Checkout code (GNU coreutils)
uses: actions/checkout@v6
with:
repository: 'coreutils/coreutils'
path: 'gnu'
ref: ${{ env.REPO_GNU_REF }}
submodules: false
persist-credentials: false
- name: Override submodule URL and initialize submodules
# Use github instead of upstream git server
run: |
git submodule sync --recursive
git config submodule.gnulib.url https://github.com/coreutils/gnulib.git
git submodule update --init --recursive --depth 1
working-directory: gnu
run: (mkdir -p gnu && cd gnu && bash ../uutils/util/fetch-gnu.sh)
#### Lima build environment setup
- name: Setup Lima
uses: lima-vm/lima-actions/setup@v1
id: lima-actions-setup
- name: Cache ~/.cache/lima
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ~/.cache/lima
key: lima-${{ steps.lima-actions-setup.outputs.version }}
@@ -289,12 +297,12 @@ jobs:
# Copy the test directory now
rsync -v -a -e ssh lima-default:~/work/gnu/tests/ ./gnu/tests-selinux/
- name: Upload SELinux json results
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: selinux-gnu-full-result
path: ${{ env.TEST_SELINUX_FULL_SUMMARY_FILE }}
- name: Upload SELinux root json results
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: selinux-root-gnu-full-result
path: ${{ env.TEST_SELINUX_ROOT_FULL_SUMMARY_FILE }}
@@ -304,15 +312,59 @@ jobs:
# Compress logs before upload (fails otherwise)
gzip gnu/tests-selinux/*/*.log
- name: Upload SELinux test logs
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: selinux-test-logs
path: |
gnu/tests-selinux/*.log
gnu/tests-selinux/*/*.log.gz
smack:
name: Run GNU tests (SMACK)
runs-on: ubuntu-24.04
steps:
- name: Checkout code (uutils)
uses: actions/checkout@v6
with:
path: 'uutils'
persist-credentials: false
- uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
components: rustfmt
- uses: Swatinem/rust-cache@v2
with:
workspaces: "./uutils -> target"
- name: Checkout code (GNU coreutils)
run: (mkdir -p gnu && cd gnu && bash ../uutils/util/fetch-gnu.sh)
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y qemu-system-x86 zstd cpio
- name: Run GNU SMACK tests
run: |
cd uutils
bash util/run-gnu-tests-smack-ci.sh "$GITHUB_WORKSPACE/gnu" "$GITHUB_WORKSPACE/gnu/tests-smack"
- name: Extract testing info into JSON
run: |
python3 uutils/util/gnu-json-result.py gnu/tests-smack > ${{ env.TEST_SMACK_FULL_SUMMARY_FILE }}
- name: Upload SMACK json results
uses: actions/upload-artifact@v6
with:
name: smack-gnu-full-result
path: ${{ env.TEST_SMACK_FULL_SUMMARY_FILE }}
- name: Compress SMACK test logs
run: gzip gnu/tests-smack/*/*.log 2>/dev/null || true
- name: Upload SMACK test logs
uses: actions/upload-artifact@v6
with:
name: smack-test-logs
path: |
gnu/tests-smack/*.log
gnu/tests-smack/*/*.log.gz
aggregate:
needs: [native, selinux]
needs: [native, selinux, smack]
permissions:
actions: read # for dawidd6/action-download-artifact to query and download artifacts
contents: read # for actions/checkout to fetch code
@@ -337,7 +389,7 @@ jobs:
path: 'uutils'
persist-credentials: false
- name: Retrieve reference artifacts
uses: dawidd6/action-download-artifact@v11
uses: dawidd6/action-download-artifact@v12
# ref: <https://github.com/dawidd6/action-download-artifact>
continue-on-error: true ## don't break the build for missing reference artifacts (may be expired or just not generated yet)
with:
@@ -347,29 +399,42 @@ jobs:
workflow_conclusion: completed ## continually recalibrates to last commit of default branch with a successful GnuTests (ie, "self-heals" from GnuTest regressions, but needs more supervision for/of regressions)
path: "reference"
- name: Download full json results
uses: actions/download-artifact@v6
uses: actions/download-artifact@v7
with:
name: gnu-full-result
path: results
merge-multiple: true
- name: Download root json results
uses: actions/download-artifact@v6
uses: actions/download-artifact@v7
with:
name: gnu-root-full-result
path: results
merge-multiple: true
- name: Download stty json results
uses: actions/download-artifact@v7
with:
name: gnu-stty-full-result
path: results
merge-multiple: true
- name: Download selinux json results
uses: actions/download-artifact@v6
uses: actions/download-artifact@v7
with:
name: selinux-gnu-full-result
path: results
merge-multiple: true
- name: Download selinux root json results
uses: actions/download-artifact@v6
uses: actions/download-artifact@v7
with:
name: selinux-root-gnu-full-result
path: results
merge-multiple: true
- name: Download smack json results
uses: actions/download-artifact@v7
with:
name: smack-gnu-full-result
path: results
merge-multiple: true
- name: Extract/summarize testing info
id: summary
shell: bash
@@ -380,8 +445,8 @@ jobs:
path_UUTILS='uutils'
json_count=$(ls -l results/*.json | wc -l)
if [[ "$json_count" -ne 4 ]]; then
echo "::error ::Failed to download all results json files (expected 4 files, found $json_count); failing early"
if [[ "$json_count" -ne 6 ]]; then
echo "::error ::Failed to download all results json files (expected 6 files, found $json_count); failing early"
ls -lR results || true
exit 1
fi
@@ -414,17 +479,17 @@ jobs:
HASH=$(sha1sum '${{ steps.vars.outputs.TEST_SUMMARY_FILE }}' | cut --delim=" " -f 1)
outputs HASH
- name: Upload SHA1/ID of 'test-summary'
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: "${{ steps.summary.outputs.HASH }}"
path: "${{ steps.vars.outputs.TEST_SUMMARY_FILE }}"
- name: Upload test results summary
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: test-summary
path: "${{ steps.vars.outputs.TEST_SUMMARY_FILE }}"
- name: Upload aggregated json results
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: aggregated-result
path: ${{ steps.vars.outputs.AGGREGATED_SUMMARY_FILE }}
@@ -476,7 +541,7 @@ jobs:
fi
- name: Upload comparison log (for GnuComment workflow)
if: success() || failure() # run regardless of prior step success/failure
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: comment
path: reference/comment/
+5 -5
View File
@@ -85,7 +85,7 @@ jobs:
free -mh
df -Th
- name: Restore AVD cache
uses: actions/cache/restore@v4
uses: actions/cache/restore@v5
id: avd-cache
continue-on-error: true
with:
@@ -127,7 +127,7 @@ jobs:
util/android-commands.sh init "${{ matrix.arch }}" "${{ matrix.api-level }}" "${{ env.TERMUX }}"
- name: Save AVD cache
if: steps.avd-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
uses: actions/cache/save@v5
with:
path: |
~/.android/avd/*
@@ -143,7 +143,7 @@ jobs:
trim: true
- name: Restore rust cache
id: rust-cache
uses: actions/cache/restore@v4
uses: actions/cache/restore@v5
with:
path: ~/__rust_cache__
# The version vX at the end of the key is just a development version to avoid conflicts in
@@ -184,13 +184,13 @@ jobs:
df -Th
- name: Save rust cache
if: steps.rust-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
uses: actions/cache/save@v5
with:
path: ~/__rust_cache__
key: ${{ matrix.arch }}_${{ matrix.target}}_${{ steps.read_rustc_hash.outputs.content }}_${{ hashFiles('**/Cargo.toml', '**/Cargo.lock') }}_v3
- name: archive any output (error screenshots)
if: always()
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: test_output_${{ env.AVD_CACHE_KEY }}
path: output
-6
View File
@@ -50,12 +50,6 @@ jobs:
with:
persist-credentials: false
- name: Install system dependencies
shell: bash
run: |
sudo apt-get -y update
sudo apt-get -y install libselinux1-dev
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
+1 -1
View File
@@ -255,7 +255,7 @@ jobs:
run: npm install -g cspell
- name: Cache pre-commit environments
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ~/.cache/pre-commit
key: pre-commit-${{ runner.os }}-${{ hashFiles('.pre-commit-config.yaml') }}
+1 -1
View File
@@ -34,7 +34,7 @@ jobs:
uses: dtolnay/rust-toolchain@stable
- name: Download tldr
run: curl https://tldr.sh/assets/tldr.zip -o docs/tldr.zip
run: curl -L https://github.com/tldr-pages/tldr/releases/latest/download/tldr.zip -o docs/tldr.zip
- name: Generate documentation
run: cargo run --bin uudoc --all-features
+6 -7
View File
@@ -79,8 +79,7 @@ jobs:
matrix:
test-target:
- { name: fuzz_test, should_pass: true }
# https://github.com/uutils/coreutils/issues/5311
- { name: fuzz_date, should_pass: false }
- { name: fuzz_date, should_pass: true }
- { name: fuzz_expr, should_pass: true }
- { name: fuzz_printf, should_pass: true }
- { name: fuzz_echo, should_pass: true }
@@ -110,7 +109,7 @@ jobs:
shared-key: "cargo-fuzz-cache-key"
cache-directories: "fuzz/target"
- name: Restore Cached Corpus
uses: actions/cache/restore@v4
uses: actions/cache/restore@v5
with:
key: corpus-cache-${{ matrix.test-target.name }}
path: |
@@ -192,13 +191,13 @@ jobs:
echo "" >> $GITHUB_STEP_SUMMARY
- name: Save Corpus Cache
uses: actions/cache/save@v4
uses: actions/cache/save@v5
with:
key: corpus-cache-${{ matrix.test-target.name }}
path: |
fuzz/corpus/${{ matrix.test-target.name }}
- name: Upload Stats
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: fuzz-stats-${{ matrix.test-target.name }}
path: |
@@ -215,7 +214,7 @@ jobs:
with:
persist-credentials: false
- name: Download all stats
uses: actions/download-artifact@v6
uses: actions/download-artifact@v7
with:
path: fuzz/stats-artifacts
pattern: fuzz-stats-*
@@ -309,7 +308,7 @@ jobs:
run: |
cat fuzzing_summary.md
- name: Upload Summary
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: fuzzing-summary
path: fuzzing_summary.md
+26 -4
View File
@@ -44,7 +44,14 @@ jobs:
# We need jq and GNU coreutils to run show-utils.sh and bash to use inline shell string replacement
# Use sudo-- to get the default sudo package without ambiguity
# Install rust and cargo from OpenBSD packages
prepare: pkg_add curl sudo-- jq coreutils bash rust rust-clippy rust-rustfmt llvm--
prepare: |
# Clean up disk space before installing packages
df -h
rm -rf /usr/share/doc/* /usr/share/man/* /var/cache/* /tmp/* || true
pkg_add curl sudo-- jq coreutils bash rust rust-clippy rust-rustfmt llvm--
# Clean up package cache after installation
pkg_delete -a || true
df -h
run: |
## Prepare, build, and test
# implementation modelled after ref: <https://github.com/rust-lang/rustup/pull/2783>
@@ -106,8 +113,10 @@ jobs:
# * convert any warnings to GHA UI annotations; ref: <https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-a-warning-message>
S=\$(cargo clippy --all-targets \${CARGO_UTILITY_LIST_OPTIONS} -- -D warnings 2>&1) && printf "%s\n" "\$S" || { printf "%s\n" "\$S" ; printf "%s" "\$S" | sed -E -n -e '/^error:/{' -e "N; s/^error:[[:space:]]+(.*)\\n[[:space:]]+-->[[:space:]]+(.*):([0-9]+):([0-9]+).*\$/::\${FAULT_TYPE} file=\2,line=\3,col=\4::\${FAULT_PREFIX}: \\\`cargo clippy\\\`: \1 (file:'\2', line:\3)/p;" -e '}' ; FAULT=true ; }
fi
# Clean to avoid to rsync back the files
# Clean to avoid to rsync back the files and free up disk space
cargo clean
# Additional cleanup to free disk space
rm -rf ~/.cargo/registry/cache ~/.cargo/git/db || true
if [ -n "\${FAIL_ON_FAULT}" ] && [ -n "\${FAULT}" ]; then exit 1 ; fi
EOF
@@ -132,7 +141,14 @@ jobs:
copyback: false
mem: 4096
# Install rust and build dependencies from OpenBSD packages (llvm provides libclang for bindgen)
prepare: pkg_add curl gmake sudo-- jq rust llvm--
prepare: |
# Clean up disk space before installing packages
df -h
rm -rf /usr/share/doc/* /usr/share/man/* /var/cache/* /tmp/* || true
pkg_add curl gmake sudo-- jq rust llvm--
# Clean up package cache after installation
pkg_delete -a || true
df -h
run: |
## Prepare, build, and test
# implementation modelled after ref: <https://github.com/rust-lang/rustup/pull/2783>
@@ -181,9 +197,13 @@ jobs:
cd "${WORKSPACE}"
unset FAULT
cargo build || FAULT=1
# Clean build artifacts to save disk space before testing
rm -rf target/debug/build target/debug/incremental || true
export PATH=~/.cargo/bin:${PATH}
export RUST_BACKTRACE=1
export CARGO_TERM_COLOR=always
# Avoid filling disk space
export RUSTFLAGS="-C strip=symbols"
# Use cargo test since nextest might not support OpenBSD
if (test -z "\$FAULT"); then cargo test --features '${{ matrix.job.features }}' || FAULT=1 ; fi
# There is no systemd-logind on OpenBSD, so test all features except feat_systemd_logind
@@ -193,7 +213,9 @@ jobs:
fi
# Test building with make
if (test -z "\$FAULT"); then make || FAULT=1 ; fi
# Clean to avoid to rsync back the files
# Clean to avoid to rsync back the files and free up disk space
cargo clean
# Additional cleanup to free disk space
rm -rf ~/.cargo/registry/cache ~/.cargo/git/db target/debug/deps target/release/deps || true
if (test -n "\$FAULT"); then exit 1 ; fi
EOF
@@ -3,6 +3,8 @@ aarch
AIX
ASLR # address space layout randomization
AST # abstract syntax tree
CATN # busybox cat -n feature flag
CATV # busybox cat -v feature flag
CICD # continuous integration/deployment
CPU
CPUs
+12
View File
@@ -1,4 +1,6 @@
AFAICT
asimd
ASIMD
alloc
arity
autogenerate
@@ -71,11 +73,13 @@ hardlink
hardlinks
hasher
hashsums
hwcaps
infile
iflag
iflags
kibi
kibibytes
langinfo
libacl
lcase
listxattr
@@ -96,6 +100,7 @@ nocache
nocreat
noctty
noerror
noexec
nofollow
nolinks
nonblock
@@ -129,6 +134,7 @@ semiprimes
setcap
setfacl
setfattr
setlocale
shortcode
shortcodes
siginfo
@@ -147,6 +153,8 @@ tokenize
toolchain
totalram
truthy
tunables
TUNABLES
ucase
unbuffered
udeps
@@ -163,6 +171,8 @@ xattrs
xpass
# * abbreviations
AMPM
ampm
consts
deps
dev
@@ -198,6 +208,8 @@ PCLMUL
pclmul
PCLMULQDQ
pclmulqdq
PMULL
pmull
TUNABLES
tunables
VMULL
+16
View File
@@ -364,6 +364,22 @@ getcwd
weblate
algs
# * stty terminal flags
brkint
cstopb
decctlq
echoctl
echoe
echoke
ignbrk
ignpar
icrnl
isig
istrip
litout
opost
parodd
# translation tests
CLICOLOR
erreur
+3 -1
View File
@@ -45,7 +45,8 @@ crates is as follows:
- `Cargo.toml`
- `src/main.rs`: contains only a single macro call
- `src/<util name>.rs`: the actual code for the utility
- `<util name>.md`: the documentation for the utility
- `locales/en-US.ftl`: the util's strings
- `locales/fr-FR.ftl`: French translation of the util's strings
We have separated repositories for crates that we maintain but also publish for
use by others:
@@ -86,6 +87,7 @@ are some tips for writing good issues:
- What platform are you on?
- Provide a way to reliably reproduce the issue.
- Be as specific as possible!
- Please provide the output with LANG=C, except for locale-related bugs.
### Writing Documentation
Generated
+31 -32
View File
@@ -145,9 +145,9 @@ dependencies = [
[[package]]
name = "bigdecimal"
version = "0.4.9"
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "560f42649de9fa436b73517378a147ec21f6c997a546581df4b4b31677828934"
checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695"
dependencies = [
"autocfg",
"libm",
@@ -367,9 +367,9 @@ dependencies = [
[[package]]
name = "clap_complete"
version = "4.5.61"
version = "4.5.62"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39615915e2ece2550c0149addac32fb5bd312c657f43845bb9088cb9c8a7c992"
checksum = "004eef6b14ce34759aa7de4aea3217e368f463f46a3ed3764ca4b5a4404003b4"
dependencies = [
"clap",
]
@@ -392,9 +392,9 @@ dependencies = [
[[package]]
name = "codspeed"
version = "4.1.0"
version = "4.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3b847e05a34be5c38f3f2a5052178a3bd32e6b5702f3ea775efde95c483a539"
checksum = "eb56923193c76a0e5b6b17b2c2bb1e151ef8a5e06b557e1cbe38c6db467763f9"
dependencies = [
"anyhow",
"cc",
@@ -410,9 +410,9 @@ dependencies = [
[[package]]
name = "codspeed-divan-compat"
version = "4.1.0"
version = "4.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0f0e9fe5eaa39995ec35e46407f7154346cc25bd1300c64c21636f3d00cb2cc"
checksum = "7558ff5740fbc26a5fc55c4934cfed94dfccee76abc17b57ecf5d0bee3592b5e"
dependencies = [
"clap",
"codspeed",
@@ -423,9 +423,9 @@ dependencies = [
[[package]]
name = "codspeed-divan-compat-macros"
version = "4.1.0"
version = "4.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88c8babf2a40fd2206a2e030cf020d0d58144cd56e1dc408bfba02cdefb08b4f"
checksum = "8de343ca0a4fbaabbd3422941fdee24407d00e2fa686a96021c21a78ab2bb895"
dependencies = [
"divan-macros",
"itertools 0.14.0",
@@ -437,9 +437,9 @@ dependencies = [
[[package]]
name = "codspeed-divan-compat-walltime"
version = "4.1.0"
version = "4.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f26092328e12a36704ffc552f379c6405dd94d3149970b79b22d371717c2aae"
checksum = "9d9de586cc7e9752fc232f08e0733c2016122e16065c4adf0c8a8d9e370749ee"
dependencies = [
"cfg-if",
"clap",
@@ -699,9 +699,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
[[package]]
name = "crc-fast"
version = "1.8.0"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2f7c8d397a6353ef0c1d6217ab91b3ddb5431daf57fd013f506b967dcf44458"
checksum = "2fd92aca2c6001b1bf5ba0ff84ee74ec8501b52bbef0cac80bf25a6c1d87a83d"
dependencies = [
"crc",
"digest",
@@ -1565,9 +1565,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
[[package]]
name = "jiff"
version = "0.2.16"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35"
checksum = "a87d9b8105c23642f50cbbae03d1f75d8422c5cb98ce7ee9271f7ff7505be6b8"
dependencies = [
"jiff-static",
"jiff-tzdb-platform",
@@ -1580,9 +1580,9 @@ dependencies = [
[[package]]
name = "jiff-static"
version = "0.2.16"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69"
checksum = "b787bebb543f8969132630c51fd0afab173a86c6abae56ff3b9e5e3e3f9f6e58"
dependencies = [
"proc-macro2",
"quote",
@@ -1699,9 +1699,9 @@ checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
[[package]]
name = "linux-raw-sys"
version = "0.12.0"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b83b49c75b50cb715b09d337b045481493a8ada2bb3e872f2bae71db45b27696"
checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
[[package]]
name = "litemap"
@@ -1801,14 +1801,14 @@ dependencies = [
[[package]]
name = "mio"
version = "1.0.4"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873"
dependencies = [
"libc",
"log",
"wasi 0.11.1+wasi-snapshot-preview1",
"windows-sys 0.59.0",
"windows-sys 0.61.2",
]
[[package]]
@@ -2179,9 +2179,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
version = "1.0.103"
version = "1.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0"
dependencies = [
"unicode-ident",
]
@@ -2609,9 +2609,9 @@ dependencies = [
[[package]]
name = "signal-hook-mio"
version = "0.2.4"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd"
checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc"
dependencies = [
"libc",
"mio",
@@ -3126,7 +3126,6 @@ dependencies = [
"clap",
"codspeed-divan-compat",
"fluent",
"hex",
"tempfile",
"uucore",
]
@@ -3151,7 +3150,7 @@ dependencies = [
"fluent",
"indicatif",
"libc",
"linux-raw-sys 0.12.0",
"linux-raw-sys 0.12.1",
"selinux",
"tempfile",
"thiserror 2.0.17",
@@ -3191,7 +3190,7 @@ dependencies = [
"clap",
"fluent",
"jiff",
"libc",
"nix",
"parse_datetime",
"uucore",
"windows-sys 0.61.2",
@@ -4815,9 +4814,9 @@ dependencies = [
[[package]]
name = "zip"
version = "6.0.0"
version = "7.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb2a05c7c36fde6c09b08576c9f7fb4cda705990f73b58fe011abf7dfb24168b"
checksum = "bdd8a47718a4ee5fe78e07667cd36f3de80e7c2bfe727c7074245ffc7303c037"
dependencies = [
"arbitrary",
"crc32fast",
+5 -6
View File
@@ -65,6 +65,10 @@ feat_selinux = [
"selinux",
"stat/selinux",
]
# "feat_smack" == enable support for SMACK Security Context (by using `--features feat_smack`)
# NOTE:
# * Running a uutils compiled with `feat_smack` requires a SMACK enabled Kernel at run time.
feat_smack = ["ls/smack"]
##
## feature sets
## (common/core and Tier1) feature sets
@@ -379,7 +383,7 @@ walkdir = "2.5"
winapi-util = "0.1.8"
windows-sys = { version = "0.61.0", default-features = false }
xattr = "1.3.1"
zip = { version = "6.0.0", default-features = false, features = ["deflate"] }
zip = { version = "7.0.0", default-features = false, features = ["deflate"] }
hex = "0.4.3"
md-5 = "0.10.6"
@@ -666,12 +670,7 @@ should_panic_without_expect = "allow" # 2
doc_markdown = "allow"
unused_self = "allow"
map_unwrap_or = "allow"
enum_glob_use = "allow"
ptr_cast_constness = "allow"
borrow_as_ptr = "allow"
ptr_as_ptr = "allow"
needless_raw_string_hashes = "allow"
unreadable_literal = "allow"
unnested_or_patterns = "allow"
implicit_hasher = "allow"
-2
View File
@@ -244,8 +244,6 @@ DEBUG=1 bash util/run-gnu-test.sh tests/misc/sm3sum.pl
***Tip:*** First time you run `bash util/build-gnu.sh` command, it will provide instructions on how to checkout GNU coreutils repository at the correct release tag. Please follow those instructions and when done, run `bash util/build-gnu.sh` command again.
Note that GNU test suite relies on individual utilities (not the multicall binary).
You also need to install [quilt](https://savannah.nongnu.org/projects/quilt), a tool used to manage a stack of patches for modifying GNU tests.
On FreeBSD, you need to install packages for GNU coreutils and sed (used in shell scripts instead of system commands):
+13 -9
View File
@@ -27,20 +27,20 @@ CARGO ?= cargo
CARGOFLAGS ?=
RUSTC_ARCH ?= # should be empty except for cross-build, not --target $(shell rustc --print host-tuple)
#prefix prepended to all binaries and library dir
PROG_PREFIX ?=
# Install directories
PREFIX ?= /usr/local
DESTDIR ?=
BINDIR ?= $(PREFIX)/bin
DATAROOTDIR ?= $(PREFIX)/share
LIBSTDBUF_DIR ?= $(PREFIX)/libexec/coreutils
LIBSTDBUF_DIR ?= $(PREFIX)/libexec/$(PROG_PREFIX)coreutils
# Export variable so that it is used during the build
export LIBSTDBUF_DIR
INSTALLDIR_BIN=$(DESTDIR)$(BINDIR)
#prefix to apply to coreutils binary and all tool binaries
PROG_PREFIX ?=
# This won't support any directory with spaces in its name, but you can just
# make a symlink without spaces that points to the directory.
BASEDIR ?= $(shell pwd)
@@ -62,15 +62,15 @@ TOYBOX_SRC := $(TOYBOX_ROOT)/toybox-$(TOYBOX_VER)
#------------------------------------------------------------------------
# Detect the host system.
# On Windows the environment already sets OS = Windows_NT.
# On Windows uname -s might return MINGW_NT-* or CYGWIN_NT-*.
# Otherwise let it default to the kernel name returned by uname -s
# (Linux, Darwin, FreeBSD, …).
#------------------------------------------------------------------------
OS ?= $(shell uname -s)
OS := $(shell uname -s)
# Windows does not allow symlink by default.
# Allow to override LN for AppArmor.
ifeq ($(OS),Windows_NT)
ifneq (,$(findstring _NT,$(OS)))
LN ?= ln -f
endif
LN ?= ln -sf
@@ -195,7 +195,7 @@ HASHSUM_PROGS := \
$(info Detected OS = $(OS))
ifneq ($(OS),Windows_NT)
ifeq (,$(findstring MINGW,$(OS)))
PROGS += $(UNIX_PROGS)
endif
ifeq ($(SELINUX_ENABLED),1)
@@ -450,8 +450,12 @@ install: build install-manpages install-completions install-locales
mkdir -p $(INSTALLDIR_BIN)
ifneq (,$(and $(findstring stdbuf,$(UTILS)),$(findstring feat_external_libstdbuf,$(CARGOFLAGS))))
mkdir -p $(DESTDIR)$(LIBSTDBUF_DIR)
ifneq (,$(findstring CYGWIN,$(OS)))
$(INSTALL) -m 755 $(BUILDDIR)/deps/stdbuf.dll $(DESTDIR)$(LIBSTDBUF_DIR)/libstdbuf.dll
else
$(INSTALL) -m 755 $(BUILDDIR)/deps/libstdbuf.* $(DESTDIR)$(LIBSTDBUF_DIR)/
endif
endif
ifeq (${MULTICALL}, y)
$(INSTALL) -m 755 $(BUILDDIR)/coreutils $(INSTALLDIR_BIN)/$(PROG_PREFIX)coreutils
$(foreach prog, $(filter-out coreutils, $(INSTALLEES)), \
@@ -472,7 +476,7 @@ else
endif
uninstall:
ifneq ($(OS),Windows_NT)
ifeq (,$(findstring MINGW,$(OS)))
rm -f $(DESTDIR)$(LIBSTDBUF_DIR)/libstdbuf.*
-rm -d $(DESTDIR)$(LIBSTDBUF_DIR) 2>/dev/null || true
endif
+2 -6
View File
@@ -29,12 +29,8 @@ options might be missing or different behavior might be experienced.
<div class="oranda-hide">
To install it:
```shell
cargo install coreutils
~/.cargo/bin/coreutils
```
We provide prebuilt binaries at https://github.com/uutils/coreutils/releases/latest .
It is recommended to install from main branch if you install from source.
</div>
-4
View File
@@ -190,10 +190,6 @@ Similar to the proc-ps implementation and unlike GNU/Coreutils, `uptime` provide
Just like on macOS, `base32/base64/basenc` provides `-D` to decode data.
## `shred`
The number of random passes is deterministic in both GNU and uutils. However, uutils `shred` computes the number of random passes in a simplified way, specifically `max(3, x / 10)`, which is very close but not identical to the number of random passes that GNU would do. This also satisfies an expectation that reasonable users might have, namely that the number of random passes increases monotonically with the number of passes overall; GNU `shred` violates this assumption.
## `unexpand`
GNU `unexpand` provides `--first-only` to convert only leading sequences of blanks. We support a

Some files were not shown because too many files have changed in this diff Show More